Linux 5.6 から Multipath TCPが使える

Linux 5.6から Multipath TCP(mptcp)が使えるようになった。複数インターフェースを使ってTCPコネクションをはり効率のよく通信を行う仕組みです。mptcp v0がRFC 6824で、mptcp v1がRFC 8684で標準化されています。

すでに、iOSでは利用が始まっています。
asnokaze.hatenablog.com

来月リリース予定である、Ubuntu 20.10 は Kernel 5.8 が入っており、mptcpが使えるのか試してみようと思いました。

有効になってることを確認

イメージを公式サイトから落としてきて起動します。

$ uname -a
Linux y 5.8.0-19-generic #20-Ubuntu SMP Fri Sep 11 09:08:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ sysctl -a |grep mptcp
net.ipv4.tcp_available_ulp = espintcp mptcp
net.mptcp.enabled = 1

すでにmptcpが有効になっていることを確認できます。

試す

redhatさんの記事(URL)では、stapを用いて既存のアプリケーションを変更無くmptcp対応を行っていましたが、うまく行かなかったので自力でmptcp通信を行います。

とは言ってそんなに難しいことはなく、ソケットオプションにIPPROTO_MPTCPを指定するだけで

fd = socket(AF_INET, SOCK_STREAM, IPPROTO_MPTCP);

下記ページのコード参考にすれば、比較的容易にクライアントとサーバを用意できました。
www.toumasu-program.net

パケットキャプチャ

通信をキャプチャすると、mptcp v1 で通信が行えていることが確認できます。

f:id:ASnoKaze:20200925004754p:plain

残課題

ちゃんと複数インターフェースでザブフローしゃべるところまで確認したい