iperf 如何计算网络统计信息

How iperf calculates network statistics

iperf 是一个很好的工具,可以测量网络统计数据,例如丢失、吞吐量、抖动。我用了很多。但是,我只是想知道它是如何计算这些统计数据的。对于吞吐量,它可以简单地衡量它在一定时间内接收到的字节数;对于抖动,它可以只测量数据包到达时间。但是,对于 UDP 丢失,它如何计算。我的猜测是它专门通过嵌入序列号来构建其有效负载。因此,服务器可以预测丢失了哪些数据包。有谁知道iperf packet payload的内容是什么?

另一件事是,在连接结束时,iperf 客户端(发送方)将收到服务器报告(其中包含统计信息)。此报告发送到哪个端口号?此报告使用 TCP 还是 UDP?我无法使用 tcpdump 捕获它。

我试图在网上搜索以找到上述问题的答案。但是,我只能找到如何使用 iperf。似乎没有 document/website 解释 iperf 的工作原理。有人可以提供一些见解或指出一些文件吗?

我不是iperf开发者,但是查看源代码,很容易找到将数据包计数复制到udp消息的地方,在这里寻找packet_count: https://github.com/esnet/iperf/blob/master/src/iperf_udp.c

看了源码,也拿了一些iperf3的tcpdumps。我对iperf3有以下理解。

在iperf UDP 数据包中,发送者将时间戳和序列号(iperf 源代码称为pcount)写入有效负载。一旦接收方收到数据包,它就会提取抖动的时间戳和数据包丢失计数的序列号。

抖动是通过比较时间戳和当前时间来计算延迟的,D_current。然后,找到 |D_current - D_previous| (差异消除了发送方和接收方之间的时钟不同步)导致抖动。

loss只是累加当前pcount与之前收到的期望pcount加1的差值

无论是iperf udp(客户端有选项-u)还是tcp,iperf启动时都会建立控制TCP连接。此控制 TCP 连接用于在测试结束时交换客户端和服务器端统计信息,其中包括上面计算的 CPU utils、抖动和丢失。

从 iperf2 日志中,我没有找到控制 TCP 连接。