我正在尝试实现从嵌入式板到PC的数据传输。为此,我需要使用低延迟通信,并且我必须使用带有TCP/IP的以太网。
此外,我正在使用LWIP堆栈。
首先,我禁用了nagle算法,因为我必须发送小数据包(10kb),我希望它们能够尽快发送,而不必等待中间ack。
wireshark日志告诉我,这是非常好的工作(整个数据正在发送到PC大约1毫秒)。
之后,PC大约需要200毫秒来发送最后一个ACK(因为最后一个段不是最大大小)。
现在的问题是,在嵌入式处理器上,需要很长时间,直到LWIP向我的应用程序发出消息,所有数据都已打包。
当我减少tcp_间隔(比如说5)时,它会大大加快速度。
我想知道,为什么LWIP的行为是这样的?我认为周期性的tcp任务(根据tcp_间隔调用)与接收帧的处理无关(这实际上是主调用中的另一个调用)。
我希望我能以某种可以理解的方式陈述我的问题,如果不是,我会感谢反馈,所以我可以改进我的问题!
谢谢!
编辑:
经过更多的调试,我发现发送数据的过程会导致以下函数调用:
我的主调用tcp_write(…)
多次调用tcp_tmr()(通过lwip_periodical_handle()函数)。这种情况发生了七次。在第i次通话中:
调用tcp_output()。在此调用期间,通过调用tcp_output_segment()发送在上次tcp_write()调用期间添加的所有段。
所以现在很明显,如果我减少tcp_间隔,当然数据发送得更快,因为tcp_tmr()函数被更快地调用。
但我的问题仍然是:这是正常行为吗?看起来有点奇怪,LWIP在实际发送数据之前等待了这么长时间。
最佳答案
既然你这样做了,我的主叫tcp_write(…)
在TCP写入后立即使用TCP_output()
或者在tcpu recv回调中使用tcpu write()
关于tcp - LWIP:TCP_INTERVAL与ACK消息的接收有何关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25340793/