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 番目のポートです。