Iperf
未定義的 iperf3 埠?
我正在嘗試辨識與 iperf3 UDP 會話相關的所有埠,並註意到 TCP 握手使用 iperf3 伺服器上的未定義(?)埠。
有沒有辦法指定用於 iperf3 測試的所有埠?
說明範例:
在此範例中,我觀察到使用的以下 IP 地址和埠:
- $$ client $$10.0.1.20,埠 5222
- $$ server $$10.0.1.89,埠 5205
- $$ client $$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 擷取也證實了這一點。
不,無法通過命令行參數設置此客戶端埠,也不能使用 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)
更具體地說,我們可以看到它將netdial() local_port 參數設置為
0
. 這應該在創建 TCP 控制通道時為客戶端建立一個隨機埠。正如 Thomas 所提到的,該
--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
選項中檢索。