鉴于UDP数据包实际上并不发送ack,像iperf这样的程序如何测量它们的单向性能,即如何确认数据包实际到达:
相比之下,直观地说,对我而言,似乎TCP数据包可以通过网络进行严格的基准测试,从而可以非常可靠地从客户端完成发送ack信号的TCP数据包。
答案 0 :(得分:2)
1 /“如何确认数据包实际上已完好无损且未损坏”
UDP是一个不公平的鄙视协议,但是来吧,这在这里走得太远了! : - )
UDP具有校验和,就像TCP:
https://en.wikipedia.org/wiki/User_Datagram_Protocol#Checksum_computation
2 /“如何确认数据包实际到达时间范围内”
它没有,因为这不是UDP的意思,也不是TCP。[*]
从这里的源代码可以看出:
https://github.com/esnet/iperf/blob/master/src/iperf_udp.c#L55
......它的作用是检查无序数据包。在发送方设置“pcount”,并在接收方检查:
https://github.com/esnet/iperf/blob/master/src/iperf_udp.c#L99
...并且有点计算出一个虚假的抖动:
https://github.com/esnet/iperf/blob/master/src/iperf_udp.c#L110
(现实生活比这更复杂,你不仅有抖动,还有漂移)
[*]:
编辑:
这是另一场辩论,但是......
“在一个时间范围内”你需要的第一件事是发送/接收系统上的共享挂钟(否则,你怎么知道这样的接收数据包已经过时了?)
从第3层(IP)及以上,NTP
精确目标约为1毫秒。它可能比局域网上的要少(但在IP网络上,只是抓住机会并希望最好)。
在第2层,又称“LAN”,第2层PTP
(精确时间协议)IEEE 1588
用于亚微秒范围。 这是准确度的1000倍。在以太网AVB中使用的派生IEEE 802.1AS
,“时间敏感应用的定时和同步(gPTP)”也是如此。
关于这个子主题的结论:
TCP / IP虽然非常方便且功能强大,但设计以“保证在一定时间内交付”。无论是TCP还是UDP。把这个想法从头脑中解脱出来。
答案 1 :(得分:0)
显而易见的方法是连接到参与测试的服务器。
客户端首先(例如)连接到NTP服务器以获得准确的时基。
然后UDP客户端将一系列数据包发送到服务器。在其有效载荷中,每个数据包包含:
服务器然后查看这些并记录是否缺少任何序列号(在一些合理的超时之后)并将接收到的每个数据包的时间与客户端发送数据包的时间进行比较。经过一段时间后,服务器会发送一个回复,指示收到的数据包数量,传输时间的平均值和标准差,以及根据它们包含的CRC显示有多少数据包被破坏的指示。
根据品味,您可能还需要设置从客户端到服务器的同时TCP连接,以协调UDP通道的测试和(可能)返回结果。