未定義の iperf3 ポートですか?

未定義の iperf3 ポートですか?

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 を使用して設定することもできません。

これは少なくとも現在のiperfバージョン3.1に当てはまります。ソースコード、最初の 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、これはデータストリームそして影響を与えない制御接続これは、未定義のポートとして識別する 3 番目のポートです。

関連情報