質問: TCP/UDP のパケット分割やMTUについて疑問があります。 1) インターネット上でTCPを用いる場合、ハンドシェイクの時にMTUを交換してMSSの値を決めると思います。初めは、自分から相手に届くまでの全ての経路でフラグメント分割が発生しないMSSの値を決めているのかと思いましたが、良く考えるとパケットごとに異なる経路ごとを通る可能性がありますよね。ということは、ここで交換される値は途中の経路に関係なく、ただお互い(の内部ネットワーク)にとって都合のいいMSS値を交換しているのでしょうか?だとすると経路の途中のセグメントではフラグメント分割が行われる可能性があるため、経路上の適切なMSSの値を決めるという本来の目的を達成できていないように思うのですが、この理解で間違いないでしょうか? 2) また、UDPの場合は(UDPレベルでの)サイズの限界値やMTUに相当する概念はあるのでしょうか?少し調べた限りですとOSごとに大きすぎるパケットを送信するとエラーが出て送信がキャンセルされることがあるようですが、具体的な値などあまり詳しいことはわかりませんでした。どのような仕組みになっているのでしょうか?
回答: 1) に関してですが、確かに経路上の MTU でより小さい物があれば、適切な MSS は、一番小さい MTU に合わせると効率が良くなります。で、経路上のパケットサイズを動的に探る方法としては、経路MTU探索(Path MTU Discovery)というのがあります。 Maximum Transmission Unit - Wikipedia これは、フラグメント禁止フラグ(DF フラグ)を立てたパケットを送信し、ルータが転送先の回線の MTU サイズが小さくて、フラグメント無しには転送できない事を伝える ICMP パケットが送信元に返り、それを受け取って、より小さなサイズのパケットで再送する、という話です。 もし、経路 MTU 探索が有効に働いていれば、この結果から適切な MSS サイズが決まってくる、ということになります。 逆に言うと、途中にルータがある場合に、TCP の 3 way ハンドシェイクだけでは、適切な MSS サイズは分からないことになります。DF フラグを立っていなければ、経路上のルータが転送先の MTU に合わせてパケットを分割することになります。 あくまで MSS は、TCP の両端の話なので、本来は経路上の影響は考慮されていません。 ただ、ルータによっては、MSS の値を書き換える機能を持っている場合もあるようです。上記ページに下記のような記述があります。 > MSSは本来、TCPコネクションの両端が設定する項目である。しかし最近のブロードバンドルーター等は、TCPセグメントの転送時にMSSオプションを書き換える機能を持っている。 > > 2) ですが、MTU 自体は、IP よりも下位のレイア-で決まる値です。一方、IP パケット自体は、IP ヘッダにあるパケットサイズを表す部分が 16 bit であることから、原理的には 65,535 バイトまで許されることになります。 @IT:連載 基礎から学ぶWindowsネットワーク 第10回 IPパケットの構造とIPフラグメンテーション 1.IPパケットの構造 このサイズは IP ヘッダを含む、IP パケット全体のサイズになるので、UDP に載せられるデータの最大サイズは、IP ヘッダ(20 バイト)、UDP ヘッダ(8 バイト)のサイズを引いた 65,507 バイトが、一つの UDP パケットで送信可能な UDP の中身のサイズになります。 ただ、実際にこれを送信しようとすると当然、IP より下位のレイア-の制限を受けるので、PC の LAN のインタフェースから送信する場合には、イーサネットの MTU サイズ、1,500 バイトを最大とした IP パケットに分割されて送信することになります。 そのパケットが、経路上、より小さい MTU を持つ経路で転送される時には、DF フラグが立っていなければルータが再分割し、DF フラグが立っているパケットであれば、ICMP の Destination Unreachable が返ってくる、ということになります。