最適なMTU値を調べるサイトと設定を変更するコマンドでネットワークを高速化(Windows10)

なぜか一部のサイトだけ開けない!

Windows10のPCで、他のサイトは見れるのに、一部サイトだけ見れないとか、開けても表示が遅いということがありました。原因はネットワークのMTUの設定がデフォルトの1500バイトのままだったことで、今回、パソコン側のMTU設定を変更することで解決できました。

MTUとは

MTUとは、Maximum Transfer Unitの略で、ネットワーク機器(ホスト)が1度に送受信できる、IPヘッダを含めた最大サイズ(バイト数)で一度に送信可能なパケットのデータ量のことを表します。

最適なMTU値を知る方法

以下のサイトにアクセスするだけで、現在の通信環境における最適なMTU値を知ることができます。

SG TCP/IP Analyzer

表示された値は1454でした。公表されているMTU値と同じでした。つまり、ここで回線は1回あたり1454バイトを送受信する能力しかないなのに、パソコン側は1500バイトで送受信しようとしているということがわかりました。ちなみにうちの回線環境は『フレッツ光ネクスト』です。

ちなみに上記の赤字で書いてある部分の翻訳は以下の通りです。

MTU optimized for some PPPoE and PPPoA applications, also used with some VPN tunnels. If not, consider increasing your MTU to 1500 for better throughput. If you are using a router, it could be limiting your MTU regardless of Registry settings.

一部のPPPoEおよびPPPoAアプリケーション用に最適化されたMTU。一部のVPNトンネルでも使用されます。 そうでない場合は、スループットを向上させるためにMTUを1500に増やすことを検討してください。 ルーターを使用している場合、レジストリ設定に関係なくMTUが制限される可能性があります。

現状、1500-1454=46バイト分がオーバーしている状態です。この端数が今回の原因だと思われます。

ただ、今回のような一部のページが見れないという不具合はあまり聞いたことがないので、ほとんどの場合、Windows側で自動調節されているので、こういった不具合はあまり出ていないのだと思います。そんな情報を見たことがあります。

回線業者各社のMTU値

日本のインターネット通信においてMTU値は1500が最も安定し、最速の設定だそうです。

回線業者 MTU値
NURO光 1500
auひかり 1492
フレッツ光(v6プラス対応) 1460
フレッツ光 1454

MTU値の変更が必要か調べる方法

コマンドプロンプトでMTUの値を指定してPINGコマンドを実行してパケットが断片しているかどうかを見れば、MTU値の変更が必要かどうかがわかります。断片化していればPC側のMTU値を変更することが必要になります。正常に応答があれば変更は不要です。

変更が必要な場合の例

以下のコマンドでヤフーに1500のパケットサイズでPINGを飛ばしてみた例です。

コマンド
ping /f /l 1500 www.yahoo.co.jp

「パケットの断片化が必要ですが、DFが設定されています。」と表示され、更に「損失=4」とありますので、MTU値の最適化が必要です。グーグル(www.google.co.jp)も同様でした。ちなみにDFとは、Don't Fragmentの略で日本語だと『断片化しないで』という意味のようです。つまり、パケットの断片化が必要ですが、パケットを断片化しない設定になっているという意味っぽいです。よくわかりませんね。

変更値が1454で良いか確認する方法

SG TCP/IP Analyzerでは最適なMTU値が1454となっていましたが、本当かどうか確認するためには以下の計算式で出た値(設定するMTU値から28引いた値)でPING応答の状態を見ればわかります。

計算式
式 1454 - 20(IPヘッダ部) - 8(TCPヘッダ部) = 1426

1454からIPヘッダ部の20バイトと、TCPヘッダ部の8バイト合計28バイトを引いた1426以下の数字でPINGを飛ばし、正常な応答があればMTUの値は1454でOKということになります。

逆に言えば、PINGの応答に成功した値に28を足した値をMTU値に設定すればよいということになります。

ちなみに、1427にしたところ、損失が出たのでMTU設定値は1426 + 28 =1454で間違いないということがわかります。

IPsecやL2TPなどのVPNを使用している場合

フレッツを使用している普通の家庭であれば上記のようにIPヘッダ部とTCPヘッダ部の28バイト分でPINGの応答が成功すると思いますが、IPsecなどのVPNが絡んでくるとカプセル化のデータが加わってくるので話は変わるみたいです。その場合のMTU値やヘッダ部のバイト数は以下のページが参考になります。

Link

Mtu / Mss を最適化する | Yabe.jp

https://yabe.jp/gadgets/optimizing-mtu-mss/

現在のMTUの設定値を確認する方法

コマンドプロンプトから以下のコマンドで、PCに設定されている現在のMTU値を知ることができます。

コマンド
netsh interface ipv4 show interface

MTUの値を変更する方法

いろいろなサイトを参考に、フレッツ光ネクスト隼は1454にしたほうがいいみたいなので、以下のコマンドで設定します。これを実行する際は、コマンドプロンプトを管理者として実行することが必要です。

コマンド
netsh interface ipv4 set interface 9 mtu=1454

私の環境ではIdxの番号9でしたが、この番号はPCによって異なりますので、ご自分の環境に合わせて変更してください。

MTU値変更後の確認してみたところ、ちゃんと変更されていました。

無事解決

これで、見れなかったサイトが正常に表示されるようになり、表示が遅かったページはサクッと表示されるようになりました。

参考サイト

Link

Mtu / Mss を最適化する | Yabe.jp

https://yabe.jp/gadgets/optimizing-mtu-mss/

Link

- ニコニコチャンネル

https://ch.nicovideo.jp/tyautyau007/blomaga/ar1250575

Link

MtuとMssで、パケットサイズを指定 [現場で必要なネットワーク技術入門]

https://network.oreda.net/knowledge/mtu-mss.html

便利なコマンドとバッチファイル

MTUを1500~1000まで自動でPINGを飛ばすコマンド

SG TCP/IP Analyzerに頼らず、手動でPINGを送信して最適なMTU値を割り出したいとき、何度もコマンドを打つのは面倒ですが、以下のコマンドを使えば楽にできます。

コマンド
for /l %i in (1500,-1,1000) do ping -w 1 -n 1 -f -l %i www.google.com >> %USERPROFILE%\Desktop\result.txt

このコマンドはパケットサイズが1500から-1ずつ1000になるまでwww.google.comに繰り返しPINGを送信するコマンドです。実行後はデスクトップにできるresult.txtに結果が出力されますので、「応答」「TTL」の文字列を検索すれば、応答のあったMTU値がわかります。

MTU設定用バッチファイル

Windowsで簡単にMTU値を設定できるようにバッチファイルを作成してみました。バッチファイルを実行するときは『管理者として実行』してください。

@echo off

:STARTMENU
echo.
echo =================================
echo MTUの値の確認と設定変更をします。
echo =================================
echo [1] PINGでパケットの断片化が必要か確認する
echo [2] 現在のMTU値を確認する
echo [3] MTUの値を変更する
echo.

set /p MODE="モードを選択してください:"

if %MODE% == 1 (
	goto PING
)else if %MODE% == 2 (
	goto SHOWMTU
)else if %MODE% == 3 (
	goto SETMTU
)
cls
goto STARTMENU

:PING
:: PINGコマンドでMTU設定値が有効かどうか確認
echo.
set /p PACKETSIZE="パケットサイズを指定してください(例)1500:"
echo.
echo on
ping -f -l %PACKETSIZE% www.yahoo.co.jp
@echo off
echo.
goto STARTMENU

:SHOWMTU
:: 現在のMTU設定値を確認する
echo.
echo on
netsh interface ipv4 show interface
@echo off
echo.
goto STARTMENU

:SETMTU
:: MTUの値を変更
echo.
set /p IDX="Idxを指定してください:"
echo.
set /p MTUSIZE="MTUサイズを指定してください(例)1200:"
echo.
echo on
netsh interface ipv4 set interface %IDX% mtu=%MTUSIZE%
@echo off
echo.
goto SHOWMTU

exit

ダウンロード

このバッチファイルは以下のボタンからダウンロードできます。

MTUsetting.zip(約653byte)

VYOSを使用している場合

ルーターにVYOSを使用している場合、VYOS側でMTU値(MSS値)を設定することができます。 これを行えば、VYOSを通過して通信する端末のMTU値はルーター側で調節されるため、端末ごとにMTU値を設定しなくて済みます。

この場合、VYOSにLAN側のインターフェースに対して以下のコマンドを追加すればOKです。

eth0(WAN側)/ eth1(LAN側)の場合

ここで設定する値はMTUではなく、MSS値1414(1454-20-20)

configure

set policy route PPPOE-IN rule 10 protocol 'tcp'
set policy route PPPOE-IN rule 10 set tcp-mss '1414'
set policy route PPPOE-IN rule 10 tcp flags 'SYN'

set interfaces ethernet eth1 policy route PPPOE-IN

commit
save

参考ページ

Link

Vyattaを6.5にアップしたらMtu制限が効かなくなって切り戻した→解決!? - Mikedaの日記

https://mikeda.hatenablog.com/entry/20121217/1355762337

Link

<備忘録>vyosで一部サイトが見れない現象でハマった - いろいろバックエンドな人の備忘録

https://noontage.hateblo.jp/entry/2016/06/12/173348

PAGETOP