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)

私の環境ではいろんなネットワークがありますが、、設定変更する対象は271109の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の最適値が本当にこの値でよいのかも確信がありません。もし間違っているよ~とか、最適値を確認する方法があるよ~とかあればぜひ教えて下さい。