我有一个通过TCP每20毫秒发送一次数据的设备。我有一个连接到此设备的应用程序,启动套接字通信。我的应用程序侦听单独的线程,并在数据准备就绪时读取数据,将数据放在一边,其他一些线程处理它。设备通过以太网电缆直接连接到计算机。
我看到一个奇怪的问题,我试图理解为什么,几乎每分钟一次,从设备接收数据包需要大约50毫秒。我做一个阻塞读取,它将尝试读取一秒钟,并且将以数据准备好的速度完成,通常它需要大约20毫秒,正如我所期望的那样,但就像我之前所说的有时需要50毫秒,即使它是非常罕见(3000个中的1个)。我注意到的是后期数据包立即到达后的数据包,所以它让我觉得网络层有一些延迟。我还检查了数据包的时间戳(由设备给出),它们总是增加20毫秒。
当设备直接连接到计算机时,看到类似的延迟是否正常,因为它是TCP,可能需要付出很多努力(CRC检查,乱序包,重传等)。我仍然希望找到另一种方法来防止这种延迟,而不是接受它可能发生的事实。
非常感谢任何见解。
答案 0 :(得分:1)
这可能是Nagle's algorithm的结果,默认情况下在TCP / IP套接字中打开。
使用setsockopt()
在发送数据的套接字上设置TCP_NODELAY
标志以将其关闭。