ITの教科書検索
入門・発展ページ読了 約10分

MTUとMSSとは ― 違いとパケットが分割される仕組み

MTUは1回で送れるIPパケットの最大、MSSはTCPが1回に載せるデータの最大です。2つの違い、1500と1460の関係、分割の仕組み、PPPoEやVPNで小さくなる理由を解説します。

目次
  1. MTUとMSSとは
  2. MTUとMSSの違い
  3. フラグメンテーションの仕組み
  4. 経路MTU探索
  5. PPPoEやトンネルで小さくなる
  6. MSSクランプとは
  7. 練習問題

MTUとMSSとは、1回で送れる大きさの上限

MTU(Maximum Transmission Unit)は、1回で送れるIPパケットの最大の大きさです。MSS(Maximum Segment Size)は、TCPが1つの送信単位(セグメント)に載せるデータの最大の大きさです。

イーサネットのMTUは1500バイトです。そこからIPヘッダとTCPヘッダを引いた1460バイトが、IPv4のTCPのMSSになります。

上限を超えたパケットは、分割されるか捨てられます。PPPoEやVPNの回線で一部のサイトだけ開けない不具合は、この上限の食い違いが原因で起きることがあります。2つの値の関係と分割の仕組み、上限が小さくなる理由と対策を順に説明します。

MTUとMSSの違い:1500と1460の関係

MTUとMSSの違いは、数える範囲です。MTUは、IPヘッダを含めたパケット全体の大きさです。MSSは、IPヘッダとTCPヘッダを除いた、TCPが運ぶデータだけの大きさです。

値数える範囲受け持つ層イーサネットでの値
MTUIPヘッダとデータ第2層(イーサネットなど)1500バイト
MSSTCPのデータだけ第4層のTCPIPv4は1460、IPv6は1440

IPv4のヘッダとTCPのヘッダは、オプションがなければどちらも20バイトです。そのため、MSSはMTUから40バイトを引いた値になります。IPv6ではIPヘッダが40バイトなので、1500から60を引いた1440バイトです。

MTUの1500バイトには、イーサネットのヘッダ14バイトと、末尾にある誤り検出用の欄4バイトは含まれません。これらを足したフレームは、最大1518バイトです。MTUはフレームの大きさではなく、フレームの中に入れられるIPパケットの大きさです。

MSSは3ウェイハンドシェイクのSYNで知らせる

TCPは、接続を始める手順である3ウェイハンドシェイクの最初のパケット(SYN)に、自分が受け取れるMSSを書いて相手に知らせます。MSSを書く欄は、SYNにだけ付けられます(RFC 9293)。相手からMSSが届かなかったときは、IPv4では536バイトとみなす決まりです。

実際に送るデータの大きさは、相手が知らせたMSSと、自分の側のMTUから求めた値の小さい方です。このため、通常のTCPの通信では、パケットがMTUを超えることはほとんどありません。

MTUを超えたとき:フラグメンテーションの仕組み

UDPなどで大きいデータを送ると、IPv4のパケットが途中の区間のMTUを超えることがあります。このとき、送信元か途中のルータが、パケットをいくつかに分けて送ります。この分割がフラグメンテーションで、分けた1つ1つを断片と呼びます。

IPヘッダには分割を禁じるDFビットがあり、これが立っていれば、ルータは分割せずにパケットを捨てます。この動きはカプセル化の記事のMTUの節で説明しています。ここでは、DFビットが立っていないときにパケットがどう分かれるかを説明します。

元のパケット(データ4000バイト)IPデータ 4000バイトMTU 1500の区間で分割IP1480バイトオフセット 0・MF 1IP1480バイトオフセット 185・MF 1IP1040バイトオフセット 370・MF 0元のパケット(データ4000バイト)IPデータ 4000バイトMTU 1500で分割IP1480オフセット 0・MF 1IP1480オフセット 185・MF 1IP1040オフセット 370・MF 0
データ4000バイトのパケットは、1480バイト・1480バイト・1040バイトの3つに分かれ、それぞれにIPヘッダが付きます。オフセットは元のデータでの位置を8バイト単位で示し、MFが0の断片が最後です。

たとえば、データ部分が4000バイトのIPv4パケットを、MTU 1500の区間に送るとします。1つの断片にはIPヘッダ20バイトが付くので、運べるデータは最大1480バイトです。4000バイトは、1480バイト・1480バイト・1040バイトの3つに分かれます。

断片元のデータでの範囲全長オフセットMF
1つ目0〜1479バイト目1500バイト01
2つ目1480〜2959バイト目1500バイト1851
3つ目2960〜3999バイト目1060バイト3700

断片を元に戻すための3つの欄

どの断片にも、元のパケットのIPヘッダがコピーされます。その中の3つの欄が、元に戻すための手がかりになります。

  • 識別子:元のパケットごとに付く番号です。同じ番号の断片を1つに集めます
  • MF:後ろに続きの断片があることを示す印です。最後の断片だけ0になります
  • フラグメントオフセット:その断片のデータが、元のデータの何番目から始まるかを示します

オフセットは、8バイトを1単位として数えます(RFC 791)。2つ目の断片は1480バイト目から始まるので、オフセットは1480 ÷ 8 = 185です。このため、最後以外の断片のデータは、8の倍数の大きさに切ります。

元に戻すのは宛先だけ

断片を1つのパケットに戻すのは、最終的な宛先のホストです。途中のルータは、断片を戻さずにそのまま転送します。断片が1つでも届かないと、宛先は時間切れで集めた断片を捨てます。

捨てたことは、通信の異常を知らせるICMPの時間超過(タイプ11)のコード1で、送信元に伝わることがあります。このコードの意味は、ICMPの記事のタイプの一覧にあります。

分割はできるだけ避ける

分割すると、断片ごとにIPヘッダが付く分のむだが生じます。また、TCPやUDPのポート番号は最初の断片にしか入っていません。RFC 8900によると、このためポート番号で判断するファイアウォールは、2つ目以降の断片を正しく扱えません。

こうした理由から、送信元は分割が起きない大きさで送るようにします。その大きさを調べる仕組みが、次に説明する経路MTU探索です。

経路MTU探索:分割せずに済む大きさを調べる

MTUは、宛先までの区間ごとに違うことがあります。その中でいちばん小さいMTUを送信元が調べる仕組みが、経路MTU探索です。IPv4での流れは次のとおりです。

  1. 送信元は、DFビットを立ててパケットを送ります
  2. MTUの小さい区間の手前のルータは、パケットを捨て、ICMPで次の区間のMTUを送信元に知らせます
  3. 送信元は、知らされたMTUに合わせて小さくして再送します

IPv6では途中のルータがパケットを分割しないので、送信元がこの探索で大きさを合わせます。途中でこのICMPを止めると起きる問題は、ICMPの記事の経路MTU探索の節に図で示しています。

MTUが小さくなる場面:PPPoEとVPNのトンネル

MTUが1500より小さくなるのは、パケットの外側にヘッダが増えるときです。イーサネットのフレームに入る大きさは1500バイトのままなので、増えた分だけIPパケットに使える大きさが減ります。次の図で回線やトンネルの種類を選ぶと、MTUとMSSの値と計算が切り替わります。

回線やトンネルの種類を選ぶ
PPPoE:IDとパスワードで回線事業者につなぐ方式です。イーサネットのフレームの中に、PPPoEのヘッダが入ります。
増えるヘッダ
PPPoEヘッダ6バイトと、PPPの種類を示す2バイトで、合わせて8バイトです。
MTU
1500 − 8 = 1492バイトです。
MSS
1492 − 20 − 20 = 1452バイトです。

PPPoEでは1492バイト

PPPoEでつなぐと、フレームの中にPPPoEのヘッダ6バイトと、PPPの種類を示す2バイトが入ります。RFC 2516は、このためにPPPのMTUを1492バイト以下にすると定めています。PPPoEの仕組みそのものは、PPPoEとIPoEの記事で説明しています。

GREやIPsecのトンネルでは、さらに小さくなる

トンネルは、元のパケットを新しいIPパケットで包む技術です。GREトンネルでは、ヘッダが24バイト増えるのでMTUは1476バイトになります。

IPsecの暗号化方式ESPは、暗号化した中身の前後にヘッダと末尾の欄を付けます。増える量は、暗号の方式と、長さをそろえるために足す詰め物によって変わります。このため、GREとIPsecを組み合わせる場合、Ciscoの資料はトンネルのMTUを1400バイトにするよう勧めています。

pingでMTUを確かめる

分割を禁じたpingを送ると、経路を通せる大きさを確かめられます。Windowsでは、-f でDFビットを立て、-l で送るデータの大きさを指定します。

ping -f -l 1472 8.8.8.8

1472バイトは、1500からIPヘッダ20バイトとICMPのヘッダ8バイトを引いた値です。経路のMTUが1500より小さければ、応答の代わりに、分割が必要だという表示が出ます。Linuxでは、同じ確認を次のコマンドで行います。

ping -M do -s 1472 8.8.8.8

経路でいちばん小さいMTUがPPPoEの1492バイトなら、1464バイトまでは応答が返ります。1464に28を足した1492が、その経路のMTUです。pingの基本の使い方は、ping・tracerouteの記事にまとめています。

MSSクランプとは:ルータがMSSを書き換える

PPPoEやトンネルの手前のルータは、通過するTCPのSYNに入ったMSSを書き換えることがあります。端末が1460と書いて送っても、ルータがトンネルに収まる値に小さくします。この手法をMSSクランプと呼びます。

MSSクランプを使うと、端末どうしは初めから小さいセグメントで通信するので、トンネルの区間で経路MTU探索のICMPに頼らずに済みます。Ciscoのルータでは、ip tcp adjust-mss という名前の設定です。

RFC 4459によると、この手法はPPPoEで最もよく使われています。ただし、書き換えられるのはTCPのMSSだけなので、MSSを持たないUDPの通信には効きません。

練習問題(全6問)

Q1MTUが1500バイトのイーサネットで、IPv4のTCPがオプションなしで送るときのMSSは?
Q2PPPoEでつなぐとき、MTUが1492バイトになる理由は?
Q3データ4000バイトのIPv4パケットを、MTU 1500の区間で分割する。2つ目の断片のフラグメントオフセットの値は?
Q4分割されたIPv4のパケットについて正しいものは?
Q5MSSクランプの説明として正しいものは?
Q6Windowsで ping -f -l 1472 を打つ。1472という値の意味として正しいものは?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

参考にした資料

関連記事

おすすめの本 PR

ネットワークを初めて学ぶ人向けの入門書です。

目的別の本の選び方を見る

ネットワークの記事を探す