3

我注意到,当我从 udp 套接字以均匀的间隔发送数据包时,发送的第一个数据包似乎被延迟了。例如,如果我每 100 毫秒发送一次数据包,我发现在我的网络上接收数据包之间的延迟呈正态分布,平均为 100 毫秒,平均标准差为 4。但是,第一个和第二个数据包的接收时间之间的差距通常在 10 到 40 毫秒左右 - 正如您所看到的,这显然是一个统计学上的显着差异,所以我的问题是,是什么原因造成的?

我在 Linux 上使用 C 中的 sendto 函数。有人建议延迟可能是由于 arp 解析阻止数据包被发送,直到目标 ip 被转换为 mac 地址 - 这可能吗?如果我重新启动发送程序,第一个数据包再次花费太长时间,并且延迟不一致 - 10 到 40 毫秒是一个相当大的范围。

我需要找出为什么第一个数据包花费的时间太长,以及如何解决它。

编辑:对 pcap 的进一步分析表明发送程序以正确的间隔发送数据包。问题一定出在接收器上,它使用 select() 等待可读套接字,然后调用 recvfrom 并打印数据包。那里有某种我可能不知道的缓冲吗?

4

5 回答 5

2

这很可能是ARP地址解析所需的时间。这是将 MAC 地址解析为 IP 地址的协议。

要解决此问题,请尝试使用 arp 缓存中的静态条目和arp -s ip-address hw_address.

于 2010-12-20T11:00:09.613 回答
1

投机将让我们无处可去,启动Wireshark,它会告诉你所有你需要知道的。

于 2010-12-20T10:57:26.647 回答
0

这是在一个局域网上吗?如果是这样,它(可能)归结为 ARP 和/或主机名解析。如果它跨越一个更大的网络,它可能是任何东西(尽管可能与路由查找和缓存填充有关)。

于 2010-12-20T12:11:59.007 回答
0

您已询问解决方法。如果要知道数据包的接收时间很重要,一种可能的解决方法是设置SO_TIMESTAMP套接字选项。这将允许您获取目标内核接收每个数据包的时间 - 然后您可以在后续处理中使用此时间而不是“当前时间”。

或者,您可以让发送者在它发送的数据包中包含高分辨率时间戳,并使用它们。

于 2010-12-21T01:11:12.080 回答
0

我没有足够的“声誉”来投票支持我认为最好的解决方案,所以我只想说提到 ARP 消息的人很可能是对的。我认为 ARP 消息应该只适用于局域网。他们会在wireshark上显示为“谁拥有192.168.0.24?” 例如......然后会有来自声称拥有该IP地址的任何主机的回复。通过 UDP 发送到该地址的初始数据包必须获得 ARP 响应才能将 IP 地址解析为以太网 MAC 地址……所以 UDP 从表面上看似乎永远不会阻塞……但这仅适用于一次ARP地址被​​解析。我不确定,但我认为如果您将 UDP 发送到不在 LAN 上的地址,则不需要 ARP ......除非在找到主网关时遇到问题。

于 2013-09-29T20:58:12.677 回答