MTU(Maximum Transmission Unit)の設定方法
インターフェースのMTUを適切に設定すれば環境によっては通信効率を向上することができます。
主に利用されているOSであるWindowsとLinuxについてMTUの設定方法について書いていきたいと思います。
MTUとは
MTUとはMaximum Transmission Unitの略で、ネットワーク上に1フレーム(1回の転送)で送信できるデータの最大値を表す数値です。
イーサネットではMTUの上限は1500オクテット(バイト)となりますが、通信経路上のメディアやカプセル化によってMTUの上限値は変わってきます。
例えばNTT東日本のフレッツを利用した回線であれば、PPPoEやNTT局舎内のカプセル化のためMTUの上限値は1454となります。
MTUと直接は関係ないことですが、最近ではPPPoEセッションの通信負荷が問題となっておりIPv6のIPoE方式を利用できるプロバイダも増えてきています。
IPoE方式の場合、IPv6はMTUの上限値が1500バイトのまま利用することができます。
IPoE方式のIPv4通信についてはIPv6でカプセル化されるためMTUの上限値は1460程度となります。
MTUの調査方法
Windowsの場合
以下のように-fと-lオプションを付けたpingコマンドを利用します。(-nオプションはpingの試行回数)
ping -f -n 1 -l 1426 www.google.co.jp
pingが通る最大の-lの後の数字を探します。
1426以下でpingが通り、1427以上でpingが通らなくなる場合のMTUは1454(1426(データ) + 8(icmpヘッダ) + 20(IPv4ヘッダ))となります。
※IPv6だとヘッダサイズは40バイトとなります。
※同じ環境前提だとIPv6では1406以下でpingが通り、1407以上でpingが通らなくなります。
※1406(データ) + 8(icmpヘッダ) + 40(IPv6ヘッダ) = 1454
※OSのインターフェースのMTUが既に変更されている場合、そちらのMTUに制限される場合があります。
※例えば上と同じMTUが1454の環境でも既にインターフェースのMTUが1400に設定されている場合はpingで調査した時の-lの最大値は1372となります。
Linuxの場合
以下のよう-sオプションと-M doオプションを付けたpingコマンドを利用します。(-cオプションはpingの試行回数)
ping -c 1 -s 1426 -M do www.google.co.jp
MTUの求め方や注釈についてはWindowsの場合と同じです。
調査サイトの場合
以下の調査サイトにアクセスすることにより、アクセスしたクライアント-サーバ間の通信からMTU値を確認することができます。
SpeedGuide.net :: TCP Analyzer
MTUの設定方法
Windowsの場合
以下のコマンドでインターフェースのIdx番号を調べます。
netsh interface ipv4 show interface
次に以下のように設定したい値でMTUをセットします。(※管理者として実行が必要)
netsh interface ipv4 set interface 8 mtu=1454
netsh interface ipv6 set interface 8 mtu=1454
※IPv4とIPv6で別々なMTU値を設定可能です
Linuxの場合
即時反映
以下のようにifconfigコマンドを使用します。(※root権限が必要)
ifconfig eth1 mtu 1454
ipコマンドでも設定できます。
ip link set dev eth0 mtu 1454
※コマンドだけではOSを再起動すると初期値の1500に戻ります
恒久設定
MTUの恒久設定はディストリビューションによって異なります。
●Debian系のディストリビューションの場合は/etc/network/interfacesファイルにmtuを設定できます。
iface eth0 inet static
・・・(略)・・・
mtu 1454
・・・(略)・・・
詳しくは「man interfaces」を参照して下さい。
●RedHat系のディストリビューションの場合は/etc/sysconfig/network-scripts/ifcfg-eth0(eth0の部分はインターフェース名)などの初期化スクリプトに以下の変数を追加することで設定できます。
MTU=1454
※AWSのEC2など、dhcpからmtu設定を行っている環境ではdhcpオプションの設定を変更する必要がある場合があります。