我試圖識別與 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
,這似乎只影響資料流且不影響控制連接這是您識別為未定義連接埠的第三個連接埠。