我正在尝试识别与 iperf3 UDP 会话相关的所有端口,并注意到 TCP 握手使用 iperf3 服务器上的未定义(?)端口。
有没有办法指定用于 iperf3 测试的所有端口?
说明示例:
在此示例中,我观察到使用的以下 IP 地址和端口:
- [客户端] 10.0.1.20,端口 5222
- [服务器] 10.0.1.89,端口 5205
- [客户端] 10.0.1.20,端口 56039 ????
客户:
// iperf3 (v3.1.3) Client running on Ubuntu 16.04 IP address: 10.0.1.20, port 5222
$ iperf3 -c 10.0.1.89 -u -p 5205 --cport 5222 -B 10.0.1.20
服务器:
// iperf3 (v3.1.3) Server running on Ubuntu 16.04 IP address: 10.0.1.89, port 5205
$ iperf3 -s -p 5205
-----------------------------------------------------------
Server listening on 5205
-----------------------------------------------------------
Accepted connection from 10.0.1.20, port 56039
[ 5] local 10.0.1.89 port 5205 connected to 10.0.1.20 port 5222
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
...
客户端上运行的wireshark 捕获也证实了这一点。
在iperf3 网站上有关于这种行为的描述。
查看
man iperf3
and 选项--cport
,这似乎只影响数据流,而不影响控制连接,这是您标识为未定义端口的第三个端口。不,无法通过命令行参数设置此客户端端口,也不能使用 iperf API。
这至少适用于当前的 3.1 iperf 版本。查看源代码,可以找到负责建立初始 TCP 连接的函数:
查看
netdial()
函数签名,它负责创建与服务器的连接:更具体地说,我们可以看到它将netdial() local_port 参数设置为
0
. 这应该在创建 TCP 控制通道时为客户端建立一个随机端口。正如 Thomas 所提到的,该
--cport
选项将仅控制数据流端口,我们还可以查看负责建立 UDP 数据流的函数的源代码:该函数使用
test->bind_port
选项作为local_port
参数,从--cport
选项中检索。