tcpdump显示数据包但应用程序显示数据包是突发的

时间:2017-03-23 01:17:04

标签: linux sockets c++11 tcp poco-libraries

我正在制作一个我无法透露太多信息的系统,但我想我可以描述这个问题,以获得最可能的罪魁祸首的一些面包屑。

我有一个在嵌入式Linux系统上运行的应用程序,它有一个TCP服务器侦听IP和端口。它正在等待系统外部的外部客户端连接到它,它将接受连接以响应客户端。

预计客户端将以大约120毫秒的速率或每秒8条消息发送消息。当客户端连接时,tcpdump验证接口是否以大约120ms的间隔从客户端接收消息,但服务器应用程序将其视为突发消息。

爆发,因为它接收X个消息,然后Y个死亡静音秒数通过,重复该过程。

应用程序只希望一个客户端连接,并且应用程序是单线程的。有没有人知道为什么Linux中的TCP可能会出现这种行为?关于在应用程序和Linux套接字之间查看的任何想法?

注1: 另外还有一点,我正在为我的应用程序使用POCO库。我正在使用StreamSocket和ServerSocket包装器。 https://pocoproject.org/

注2: 我还应该注意到情况并非总是如此。有时,我的应用程序以预期的〜120ms间隔接收数据包。所以它确实可以正常工作,但每隔一段时间就会出现这个错误。

1 个答案:

答案 0 :(得分:0)

可能是Nagle算法的结果。 https://en.wikipedia.org/wiki/Nagle's_algorithm

即:发送方的数据一起累积,然后一起发送,以减少发送单个数据包造成的开销。尝试在客户端设置套接​​字选项TCP_NODELAY,看它是否有效。

要确定真正原因,服务器/客户端的数据包捕获将会有所帮助。