LWIP:TCP_INTERVAL与ACK消息的接收有何关系?

时间:2014-08-16 13:50:32

标签: tcp embedded lwip

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

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

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

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

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

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

谢谢!

编辑:

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

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

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

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

1 个答案:

答案 0 :(得分:-1)

因为你这样做我的主要调用tcp_write(...) 在tcp_write

之后立即使用tcp_output()

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