36.5. MPTCP サブフローのモニタリング
マルチパス TCP (MPTCP) ソケットのライフサイクルは複雑になる可能性があります。メインの MPTCP ソケットが作成され、MPTCP パスが検証され、1 つ以上のサブフローが作成され、最終的に削除されます。最後に、MPTCP ソケットが終了します。
MPTCP プロトコルを使用すると、iproute
パッケージで提供される ip
ユーティリティーを使用して、ソケットおよびサブフローの作成と削除に関連する MPTCP 固有のイベントをモニタリングできます。このユーティリティーは、netlink
インターフェイスを使用して MPTCP イベントをモニターします。
この手順は、MPTCP イベントをモニターする方法を示しています。そのために、MPTCP サーバーアプリケーションをシミュレートし、クライアントがこのサービスに接続します。この例に関係するクライアントは、次のインターフェイスと IP アドレスを使用します。
-
サーバー
192.0.2.1
-
クライアント (イーサネット接続):
192.0.2.2
-
クライアント (WiFi 接続):
192.0.2.3
この例を単純化するために、すべてのインターフェイスは同じサブネット内にあります。これは必須ではありません。ただし、ルーティングが正しく設定されており、クライアントが両方のインターフェイスを介してサーバーに到達できることが重要です。
前提条件
- イーサネットと WiFi を備えたラップトップなど、2 つのネットワークインターフェイスを備えた RHEL クライアント
- クライアントは両方のインターフェイスを介してサーバーに接続できます
- RHEL サーバー
- クライアントとサーバーの両方が RHEL9.0 以降を実行しています
-
クライアントとサーバーの両方に
mptcpd
パッケージをインストールしました
手順
クライアントとサーバーの両方で、接続ごとの追加のサブフロー制限を
1
に設定します。# ip mptcp limits set add_addr_accepted 0 subflows 1
サーバーで、MPTCP サーバーアプリケーションをシミュレートするには、TCP ソケットの代わりに強制された MPTCP ソケットを使用してリッスンモードで
netcat
(nc
) を開始します。# mptcpize run nc -l -k -p 12345
-k
オプションを指定すると、nc
は、最初に受け入れられた接続の後でリスナーを閉じません。これは、サブフローのモニタリングを示すために必要です。クライアントで以下を実行します。
メトリックが最も低いインターフェイスを特定します。
# ip -4 route 192.0.2.0/24 dev enp1s0 proto kernel scope link src 192.0.2.2 metric 100 192.0.2.0/24 dev wlp1s0 proto kernel scope link src 192.0.2.3 metric 600
enp1s0
インターフェイスのメトリックは、wlp1s0
よりも低くなります。したがって、RHEL はデフォルトでenp1s0
を使用します。最初のターミナルで、モニタリングを開始します。
# ip mptcp monitor
2 番目のターミナルで、サーバーへの MPTCP 接続を開始します。
# mptcpize run nc 192.0.2.1 12345
RHEL は、
enp1s0
インターフェイスとそれに関連する IP アドレスをこの接続のソースとして使用します。モニタリングターミナルで、
ip mptcp monitor
コマンドが次のログを記録するようになりました。[ CREATED] token=63c070d2 remid=0 locid=0 saddr4=192.0.2.2 daddr4=192.0.2.1 sport=36444 dport=12345
トークンは MPTCP ソケットを一意の ID として識別し、後で同じソケットで MPTCP イベントを相互に関連付けることができます。
サーバーへの
nc
接続が実行されているターミナルで、Enter を押します。この最初のデータパケットは、接続を完全に確立します。データが送信されていない限り、接続は確立されないことに注意してください。モニタリングターミナルで、
ip mptcp monitor
が次のログを記録するようになりました。[ ESTABLISHED] token=63c070d2 remid=0 locid=0 saddr4=192.0.2.2 daddr4=192.0.2.1 sport=36444 dport=12345
オプション: サーバーのポート
12345
への接続を表示します。# ss -taunp | grep ":12345" tcp ESTAB 0 0 192.0.2.2:36444 192.0.2.1:12345
この時点で、サーバーへの接続は 1 つだけ確立されています。
3 番目のターミナルで、別のエンドポイントを作成します。
# ip mptcp endpoint add dev wlp1s0 192.0.2.3 subflow
このコマンドは、クライアントの WiFi インターフェイスの名前と IP アドレスを設定します。
モニタリングターミナルで、
ip mptcp monitor
が次のログを記録するようになりました。[SF_ESTABLISHED] token=63c070d2 remid=0 locid=2 saddr4=192.0.2.3 daddr4=192.0.2.1 sport=53345 dport=12345 backup=0 ifindex=3
locid
フィールドには、新しいサブフローのローカルアドレス ID が表示され、接続でネットワークアドレス変換 (NAT) が使用されている場合でも、このサブフローが識別されます。saddr4
フィールドは、ip mptcp endpoint add
コマンドからのエンドポイントの IP アドレスと一致します。オプション: サーバーのポート
12345
への接続を表示します。# ss -taunp | grep ":12345" tcp ESTAB 0 0 192.0.2.2:36444 192.0.2.1:12345 tcp ESTAB 0 0 192.0.2.3%wlp1s0:53345 192.0.2.1:12345
このコマンドは、2 つの接続を表示します。
-
ソースアドレス
192.0.2.2
との接続は、以前に確立した最初の MPTCP サブフローに対応します。 -
送信元アドレスが
192.0.2.3
のwlp1s0
インターフェイスを介したサブフローからの接続。
-
ソースアドレス
3 番目のターミナルで、エンドポイントを削除します。
# ip mptcp endpoint delete id 2
ip mptcp monitor
出力のlocid
フィールドの ID を使用するか、ip mptcp endpoint show
コマンドを使用してエンドポイント ID を取得します。モニタリングターミナルで、
ip mptcp monitor
が次のログを記録するようになりました。[ SF_CLOSED] token=63c070d2 remid=0 locid=2 saddr4=192.0.2.3 daddr4=192.0.2.1 sport=53345 dport=12345 backup=0 ifindex=3
nc
クライアントを備えた最初のターミナルで、Ctrl+C を押してセッションを終了します。モニタリングターミナルで、
ip mptcp monitor
が次のログを記録するようになりました。[ CLOSED] token=63c070d2
関連情報
-
システム上の
ip-mptcp(1)
man ページ - NetworkManager が複数のデフォルトゲートウェイを管理する方法