我正在尝试识别与 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 捕获也证实了这一点。
答案1
不,无法通过命令行参数设置此客户端端口,也无法使用 iperf API。
这至少适用于当前的 3.1 iperf 版本。查看源代码,可以找到负责建立初始 TCP 连接的函数:
/* iperf_connect -- client to server connection function */
int
iperf_connect(struct iperf_test *test)
{
[...]
/* Create and connect the control channel */
if (test->ctrl_sck < 0)
// Create the control channel using an ephemeral port
test->ctrl_sck = netdial(test->settings->domain, Ptcp, test->bind_address, 0, test->server_hostname, test->server_port, test->settings->connect_timeout);
if (test->ctrl_sck < 0) {
i_errno = IECONNECT;
return -1;
}
[...]
查看netdial()
负责创建与服务器的连接的函数签名:
netdial(int domain, int proto, char *local, int local_port, char *server, int port, int timeout)
更具体地说,我们可以看到它设置了网络拨号()local_port 参数为0
。这应该在创建 TCP 控制通道时为客户端建立一个随机端口。
正如托马斯提到的,该--cport
选项将只控制数据流端口,我们还可以检查源代码对于负责建立UDP数据流的函数:
if ((s = netdial(test->settings->domain, Pudp, test->bind_address, test->bind_port, test->server_hostname, test->server_port, -1)) < 0)
该函数使用test->bind_port
选项作为local_port
参数,从选项中检索内容--cport
。
答案2
在iperf3 网站有关于此行为的描述。
...初始 TCP 连接用于交换测试参数、控制测试的开始和结束以及交换测试结果。这有时被称为“控制连接”。实际测试数据通过单独的 TCP 连接发送,作为单独的 UDP 数据包流或独立的 SCTP 连接发送,具体取决于客户端指定的协议...
看看man iperf3
和选项--cport
,这似乎只会影响数据流并且不影响控制连接这是您识别为未定义端口的第三个端口。