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コマンドはWindowsとmacOS(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値ということになります。