2

我正在尝试实现从嵌入式板到 PC 的数据传输。为此,我需要使用低延迟通信,并且我必须使用带有 TCP/IP 的以太网。此外,我正在使用 lwip 堆栈。

首先,我禁用了 nagle 算法,因为我必须发送小数据包(10 KB)并且我希望它们尽快发送,而无需等待中间 ACKS。Wireshark 日志告诉我这工作得很好(整个数据在大约 1 毫秒内被发送到 PC)。

之后,PC 大约需要 200 毫秒来发送最后一个 ACK​​(因为最后一个 Segment 不是最大大小)。

现在的问题是,在嵌入式处理器上,需要很长时间,直到 lwip 向我的应用程序提供所有数据都已确认的消息。当我减少 TCP_INTERVAL(比如说 5)时,它会大大加快速度。

我想知道,为什么 lwip 会这样?我认为 Periodic-TCP-Tasks (根据 TCP_INTERVAL 调用)与接收帧的处理无关(这实际上是主要的另一个调用)。

我希望我能以某种可以理解的方式陈述我的问题,如果不是,我会很感激反馈,所以我可以改进我的问题!

谢谢!

编辑:

经过更多调试,我发现发送数据的过程导致以下函数调用:

  • 我的主要电话是 tcp_write(...)
  • tcp_tmr() 被多次调用(通过 LwIP_Periodic_Handle() 函数)。这种情况发生了七次。在第八次通话期间:
  • tcp_output() 被调用。在此调用期间,在最后一次 tcp_write() 调用期间添加的所有段都通过调用 tcp_output_segment() 发送。

所以现在很清楚,如果我减少 TCP_INTERVAL,当然数据会更快发送,因为 tcp_tmr() 函数被更快地调用。

但我的问题仍然是:这是正常行为吗?看起来有点奇怪,lwIP 在实际发送数据之前等待了这么长时间。

4

1 回答 1

-1

由于您正在这样做,我的主要调用 tcp_write(...) 在 tcp_write 之后立即使用 tcp_output()

或者在 tcp_recv 回调中使用 tcp_write()

于 2015-12-08T07:27:02.227 回答