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 で無効にする。