【问题标题】:flow control implementation - how流量控制实现——如何
【发布时间】:2014-12-16 04:44:29
【问题描述】:
我正在使用 TCP/IP(使用 FreeRTOS + LwiP)发送 1k 数据。从文档中我了解到 TCP/IP 协议在其堆栈本身内部有其流量控制,但这种流量控制取决于网络缓冲区。我不确定如何在下面描述的我的场景中处理这个问题。
使用 TCP/IP 从 wifi 接收 1k 大小的数据(此数据速率为 20Mb/s)
将接收到的Wifi数据放入一个10k size10块的队列中,每个块的大小为1K
从队列中取出每个块并以较低的 1Mb/s 速率发送到另一个接口
那么在这种情况下,我是否必须在来自 wifi 队列的数据之间手动实现流量控制?我怎样才能做到这一点?
【问题讨论】:
标签:
tcp
freertos
flow-control
lwip
【解决方案1】:
不,您不必自己实现流量控制,TCP 算法会在内部处理它。
基本上发生的情况是,当从您的发送方接收到 TCP 段时,LwIP 将发送回一个 ACK,其中包括其缓冲区中剩余的可用空间(窗口大小)。由于数据到达的速度比您处理它的速度快,因此堆栈最终将发送回一个窗口大小为零的 ACK。这告诉发件人的堆栈退后并稍后重试,它将自动执行。当您开始从网络缓冲区中提取更多数据时,堆栈应该重新确认它收到的最后一个段,只是这一次它会打开窗口说它可以接收更多数据。
您要避免的是称为 silly window syndrome 的东西,因为它会对您的网络利用率和性能产生巨大影响。如果可以,请尝试从网络中大块读取数据。避免一次填充 1 字节缓冲区的紧密循环。