MTUの最適な値を調べる方法です。
MTU(Maximum Transmission Unit)について
MTUはネットワークで1回で送信できるパケットの最大サイズのことです。
イーサネットのMTUは1500バイトと決まっていますが、インターネット回線は提供している会社にによってMTUの値は異なります。
MTUのサイズを超えたパケットを送信した場合
送信できるサイズにパケットを分割するという処理(IPフラグメンテーション)が行われます。
IPフラグメンテーションが発生すると、分割と分割されたデータを結合するという余分な処理が発生するため通信速度が低下してしまいます。
IPフラグメンテーションを禁止している機器を経由する場合は、通信ができなくなってしまう場合もあります。
MTUのサイズより小さすぎるパケットを送信した場合
送信するパケット数が増えるので、こちらの場合も通信速度が低下してしまいます。
インターネット回線で設定されているMTUの値を確認する方法
インターネット回線で設定されているMTUの値を調べる方法について説明します。
- Webサイトで確認
- pingを使用して確認
Webサイトで確認
下記のURLにアクセスすることで確認することができます。
https://www.speedguide.net/analyzer.php
図のようにMTUの値が表示されます。
pingを使用して確認
pingを使用してMTUの値を調査する場合は下記の方法で行います。
- フラグメンテーションの禁止
- パケットサイズを1500から徐々に減らしていく
- フラグメンテーションが起きなくなるサイズがMTUの値
MTUの計算方法
pingで送信するパケットサイズを指定した場合、指定したサイズ以外にもIPヘッダ(20バイト)とイーサネットフレームICMPヘッダ(8バイト)が追加されて送信されます。
パケットサイズを1500バイトを指定した場合は、「1500バイト + 28バイト = 1528バイト」となり、実際には1528バイトが送信されています。
そのため、フラグメンテーションが発生しなくなった際に指定したパケットサイズに、28バイトを足した値が実際のMTU値となります。
【Linux】IPフラグメンテーションの禁止する方法
Linuxの場合「-M do」オプションを指定することで、フラグメンテーションを禁止させることができます。
ping -s パケットサイズ -M do 宛先アドレス
パケットサイズを1500に指定してpingを送信すると、フラグメントが発生してエラーとなりました。
※「-c」オプションではpingを実行する回数を指定しています。
$ ping -c 5 -s 1500 -M do www.server-memo.net PING www.server-memo.net (133.242.16.216) 1500(1528) バイトs of data. ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 --- www.server-memo.net ping statistics --- 5 packets transmitted, 0 received, +5 errors, 100% packet loss, time 4087ms
パケットサイズを少しづつ減らしていって、1432バイトに設定したところで通信が可能になりました。
ですので、MTUの値は「1432バイト」に「28バイト」を足した「1460バイト」になります。
$ ping -c 5 -s 1432 -M do www.server-memo.net PING www.server-memo.net (133.242.16.216) 1432(1460) バイトs of data. 1440 バイトs from 133.242.16.216 (133.242.16.216): icmp_seq=1 ttl=53 time=47.8 ms 1440 バイトs from 133.242.16.216 (133.242.16.216): icmp_seq=2 ttl=53 time=66.7 ms 1440 バイトs from 133.242.16.216 (133.242.16.216): icmp_seq=3 ttl=53 time=51.1 ms 1440 バイトs from 133.242.16.216 (133.242.16.216): icmp_seq=4 ttl=53 time=43.1 ms 1440 バイトs from 133.242.16.216 (133.242.16.216): icmp_seq=5 ttl=53 time=42.4 ms
【windows】IPフラグメンテーションの禁止する方法
windowsの場合は「-f」オプションを使用すると、フラグメンテーションを禁止することができます。
ping -f -l パケットサイズ 宛先アドレス
パケットサイズを1500に指定してpingを送信すると、断片化(フラグメント)を行う必要があるが、DF(Don't Fragment)が設定されているというメッセージが表示されました。
C:\>ping -f -l 1500 www.server-memo.net www.server-memo.net [133.242.16.216]に ping を送信しています 1500 バイトのデータ: パケットの断片化が必要ですが、DF が設定されています。 パケットの断片化が必要ですが、DF が設定されています。 パケットの断片化が必要ですが、DF が設定されています。 パケットの断片化が必要ですが、DF が設定されています。 133.242.16.216 の ping 統計: パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)、
パケットサイズに1432バイトを指定してpingを実行すると、問題なく通信ができることが確認できました。
実際に送信されているパケットサイズは、1432バイトに28バイト分プラスされるので実際には1460バイトであることがわかります。
C:\>ping -f -l 1432 www.server-memo.net www.server-memo.net [133.242.16.216]に ping を送信しています 1432 バイトのデータ: 133.242.16.216 からの応答: バイト数 =1432 時間 =40ms TTL=53 133.242.16.216 からの応答: バイト数 =1432 時間 =40ms TTL=53 133.242.16.216 からの応答: バイト数 =1432 時間 =40ms TTL=53 133.242.16.216 からの応答: バイト数 =1432 時間 =40ms TTL=53 133.242.16.216 の ping 統計: パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、 ラウンド トリップの概算時間 (ミリ秒): 最小 = 40ms、最大 = 40ms、平均 = 40ms
コメント
「pingで送信視するパケットサイズを指定した場合、指定したサイズ以外にもIPヘッダ(20バイト)とイーサネットフレーム(8バイト)が追加されて送信されます。」
と記載がありますが、WireSharkで確認したところ、Ethernetペイロードが1500byteで、Etherヘッダ含まずに1500バイトでした。
で、ping -l の値に28バイト足すのは、合っていたのですが、
・IPヘッダ:20バイト
・ICMPヘッダ:8バイト
の28バイトでした。
ちなみに、WireSharkのデータから確認できたことは、
Etherフレーム:1514バイト(プリアンブル、FCS含まず)
内訳-----
Etherヘッダ:src:6バイト、dst:6バイト、タイプ:2バイト ⇒合計:14バイト
IPヘッダ:20バイト
ICMPヘッダ:8バイト
ICMPデータ:1472バイト
-------
合計:1514バイト⇒ WireSharkのEtherフレーム長(FCS含まず)に一致。
Ether-FCS 4バイト
=======
総合計 1518 バイト⇒ Etherフレームの最大長(プリアンブル含まず)に一致します。
以上、お知らせまで。
たろうさん
ご指摘いただきました箇所につきまして、訂正の方させていただきました。
誤)イーサネットフレーム(8バイト)
正)ICMPヘッダ(8バイト)
また、WireSharkの詳しい情報まで頂きまして、ありがとうございました。
作成した文章をちゃんと確認していたら、イーサネットフレームは明らかにおかしいと気づきそうなのに、お手数をおかけして本当すいませんでした。