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

MTUとMSSの違い

MTU(Maximum Transmission Unit)

MTUはIPベースの考え方で、NW機器やホストが送受信できる、IPヘッダを含めた最大サイズ(バイト数)のことを言います。

Ethernetの最大サイズが規格上は "1518 Byte" までであり、Ethernetのヘッダ&FCSを差し引いた "1500 Byte" が大抵の機器のインタフェースのデフォルト値となっています。

しかし、最近はJumboフレームという独自規格が出現しており、9000Byte等の大きいサイズの指定も増えてきています。

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のヘッダ40Byte分を差し引いた、"1460 Byte"になっています。

IPフラグメンテーションとTCPセグメンテーションの違い

IPフラグメンテーション (NW機器の仕事)

これはルータなどのNW機器が行う作業で、IPベース、MTUベースでの分割作業になります。NW機器のMTUに従って分割されます。なのでUDPでも有効です。

ただし、NW機器側でもホスト側でも分割/再構成の処理が走り、効率が悪くなります。そのため現在はほとんど使われていない機能です(Path MTU Discoveryが基本となり、OS等の設定で、パケット分割を禁止する「DF bit」が有効になっているため)。

IPパケットのサイズが、通過するNW機器のインタフェース上のMTU値よりも大きい、かつ「DF bit」が0の場合、IPフラグメンテーションが行われます。

TCPセグメンテーション (ホスト端末の仕事)

これはクライアントやサーバ等のホスト端末が行う作業で、TCPベース、MSSベースでの分割作業になります。MSS値を超えるデータをTCP通信に乗っける際には、TCP1パケットでは届かないので、端末のMSS値に従って複数パケットに分割されます。

TCPセグメンテーションさえきっちりやっていれば、IPフラグメンテーションは起こりません。しかし端末はMSS値NW機器はMTU値を各々設定するので、その整合性を取る必要があります。

ciscoルータであれば、以下コマンドでMSSの調整ができます。また、他のルータでも何かしらのコマンドがあるはずです。

(config-if)# ip tcp adjust-mss 1440

TCPの3way Handshakeのときに端末⇔端末間でTCP MSS値の合意を取るのですが、この設定により、NW機器がMSS値を書き換えることができます。TCPは端末同士のやり取りなので、本来NW機器は介在すべきでないのですが、これは例外。

上記の例では、経路上の最小MTU値が1480 Byteである想定であり、その場合はTCPヘッダ20、IPヘッダ20を差し引いた1440がMSS値として適正となります。

フレッツ回線の場合はL2TPを使っている関係でさらに46Byteも使ってしまうので、1460 - 46 = 1414 がMSS値として適正になります。

効率の悪いIPフラグメントはなるべく避け、TCPセグメンテーションで対応していこう、という発想が「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"のパケットを表示すると、そのパケット単体だけでなく、それ以前のセグメンテーションで分割されたパケットも統合して表示してくれるのです。1129Byteのパケットに、それ以上のたくさんの情報が載っているのが分かります。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする