我试图识别与iperf3 UDP会话相关的所有端口,并注意到TCP握手使用的是一个未定义的(?)iperf3服务器上的端口。
是否有一种方法来指定用于iperf3测试的所有端口?
Illustrating示例:
在本例中,我观察到使用了以下IP地址和端口:
客户端:
// 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捕获也证实了这一点。
发布于 2018-03-16 19:50:13
不,不可能通过命令行参数设置这个客户端端口,也不可能使用iperf。
这至少适用于当前的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选项中检索该参数。
发布于 2018-03-15 11:19:13
在站3网站上有关于这种行为的描述。
...The初始连接用于交换测试参数、控制测试的开始和结束以及交换测试结果。这有时被称为“控制连接”。实际测试数据通过单独的TCP连接、UDP数据包的单独流或独立的SCTP连接发送,具体取决于客户端指定的协议.
查看man iperf3和选项--cport,这似乎只影响数据流,而不影响控制连接,控制连接是您标识为未定义端口的第三个端口。
https://serverfault.com/questions/901719
复制相似问题