2025/07/15 08:59 TCP-in-UDP Solution (eBPF)

やあ、ロボ子。今日のITニュースはMPTCPプロトコルがテーマじゃ。

MPTCPですか、博士。複数のTCP接続を束ねて使うプロトコルですね。それがどうしたのですか?

MPTCPは、NATやファイアウォールなどの影響を受けやすいのじゃ。最悪の場合、普通のTCPにフォールバックしてしまうらしいぞ。

それは困りますね。せっかくのMPTCPのメリットがなくなってしまいます。

そこで、TCP-in-UDPという技術を使うと、パケットがネットワークで変更されるのを防げるらしいぞ。TCPパケットをUDPに変換するのじゃ。

TCPをUDPで包む、ということですね。でも、ヘッダーはどうするんですか?

TCPヘッダーの項目をUDPヘッダーの項目で再配置するのじゃ。例えば、TCPのData Offsetは、UDPヘッダーにフラグやウィンドウフィールドと一緒に配置されるぞ。

なるほど、巧妙ですね。でも、Urgent Pointerは削除されるんですね。

そうじゃ。そして、レイヤー4プロトコルと、Urgent PointerからLengthへの切り替えを示す必要があるのじゃ。

Linuxでは、パケットデータはソケットバッファに格納されるんですね。eBPFコードは、パケットヘッダーにアクセスする必要があると。

その通り!ネットワークドライバは、レイヤー4プロトコルの最後までデータを整列させるから、12バイト多くアクセスする必要があるのじゃ。

GROやTSOは使えないんですね。各TCPパケットがUDPに変換されるから。

そうじゃな。eBPFでセグメンテーションの方法を変更できないから、スタックに最適化しないように指示する必要があるぞ。

チェックサムはどうなるんですか?

チェックサムは、いくつかのワードを移動しても変わらないのじゃ。レイヤー4プロトコルと、TCP Urgent PointerからUDP Lengthへの切り替えを更新する必要があるぞ。

完全なチェックサムを再計算する必要はないんですね。インクリメンタルに実行できると。

その通り!eBPFヘルパー(bpf_l3_csum_replaceやbpf_l4_csum_replace)が使えるぞ。

TC egressフックとTC csumアクションをチェーンすることで、レイヤー4プロトコルを変更した後でも正しいチェックサムを取得できるんですね。

ワイヤ上のパケットはUDPになるから、MSSの動的な適応は効果がないのじゃ。IPフラグメンテーションを避けるために、インターフェースのMTUやMSSを宛先ごとに適応させる必要がある場合があるぞ。

eBPFプログラムは、クライアント側とサーバー側の両方に簡単に展開できるんですね。MPTCPをブロックしているミドルボックスを回避するために。

そうじゃ!宛先ポートを変更する必要がある場合もあるぞ。これで、MPTCPがもっと使いやすくなるかもしれないのじゃ。

勉強になりました、博士!

ところでロボ子、TCP-in-UDPって、まるでロボ子が私を包み込んで守ってくれるみたいじゃな。…って、ちょっと違うか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。