MTUに関するあれこれ

Networkエンジニアを行っていると絶対に避けては通れねいMTUというキーワード。

MTUはMaximum Transmission Unitの略でネットワーク上で一回(1パケット)で送信できる最大のデータサイズという意味になります。

一般的なLANで使われているEthernetにおいてはMTUサイズは1500BYTEとなりますが、改めてMTUって何だっけ?という疑問が湧き立ち色々と調べ直し(勉強し直し)たので、まとめておきます。

 

MTUサイズとは?

さてEthetnetにおけるMTU1500BYTEというのはEthernetを流れるパケットのどこからどこまでを指すのでしょうか?

MTUサイズはEthernetヘッダ、FCSを除いたL3(IP)ヘッダからData部までのサイズとなります。

ですので、TCP/IPのパケットだと、
IPヘッダ:20BYTE
TCPヘッダ:20BYTE
DATA:1460BYTE
の合計で1500BYTEということになります。

 

ICMPパケットについても見ていきたいと思います。

ICMPパケットにおいてもMTUサイズは1500BYTEということはもちろん変わらないので上記のようになります。

IPヘッダ:20BYTE
TCPヘッダ:8BYTE
DATA:1472BYTE
となります。

 

PingによるMTUサイズの確認

EthernetにおけるMTUサイズ1500BYTEの確認を実機で確認してみようと思います。

それを確認するにはPingを使うことが一番簡単です。

Pingにてパケットを自動でフラグメント(分割)しないオプションを設定し1500BYTEおよび1501BYTEを設定して試験をしてみます。

上記のICMPにおけるMTU1500BYTEでの最大DATAサイズは1472BYTEとなるのでPingでサイズを指定します。

 

PingコマンドはWindowsmacOS(Linux)でオプションの指定方法が異なりますので注意が必要です。

 

macOSの場合
ping -D -s 1472 *.*.*.*

Windowsの場合
ping -f -l 1472 *.*.*.*

 

Default Gatewayに対してPingを行ってみます。

PingのDATAサイズを1472BYTEとするとMTUサイズ1500BYTEピッタリとなるので問題なく疎通が行えたことが分かります。

 

次にDATAサイズを1473BYTEとしてPingを試してみます。

パケット長(IPヘッダからICMPのデータ部まで)が1501BYTEとなってしまい、本来であればパケットはフラグメント(分割)されて送出されるべきなのですが、フラグメント不可のオプションを付けてますのでその結果「Message too long」とエラになっていることが確認できました。

 

WiresharkでMTUの確認

上記のPingの試験をWiresharkで見てみたいと思います。DATAサイズ1472BYTEで行った際のキャプチャ結果です。

Wireshark上のLengthは1514BYTEと表示されました。

Wiresharkの表示としてはEthernetヘッダ14BYTEを足した1514BYTEで表示されることがわかります。

MTUが1500BYTEの環境においてもそれ以上のLengthとして表示されることに注意が必要です。

これはWiresharkでトラブルシュートを行う上で地味にハマるポイントなので注意が必要です。

 

PPPoE環境におけるMTU値

2022年現在まだまだ現役として多くの家庭で利用されているPPPoEにおけるInternetアクセス環境ですが、そのPPPoEの環境におけるMTUサイズを解説していきたいと思います。

PPPoE環境でのMTU値をググってみると、1454BYTEであると多くの検索結果が見つかると思います。果たしてそれは正しいのでしょうか?

PPPoEのパケットを図で示してみると、

オリジナルのパケットに、
PPPoEヘッダ:6BYTE
PPPヘッダ:2BYTE
が付け加えられることから、MTUサイズは1492BYTEということになります。

 

では、なぜ日本のPPPoE環境では1454BYTEと言われるのでしょうか?

それは物理開栓の先NTTにおけるバックボーンにてL2TPが使われていることが理由のようです。

L2TPのパケットを図で示してみると、

となり、NTTのネットワーク内では、
IPヘッダ:20BYTE
UDPヘッダ:8BYTE
L2TPヘッダ:16BYTE
PPPヘッダ:2BYTE
が付けられるので、オリジナルのパケットのMTUサイズとしては、46BYTEを差し引いた1454BYTEとなるということです。

 

よって、
PPPoE MTU:1492BYTE > L2TP MTU:1454BYTE
となり、より小さい数字である1454BYTEがPPPoE環境におけるMTU値ということになります。