Windows 7, Windows Vista, Windows XPの場合、様々なインターフェースのMTUは、Windows自身からnetsh
を使用して取得できます。
Windows 7, Windows Vista
Windows 7またはWindows Vistaの現在のMTUをコマンドプロンプトから表示するには。
C:\Users\Ian>netsh interface ipv6 show subinterfaces
MTU MediaSenseState Bytes In Bytes Out Interface
---------- --------------- --------- --------- -------------
1280 1 24321220 6455865 Local Area Connection
4294967295 1 0 1060111 Loopback Pseudo-Interface 1
1280 5 0 0 isatap.newland.com
1280 5 0 0 6TO4 Adapter
また、IPv4インターフェースの場合:
C:\Users\Ian>netsh interface ipv4 show subinterfaces
MTU MediaSenseState Bytes In Bytes Out Interface
---------- --------------- --------- --------- -------------
1500 1 146289608 29200474 Local Area Connection
4294967295 1 0 54933 Loopback Pseudo-Interface 1
注:この例では、ローカルエリア接続 IPv6 インターフェースのMTUが非常に低い(1280)のは、IPv6接続を取得するためのトンネルサービスを使用しているからです。
MTUを変更することもできます(Windows 7, Windows Vista)。コマンドプロンプトから。
>netsh interface ipv4 set subinterface "Local Area Connection" mtu=1492 store=persistent
Ok.
Tested with Windows 7 Service Pack 1
Windows XP
Windows XPのnetsh
構文は若干異なります:
C:\Users\Ian>netsh interface ip show interface
Index: 1
User-friendly Name: Loopback
Type: Loopback
MTU: 32767
Physical Address:
Index: 2
User-friendly Name: Local Area Connection
Type: Etherenet
MTU: 1500
Physical Address: 00-03-FF-D9-28-B7
注意。 ** Windows XPでは、インターフェイスの詳細(MTUを含む)を表示するには、ルーティングとリモートアクセス**サービスを開始する必要があります。そのため、以下のように変更することができます。
Tested with Windows XP Service Pack 3
MTUとは何か、28バイトはどこから来ているのかについての簡単な説明。
お使いのネットワークカード(イーサネット)の最大パケットサイズはnetsh
です。
C:\Users\Ian>net start remoteaccesss
TCP/IPのIP部分は20バイトのヘッダ(12バイトのフラグ、ソースIPアドレス用4バイト、デスティネーションIPアドレス用4バイト)を必要とする。これにより、パケット内で利用可能なスペースが少なくなります。
+---------+
| 1500 |
| byte |
| payload |
| |
| |
| |
+---------+
これでICMP(ping)パケットは8バイトのヘッダ(1バイト1,500 bytes
, 1バイトtype
, 2バイトcode
, 4バイトの追加データ)を持つようになりました:
+------------------------+
| 12 bytes control flags | \
| 4 byte from address | |- IP header: 20 bytes
| 4 byte to address | /
|------------------------|
| 1480 byte payload |
| |
| |
| |
+------------------------+
これが「不足している」28バイトの部分です。
ping パケットを送信する際に、どのくらいの extra ペイロードデータを含めるかを指定することができます。この例では、1472バイトすべてを含む場合、
+------------------------+
| 12 bytes control flags | \
| 4 byte from address | |
| 4 byte to address | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header | /
|------------------------|
| 1472 byte payload |
| |
| |
| |
+------------------------+
となり、結果として得られる ethernet パケットは一杯になります。1500バイトのパケットの最後のバイトが全て埋まってしまいます。
>ping -l 1472 obsidian
もう1バイトを送信しようとすると、ネットワークは1501バイトのパケットを複数のパケットに断片化しなければなりません。
+------------------------+
| 12 bytes control flags | \
| 4 byte from address | |
| 4 byte to address | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header | /
|------------------------|
|........................|
|........................|
|. 1472 bytes of junk....|
|........................|
|........................|
|........................|
|........................|
+------------------------+
この断片化は裏で、理想的にはあなたが知らないうちに行われます。
>ping -l 1473 obsidian
-f フラグは do not fragment を意味します。これで、ネットワークに合わないパケットを送信しようとするとエラーになります。
Packet 1 of 2
+------------------------+
| 20 bytes control flags | \
| 4 byte from address | |
| 4 byte to address | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header | /
|------------------------|
|........................|
|........................|
|..1472 bytes of payload.|
|........................|
|........................|
|........................|
|........................|
+------------------------+
Packet 2 of 2
+------------------------+
| 20 bytes control flags | \
| 4 byte from address | |
| 4 byte to address | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header | /
|------------------------|
|. |
| 1 byte of payload |
| |
| |
| |
| |
| |
+------------------------+
パケットは断片化する必要がありますが、Do not Fragment フラグが設定されています。
パケットを断片化する必要がある場合、ネットワークは実際に断片化が発生したことを知らせる ICMP パケットを送信します。あなたのマシンはこのICMPパケットを受け取り、最大サイズが何であるかを伝えられ、大きすぎるパケットの送信を停止することになっています。残念ながらほとんどのファイアウォールはこれらの “Path MTU discovery” ICMPパケットをブロックしているため、マシンはパケットが断片化されていることに気づくことはありません(あるいはもっと悪いことに、断片化できなかったためにドロップされてしまいます)。
これが web-server が動作しない原因です。最初の小さな (<1280 バイト) 応答は得られますが、それ以上のパケットは通過できません。ファイアウォールの設定が間違っていて、ICMPパケットをブロックしています。そのため、ウェブサーバはあなたがパケットを受け取っていないことに気づかないのです。
パケットの断片化はIPv6では許可されていません、誰もが(正しくは)ICMP mtuのディスカバリーパケットを許可するようにrequiredされています。