Iperf

未定義的 iperf3 埠?

  • March 16, 2018

我正在嘗試辨識與 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選項中檢索。

引用自:https://serverfault.com/questions/901719