【问题标题】:flow control implementation - how流量控制实现——如何
【发布时间】:2014-12-16 04:44:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: tcp freertos flow-control lwip


    【解决方案1】:

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

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

    您要避免的是称为 silly window syndrome 的东西,因为它会对您的网络利用率和性能产生巨大影响。如果可以,请尝试从网络中大块读取数据。避免一次填充 1 字节缓冲区的紧密循环。

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 2017-04-06
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多