1ヶ月前にネット回線をV6プラス(MAP-E)に変更した話を書きましたが、2020/02/05現在、問題なく運用できています。
今回は、V6プラスでMTUを最適化した話を書きたいと思います。
MTUとは
MTUとは、IPパケットを送信する際の最大サイズです。このサイズより大きなデータを送信する場合はデータが分割されます。これをフラグメントといいます。
フラグメント(データ分割)が発生すると余計なコストがかかるため通信速度が落ちます。フラグメントが発生しないようにMTUを調節すればより効率的に通信できるわけですね。
MTUの一般的な値は1500ですが、最適な値はネット回線の種類などで変わります。なんで変わるかというと通信方式によってパケット内に追加のデータが必要になったりするからです。追加のデータが必要な場合は、ネットワークの下位にいるクライアントはその分を差っ引いたMTUにしなければフラグメント化してしまいます。なので。最適なMTUは環境によって異なるため実際に計測して確認することが重要になります。
使用環境
今回使用した環境は以下になります。
- ISP: enひかり(V6プラスオプション, ひかり電話はなし)
- Router: Buffalo WSR-1166DHPL/N (
192.168.1.1
) - Client: Windows10
- 接続は
[Internet] - [ONU] - [Router] - [Client]
となっています。 - ルーターのMTUは既定値の1500になっています。
MTUの最適値の求め方
Windowsメニューでcmd
と打って管理者として実行
をクリックしてコマンドプロンプトを開きます。
コマンドプロンプトでping google.com -f -l 1500
を実行します。
以下の結果になると思います。
C:\WINDOWS\system32>ping google.com -f -l 1500
google.com [172.217.25.238]に ping を送信しています 1500 バイトのデータ:
パケットの断片化が必要ですが、DF が設定されています。
パケットの断片化が必要ですが、DF が設定されています。
パケットの断片化が必要ですが、DF が設定されています。
パケットの断片化が必要ですが、DF が設定されています。
172.217.25.238 の ping 統計:
パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)、
-f
はデータ分割しない、-l
はパケットサイズを指定するオプションです。パケットサイズを1500にするとフラグメント化してしまう結果になっています。
あとはパケットサイズをフラグメント化しない値になるまで小さくしていきましょう。フラグメント化しない値で最も大きな値を探しましょう。
私の場合は1424
になりました。
C:\WINDOWS\system32>ping google.com -f -l 1425
google.com [172.217.161.206]に ping を送信しています 1425 バイトのデータ:
パケットの断片化が必要ですが、DF が設定されています。
パケットの断片化が必要ですが、DF が設定されています。
パケットの断片化が必要ですが、DF が設定されています。
パケットの断片化が必要ですが、DF が設定されています。
172.217.161.206 の ping 統計:
パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)、
C:\WINDOWS\system32>ping google.com -f -l 1424
google.com [172.217.161.238]に ping を送信しています 1424 バイトのデータ:
172.217.161.238 からの応答: バイト数 =68 (1424 を送信) 時間 =8ms TTL=55
172.217.161.238 からの応答: バイト数 =68 (1424 を送信) 時間 =8ms TTL=55
172.217.161.238 からの応答: バイト数 =68 (1424 を送信) 時間 =8ms TTL=55
172.217.161.238 からの応答: バイト数 =68 (1424 を送信) 時間 =8ms TTL=55
172.217.161.238 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 8ms、最大 = 8ms、平均 = 8ms
なぜ1424になるか
なぜ1424になるのか考えてみます。
---- Internet ----
+40 IPv6 Header
+ 8 encaplimit
---- Router ----
+20 IPv4 Header
+ 8 ICMP Header
---- Client ----
おそらく上記のように各種追加データが追加されるためではないかと思います。
1424+28+48=1500
というわけですね。
Clientが28バイト追加して、Routerがさらに48バイト追加すると。
というわけで、1424に28を足した値1452
がMTUの最適値になります。
Windows10でMTUを変更する
では早速MTUを変更してみます。
まずは現在のMTUの設定状況を表示してみます。同じくコマンドプロンプトで以下を実行します。
C:\WINDOWS\system32>netsh interface ipv4 show interface
Idx Met MTU 状態 名前
--- ---------- ---------- ------------ ---------------------------
27 5000 1500 connected vEthernet (Default Switch)
1 75 1500 connected Loopback Pseudo-Interface 1
18 1 1500 disconnected VPN - VPN Client
10 25 1500 connected vEthernet (bridge)
9 15 1500 connected vEthernet (DockerNAT)
私の環境ではいろんなネットワークがありますが、、設定変更する対象は27
、1
、10
、9
の4つになります。
以下のコマンドを実行します。
C:\WINDOWS\system32>netsh interface ipv4 set interface 27 mtu=1452
OK
C:\WINDOWS\system32>netsh interface ipv4 set interface 1 mtu=1452
OK
C:\WINDOWS\system32>netsh interface ipv4 set interface 10 mtu=1452
OK
C:\WINDOWS\system32>netsh interface ipv4 set interface 9 mtu=1452
OK
最後に再度設定状況を表示して確認します。
C:\WINDOWS\system32>netsh interface ipv4 show interface
Idx Met MTU 状態 名前
--- ---------- ---------- ------------ ---------------------------
27 5000 1452 connected vEthernet (Default Switch)
1 75 1452 connected Loopback Pseudo-Interface 1
18 1 1500 disconnected VPN - VPN Client
10 25 1452 connected vEthernet (bridge)
9 15 1452 connected vEthernet (DockerNAT)
これでMTUの設定を変更できました。
まとめ
MTUの最適値を探してWindows10に設定してみました。
ただここまで書いておいて変更の効果は体感できていません。またMTUの最適値が本当にこの値でよいのかも確信がありません。もし間違っているよ~とか、最適値を確認する方法があるよ~とかあればぜひ教えて下さい。