29.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. クライアントとサーバーの両方で、接続ごとの追加のサブフロー制限を 1 に設定します。

    # ip mptcp limits set add_addr_accepted 0 subflows 1
  2. サーバーで、MPTCP サーバーアプリケーションをシミュレートするには、TCP ソケットの代わりに強制された MPTCP ソケットを使用してリッスンモードで netcat (nc) を開始します。

    # mptcpize run nc -l -k -p 12345

    -k オプションを指定すると、nc は、最初に受け入れられた接続の後でリスナーを閉じません。これは、サブフローのモニタリングを示すために必要です。

  3. クライアント上:

    1. メトリックが最も低いインターフェイスを特定します。

      # 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 を使用します。

    2. 最初のターミナルで、モニタリングを開始します。

      # ip mptcp monitor
    3. 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 イベントを相互に関連付けることができます。

    4. サーバーへの 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
    5. オプション: サーバーのポート 12345 への接続を表示します。

      # ss -taunp | grep ":12345"
      tcp ESTAB  0  0         192.0.2.2:36444 192.0.2.1:12345

      この時点で、サーバーへの接続は 1 つだけ確立されています。

    6. 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 アドレスと一致します。

    7. オプション: サーバーのポート 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.3wlp1s0 インターフェイスを介したサブフローからの接続。
    8. 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
    9. nc クライアントを備えた最初のターミナルで、Ctrl+C を押してセッションを終了します。

      モニタリングターミナルで、ip mptcp monitor が次のログを記録するようになりました。

      [        CLOSED] token=63c070d2