iperf是衡量网络统计数据的绝佳工具,例如丢失,吞吐量和抖动。我经常使用它。但是,我只是想知道它是如何计算这些统计数据的。对于吞吐量,它可以简单地测量在一段时间内收到的字节数;对于抖动,它只能测量数据包到达时间。但是,对于UDP丢失,它如何计算。我的猜测是它通过嵌入序列号来构造其有效载荷。因此,服务器可以预测丢失的数据包。有谁知道iperf数据包有效负载的内容是什么?
另一件事是,在连接结束时,iperf客户端(发送者)将收到服务器报告(具有统计信息)。此报告发送的端口号是多少?此报告使用TCP还是UDP?我无法使用tcpdump捕获它。
我尝试在线搜索以找到上述问题的答案。但是,我只能找到如何使用iperf。看起来没有文件/网站解释iperf如何工作。有人可以提供一些见解或指出一些文件吗?
答案 0 :(得分:2)
我查看了源代码,并为iperf3采用了一些tcpdumps。我对iperf3有以下了解。
在iperf UDP数据包中,发送方将时间戳和序列号(iperf源代码称之为pcount)写入有效负载。一旦接收器获得数据包,它就会提取抖动的时间戳,以及丢包计数的序列号。
通过比较时间戳和当前时间来计算抖动,以便首先找到延迟D_current。然后,找到| D_current - D_previous | (差异消除了发送器和接收器之间的时钟同步),导致抖动。
损失只是为了累积当前pcount和之前收到的pcount加上一个预期的pcount之间的差异。
无论是iperf udp(在客户端使用选项-u)还是tcp,当iperf启动时,都会建立控制TCP连接。此控制TCP连接用于在测试结束时交换客户端和服务器端统计信息,包括上面计算的CPU工具,抖动和损耗。
从iperf2日志中,我没有找到控制TCP连接。
答案 1 :(得分:1)
我不是iperf开发人员,但是查看源代码,很容易找到将数据包计数复制到udp消息的位置,在这里查找packet_count: https://github.com/esnet/iperf/blob/master/src/iperf_udp.c