TCP / UDP中的延迟是什么?

问题描述 投票:3回答:5

请帮助!我有一个需要尽可能接近实时处理的应用程序,并且我一直遇到TCP和UDP异常延迟的问题。延迟会像发条一样发生,并且总是相同的时间长度(通常为15到16毫秒)。当传输到任何计算机(本地前夕)和任何网络(我们有两个)上时,都会发生这种情况。

快速解决问题:

我一直使用在VS 2008 Pro中编译的C ++中的winsock,但是我编写了一些程序,使用TCP和UDP以各种方式发送和接收。我总是使用以各种语言(MATLAB,C#,C ++)编写的中间程序(在本地或远程运行)将信息从一个程序转发到另一个程序。两个winsock程序都在同一台计算机上运行,​​因此它们显示来自同一时钟的Tx和Rx时间戳。我一直看到出现一种模式,在这种模式下将传输一连串的数据包,然后在下一个突发之前有大约15到16毫秒的延迟,尽管没有编写任何延迟。有时每个数据包之间可能有15到16毫秒而不是一连串的数据包。其他时间(很少),我会有不同的长度延迟,例如〜47 ms。我似乎总是在传输数据包后的一毫秒内收到数据包,尽管在传输的突发之间表现出相同的延迟模式。

我怀疑Winsock或NIC在每次传输之前都在缓冲数据包,但是我没有找到任何证据。我有一个连接到一个网络的千兆连接,该网络获得各种级别的流量,但是在没有私有网络(至少来自用户)且没有2个千兆连接的群集上运行中间程序时,我也会遇到同样的事情。当在本地运行带有发送和接收程序的中间程序时,我什至会遇到这种延迟。

networking tcp udp winsock delay
5个回答
4
投票

我今天早上在用Java重写服务器时发现了问题。我的Windows系统时钟的分辨率在15到16毫秒之间。这意味着每个显示与发送时间相同的毫秒的数据包实际上是在16毫秒的间隔中以不同的毫秒发送的,但是我的时间戳仅每15到16毫秒增加一次,因此它们看起来是相同的。

我来这里是为了回答我的问题,我看到了有关提高程序优先级的回应。因此,我启动了所有三个程序,进入了任务管理器,将所有三个程序提升为“实时”优先级(没有其他进程在运行),然后运行它们。我得到了相同的15到16毫秒间隔。

不过感谢您的回复。


2
投票

总是涉及缓冲,并且在硬件/驱动程序/操作系统等之间有所不同。数据包调度程序也起着很大的作用。

如果您想要“硬实时”保证,则可能应该远离Windows ...


0
投票

您可能会看到调度程序延迟-您的应用程序正在等待其他进程完成其时间片并放弃CPU。多处理器Windows上的标准时间片为15ms至180ms。

您可以尝试提高应用程序/线程的优先级。


0
投票

哦,是的,我知道你的意思。 Windows及其缓冲区...尝试在发送方调整SO_SNDBUF的值,在接收方调整SO_RCVBUF的值。另外,请检查所涉及的网络硬件(路由器,交换机,媒体网关)-尽可能减少机器之间的连接以避免延迟。


0
投票

我遇到相同的问题。但就我而言,我使用GetTickCount()来获取当前系统时间,不幸的是,它始终具有15-16ms的分辨率。当我使用QueryPerformanceCounter而不是GetTickCount()时,一切都很好。实际上,TCP套接字接收数据是均匀的,不是15毫秒就处理一次。

© www.soinside.com 2019 - 2024. All rights reserved.