Tcp 流控制实现-如何实现

Tcp 流控制实现-如何实现,tcp,freertos,flow-control,lwip,Tcp,Freertos,Flow Control,Lwip,我使用TCP/IP(使用FreeRTOS+LwiP)发送1k数据。从文档中,我了解到TCP/IP协议在其堆栈内部有其流量控制,但此流量控制依赖于网络缓冲区。我不确定在下面描述的场景中如何处理这个问题 使用TCP/IP从wifi接收1k大小的数据(该数据速率为20Mb/s) 接收到的Wifi数据被放入一个10k大小的队列中,每个块的大小为1K 从队列中获取每个块,并以1Mb/s的较低速率发送到另一个接口 所以在这种情况下,我是否必须在来自wifi队列的数据之间手动实现流量控制?如何实现这一点?不,

我使用TCP/IP(使用FreeRTOS+LwiP)发送1k数据。从文档中,我了解到TCP/IP协议在其堆栈内部有其流量控制,但此流量控制依赖于网络缓冲区。我不确定在下面描述的场景中如何处理这个问题

  • 使用TCP/IP从wifi接收1k大小的数据(该数据速率为20Mb/s)

  • 接收到的Wifi数据被放入一个10k大小的队列中,每个块的大小为1K

  • 从队列中获取每个块,并以1Mb/s的较低速率发送到另一个接口


  • 所以在这种情况下,我是否必须在来自wifi队列的数据之间手动实现流量控制?如何实现这一点?

    不,您不必自己实现流量控制,TCP算法会在内部处理

    基本上,当从发送方接收到TCP段时,LwIP将发回一个ACK,其中包括其缓冲区中剩余的可用空间(窗口大小)。由于数据到达的速度快于您处理数据的速度,堆栈最终将发送回窗口大小为零的ACK。这会告诉发送方堆栈退出,稍后再试,它会自动执行此操作。当您开始从网络缓冲区提取更多数据时,堆栈应该重新确认它接收到的最后一个数据段,只是这次它打开窗口说它可以接收更多数据

    您希望避免的是一种被称为的行为,因为它会对您的网络利用率和性能产生严重影响。如果可以的话,试着从网络上大量读取数据。避免一次填充1字节缓冲区的紧密循环