c++ - Iperf 2.x 客户端如何检测它发送的流量?

标签 c++ c linux iperf

如果执行例如 iperf -c 178.62.60.141 -fm -b 100m -u -t 30 -i 10,那么在每 10 秒间隔之后,Iperf 客户端打印出数据量它以兆字节为单位传输:

root@vserver:~# iperf -c 178.62.60.141 -fm -b 100m -u -t 30 -i 10
WARNING: option -b implies udp testing
------------------------------------------------------------
Client connecting to 178.62.60.141, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 0.22 MByte (default)
------------------------------------------------------------
[  3] local 146.185.187.148 port 37660 connected with 178.62.60.141 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   119 MBytes   100 Mbits/sec
[  3] 10.0-20.0 sec   119 MBytes   100 Mbits/sec
[  3] 20.0-30.0 sec   119 MBytes   100 Mbits/sec
[  3]  0.0-30.0 sec   358 MBytes   100 Mbits/sec
[  3] Sent 255661 datagrams

TCP 也是如此。事实上,传输的数据和带宽在每个间隔结束后打印出来,传输的数据有时比“-b”标志指定的带宽多一点或少一点,应该意味着 Iperf 客户端实际上以某种方式计算发送的数据,而不仅仅是打印“-b”(带宽)标志的参数。还是怎么样 Iperf 客户端统计它发送的数据量?它肯定不会在低级别上执行此操作,因为如果我使用 tc 引入 10% 的数据包丢失,请执行 iperf -c 178.62.60.141 -fm -b 100m -u -t 30 -i 10 然后比较 Iperf 客户端认为它发送的数据包(来自 Iperf 客户端输出)与实际发送到线路的数据包数量(来自 ip -s link show dev eth0 输出),然后 Iperf 客户端认为它发送了 >250k 的数据报,而实际上它只发送了 230k 多一点。如果我使用 tc token 桶过滤器排队规则来监管流量,则完全相同,即根据 Iperf 客户端,它以 100Mbps 的速度发送流量,而实际流量速率由监管器监管。

如果我尝试分析 Iperf 的源代码(http://ftp.de.debian.org/debian/pool/main/i/iperf/iperf_2.0.5.orig.tar.gz),那么据我了解,客户端连接是使用常规 connect() 系统调用在 src 目录中的 Client.cpp 文件中编码的吗?我猜报告是在 Reporter.c 文件中编码的,但它对我来说太复杂了,无法理解。有人可以解释一下(带有代码示例)Iperf 2.x 客户端如何检测它发送的流量吗?

最佳答案

在查看源代码之前,这看起来相当简单。客户应该知道它发送了多少东西。毕竟是送的。因此,它必须查看系统时钟,获取发送给定数据量所需的时间,并计算出速率。

而且,现在查看了 Reporter.c——正如预期的那样,那里散布着各种 gettimeofday() 系统调用,它们获取系统时钟的值。

这个实用程序发送的流量不可能是个大谜。毕竟是自己送的,应该知道有多少吧。

关于c++ - Iperf 2.x 客户端如何检测它发送的流量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25605329/

相关文章:

android - 如何使用 Gradle 将资源(图像、声音文件、着色器等)添加到 NDK 项目?

c - 如何在 Linux 内核中使用 bio 请求读取一个扇区

linux - AMPL 找不到 "minos"

linux - 从 ext3 文件系统读取 block ?

c++ - 用 c 包装一个 c++ 库? (不要 "extern c")

c++ - C++ 中的强制转换顺序

c++ - 从多个文件描述符异步接收 UDP 数据包

cmake ctest生成

c - 如何在宏中编写这样的 if 条件?

linux - 有限制的 Shellcode