0

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

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

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

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

那么在这种情况下,我是否必须在来自 wifi <-> 队列的数据之间手动实现流控制?我怎样才能做到这一点?

4

1 回答 1

0

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

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

您要避免的是所谓的愚蠢窗口综合症,因为它会对您的网络利用率和性能产生巨大影响。如果可以,请尝试从网络中大块读取数据。避免一次填充缓冲区 1 个字节的紧密循环。

于 2014-12-16T09:27:02.083 回答