TL;DR

  • Multipath TCP は、複数の TCP コネクションを束ねて帯域と冗長性を高める技術である。
  • Go 1.24 からは、OS が対応していればサーバ側が自動的に MPTCP で Listen するので、既存のコードは基本的に変えなくてよい。

内容

Multipath TCP とは

Multipath TCP(MPTCP)は、TCP をマルチパス化する技術である。アプリケーションからは従来の TCP と同じように扱えるが、下のレイヤでは複数の TCP コネクション(subflow)を束ねている。複数のネットワークインターフェースを持つクライアントは、それぞれのコネクションを束ねて帯域を広げ、冗長性を高められる。

主なメリットは、シームレスなハンドオーバー、帯域幅の集約、最適な経路の選択である。curl や QEMU など、さまざまなツールが対応している。

ネゴシエーション

最初の subflow は、TCP オプションの MP_CAPABLE を付けて作る。2 つ目以降は MP_JOIN を使い、既存の subflow があるセッションに紐付ける。また、ADD_ADDR で subflow を作れるアドレスを相手に通知できる。

Go のサポート

Go は 1.21 で MPTCP をサポートしたが、明示的に有効にする必要があった。Go 1.24 からは、OS が対応していればサーバ側は自動的に MPTCP で Listen する。クライアント側は変わらず、TCP で Dial すれば TCP 接続になり、明示的に MPTCP を有効にしたときだけ MPTCP 接続になる。

そのため、既存のコードは基本的に修正しなくてよい。ただし、MPTCP は主なソケットオプションには対応しているものの、一部足りない機能もある。問題が起きる場合は、ListenConfig.SetMultipathTCP(false) か GODEBUG=multipathtcp=0 で無効にする。

キーワード

関連