我注意到当我从 udp 套接字以均匀的间隔发送数据包时,发送的第一个数据包似乎被延迟了。例如,如果我每 100 毫秒发送一次数据包,我发现接收数据包之间的延迟在我的网络上呈正态分布,平均值为 100 毫秒,平均标准差为 4。但是,第一个和第二个数据包的接收时间之间的差距通常约为 10 到 40 毫秒 - 如您所见,这显然是统计上的显着差异,所以我的问题是,这是什么原因造成的?
我在 Linux 上使用 C 的 sendto 函数。有人建议延迟可能是由于 arp 解析导致数据包无法发送,直到目标 ip 已转换为 mac 地址 - 这可能吗?如果我重新启动发送程序,第一个数据包再次花费太长时间,并且延迟不一致 - 10 到 40 毫秒是一个相当大的范围。
我需要找出为什么第一个数据包花费的时间太长,以及如何解决它。
编辑:使用 pcap 的进一步分析表明发送程序正在以正确的时间间隔发送数据包。问题一定出在接收器上,它使用 select() 等待可读套接字,然后调用 recvfrom 并打印数据包。那里有某种我可能不知道的缓冲吗?
最佳答案
这很可能是 ARP 所需的时间地址解析。这是将 MAC 地址解析为 IP 地址的协议(protocol)。
要解决此问题,请尝试通过 arp -s ip-address hw_address
在 arp 缓存中使用静态条目。
关于network-programming - 是什么导致udp接收延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4488890/