Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LWIP:TCP_间隔与ACK消息的接收有什么关系?_Tcp_Embedded_Lwip - Fatal编程技术网

LWIP:TCP_间隔与ACK消息的接收有什么关系?

LWIP:TCP_间隔与ACK消息的接收有什么关系?,tcp,embedded,lwip,Tcp,Embedded,Lwip,我正在尝试实现从嵌入式板到PC的数据传输。为此,我需要使用低延迟通信,并且我必须使用带有TCP/IP的以太网。 此外,我正在使用lwip堆栈 首先,我禁用了nagle算法,因为我必须发送小数据包(10 KB),我希望它们能够尽快发送,而不必等待中间确认。 Wireshark日志告诉我,这是非常好的工作(整个数据被发送到电脑在大约1毫秒) 之后,PC需要大约200毫秒发送最后一个ACK(因为最后一段不是最大大小) 现在的问题是,在嵌入式处理器上,需要很长时间,直到lwip向我的应用程序发送消息,所

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

首先,我禁用了nagle算法,因为我必须发送小数据包(10 KB),我希望它们能够尽快发送,而不必等待中间确认。 Wireshark日志告诉我,这是非常好的工作(整个数据被发送到电脑在大约1毫秒)

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

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

我想知道,为什么lwip会这样做?我认为周期性的TCP任务(根据TCP_间隔调用)与接收帧的处理无关(这实际上是另一个主要调用)

我希望我能以某种方式表达我的问题,如果我不能理解,我将感谢反馈,这样我就可以改进我的问题

谢谢

编辑:

经过进一步调试,我发现发送数据的过程会导致以下函数调用:

  • 我的主要任务是调用tcp_write(…)
  • tcp_tmr()被多次调用(通过LwIP_Periodic_Handle()函数)。这种情况发生了七次。在第八次通话中:
  • 调用tcp_output()。在此调用期间,在上次tcp_write()调用期间添加的所有段都通过调用tcp_output_segment()发送
现在很明显,如果我缩短TCP_间隔,数据当然会更快发送,因为调用TCP_tmr()函数的速度更快


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

既然你这么做了,我主要调用tcp_write(…) 在tcp_写入后立即使用tcp_输出()


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

,因为您正在这样做,所以我的main调用tcp_write(…) 在tcp_写入后立即使用tcp_输出()


或者在tcp_recv callback中使用tcp_write()

Ah crap-我的意思是10 KB,所以10000 ByteI不太熟悉“lwip”,但听起来好像它就是这样设计的,定期收集写入和发送。这可以减少可能无法高效写入的工作线程的开销。也许UDP会是一个更好的选择?另外,请注意,TCP不会等待ACK,除非发送窗口已满,并且允许实现延迟发送ACK数据包,以便在一个响应中回复多个传入数据包(减少网络负载)。啊,废话-我的意思是10 KB,因此10000 ByteI不熟悉“lwip”直接地,但听起来好像它就是这样设计的,收集写操作并定期发送。这可以减少可能无法高效写入的工作线程的开销。也许UDP会是一个更好的选择?另外,请注意,除非发送窗口已满,否则TCP不会等待ACK,并且允许实现延迟发送ACK数据包,以便在单个响应中回复多个传入数据包(减少网络负载)。