MTU と MSS の違い
MTU (Maximum Transmission Unit)
MTU は IP ベースの考え方で、NW 機器やホストが送受信できる、IP ヘッダを含めた最大サイズ (バイト数) のことを言います。
Ethernet の最大サイズが規格上は "1518 Bytes" までであり、Ethernet のヘッダ&FCS を差し引いた "1500 Bytes" が大抵の機器のインタフェースのデフォルト値となっています。
しかし、最近は Jumbo フレームという独自規格が出現しており、9000 Bytes 等の大きいサイズの指定も増えてきています。
Cisco では以下コマンドで MTU 設定が可能です。
[IPv4 の MTU 値設定]
(config-if)# ip mtu 1480
[IPv4 および IPv6 の MTU 値設定]
(config-if)# mtu 1480
MSS (Maximum Segment Size)
MSS は TCP ベースの考え方で、TCP ヘッダを含めない最大サイズ (バイト数) のことを言います。
この設定値は NW 機器にはなく、クライアントやサーバ等のホスト端末に設定が入っています。大抵は MTU の設定に沿って、IP と TCP のヘッダ 40 Bytes 分を差し引いた、"1460 Bytes" になっています。
IP フラグメンテーションと TCP セグメンテーションの違い
IP フラグメンテーション (NW 機器の仕事)
これはルータなどの NW 機器が行う作業で、IP ベース、MTU ベースでの分割作業になります。NW 機器の MTU に従って分割されます。なので UDP でも有効です。
ただし、NW 機器側でもホスト側でも分割/再構成の処理が走り、効率が悪くなります。そのため現在はほとんど使われていない機能です (Path MTU Discovery が基本となり、OS 等の設定で、パケット分割を禁止する「df bit (don't fragment bit)」が有効になっているため)。
IP パケットのサイズが、通過する NW 機器のインタフェース上の MTU 値よりも大きい、かつ「df bit」が 0 の場合、IP フラグメンテーションが行われます。
TCP セグメンテーション (ホスト端末の仕事)
これはクライアントやサーバ等のホスト端末が行う作業で、TCP ベース、MSS ベースでの分割作業になります。MSS 値を超えるデータを TCP 通信に乗っける際には、TCP 1 パケットでは届かないので、端末の MSS 値に従って複数パケットに分割されます。
TCP セグメンテーションさえきっちりやっていれば、IP フラグメンテーションは起こりません。しかし端末は MSS 値、NW 機器は MTU 値を各々設定するので、その整合性を取る必要があります。
Cisco ルータであれば、以下コマンドで MSS の調整ができます。また、他のルータでも何かしらのコマンドがあるはずです。
(config-if)# ip tcp adjust-mss 1440
TCP の 3way Handshake のときに端末 ⇔ 端末間で TCP MSS 値を通知し合う (ネゴシエーションではなく、相手に自分の受信できるペイロードサイズを一方的に通知する) のですが、この adjust-mss の設定により、NW 機器が MSS 値を書き換えることができます。
TCP は端末同士のやり取りなので、本来 NW 機器は介在すべきでないのですが、これは例外。
上記の例では、経路上の最小 MTU 値が 1480 Bytes である想定であり、その場合は TCP ヘッダ 20、IP ヘッダ 20 を差し引いた 1440 が MSS 値として適正となります。
フレッツ回線の場合は L2TP を使っている関係でさらに 46 Bytes も使ってしまうので、1460 - 46 = 1414 が MSS 値として適正になります。
効率の悪い IP フラグメントはなるべく避け、TCP セグメンテーションで対応していこう、という発想が「Path MTU Discovery」を産みました。詳細は以下をご参照下さい。
UDP にはセグメンテーションや MSS の概念はありませんが、Path MTU Discovery は利用可能です。
以下の記事も併せてご参照下さい。
Wireshark の [TCP segment of a reassembled PDU]
Wireshark でパケットキャプチャをしていると、[TCP segment of a reassembled PDU] と表示されているのをよく見かけると思います。これはまさに前述の TCP セグメンテーションの結果です。
上図で [TCP segment of a reassembled PDU] がたくさん表示されています。そのうちどれか 1 つでよいので、中身を見てみましょう。
上図の例では "No.999"の中身を見ています。その下部にハイパーリンクで [Reassembled PDU in frame: 1000] とあります。これはどういう意味かというと、「No.999 のパケットは、TCP セグメンテーションにより分割されたうちの 1 パケットだよ!No.1000 が最後のパケットだよ!」ということです。
[TCP segment of a Reassembled PDU] 表記のパケットについて、中央ペインで展開して中身を見ると、TCP レイヤーの情報はありますが、その上位層の http レイヤーの結果は表示されません。ですが、最後のパケット (No.1000) にまとめて表示してくれます。
つまり、"No.1000" のパケットを表示すると、そのパケット単体だけでなく、それ以前のセグメンテーションで分割されたパケットも統合して表示してくれるのです。1129 Byte のパケットに、それ以上のたくさんの情報が載っているのが分かります。
tcpdump/wireshark で mtu (1500) より大きい length のパケットが見える原因
tcpdump や wireshark で MTU より大きいパケット長 (length) のパケットが見えることがあります。これは TCP セグメンテーションや IP フラグメンテーションとは関係なく、Linux の TSO/GSO というデフォルト有効の機能によって発生します。
詳細は以下の記事をご参照ください。
コメント