【図解】MTUとMSS, パケット分割の考え方 ~IPフラグメンテーションとTCPセグメンテーション~ | SEの道標
ネットワーク通信の流れを把握する

【図解】MTUとMSS, パケット分割の考え方 ~IPフラグメンテーションとTCPセグメンテーション~

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」を産みました。詳細は以下をご参照下さい。

【図解】Path MTU Discoveryの仕組み~ルータやWindows/Linuxでの設定確認/変更方法~
Path MTU Discoveryとは IPv4 においては、パケットサイズが...

UDP にはセグメンテーションや MSS の概念はありませんが、Path MTU Discovery は利用可能です。

以下の記事も併せてご参照下さい。

【図解】UDPのMTU/MSSやフラグメント(パケット分割),サイズの考え方,EDNS0やQUICの例
前提知識 TCP と MTU/MSS に関する基礎知識については以下をご参照下さ...

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 というデフォルト有効の機能によって発生します。

詳細は以下の記事をご参照ください。

tcpdump/WiresharkでMTU(=1500)より大きいLengthのパケットがキャプチャされる原因
Windows と Linux の MTU 確認コマンド 一般的な OS や N...

 

コメント

タイトルとURLをコピーしました