我正在尝试实现从嵌入式板到 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 在实际发送数据之前等待了这么长时间。