2009-09-08 11:24:00 +0000 2009-09-08 11:24:00 +0000
21
21

Windows XPで使用されているMTUの見分け方

私は、ウェブページにアクセスしようとしたときに「サーバーへの接続がリセットされました」というエラーがランダムに表示されるという本当に奇妙な問題に悩まされています(Windowsネットワーク診断ツールによると、HTTPエラー12031) - これは、アクセスしようとしているウェブページが外部のインターネット上にあるかどうか、あるいはローカルホスト上で実行されているローカルApacheインスタンスからであるかどうかに関係なく起こります。これは、ローカルネットワーク上のすべてのコンピュータ(ワイヤレスではなくイーサネット)に影響を与え、すべてのコンピュータはWindows XPを実行しています。

ネットワークトラフィックに使用されているMTUが関係しているのではないかと提案されました。もし私がPing Testを実行して、フラグメンテーションされていない状態で通過できる最大のパケットを見つけると、1492バイトのパッケージでローカルホストにpingを打つことができます(ヘッダのための+28バイト?)し、私たちのルータに1462バイトのパッケージでpingを打つことができます(28バイトのヘッダを含めると1490バイトになります)。Googleのように外部にあるものをPINGしようとすると、1430(これはヘッダーを含めると1458)よりも大きいものは何も通らない。

このMTU設定でWindows XPのレジストリを更新するために、HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTUを更新するために様々なセットの指示に従ってみました。最も明らかな正しい値は1490のようですが、1462、1458、1430なども試してみました。変更を有効にするためにコンピュータを再起動すると、数分間は動作するようですが(一貫性があるというよりは常にランダムなのではっきりとは言えません)、長くは続かないようです。

最初、1430を値として試していたとき、数分後に正常に動作した後、Pingテストの結果が28バイト減少しました。MTUレジストリ設定を1402に更新して、再起動して数分待つと、1374、1346などになっていました。ネットワーク上の他のコンピュータは影響を受けないまま(1430のまま)で、レジストリからMTU設定を削除すると元通りになりました(それでも壊れています)。

これらを診断する上で最も難しいと思うのは、正しいレジストリ設定を行っているかどうかを見極めるのが非常に難しいということです。そこで、簡単に言うと、私の質問は次のようなものです。*Windowsが使用しようとしているMTU設定をどうやって見分けることができますか? *

また、もし誰かMTUが28ずつ下がり続ける理由を知る方法を知っている人がいれば、それも役に立つでしょう (例えば、値が変わった時点で何かを記録するWindowsのログファイルがどこかにあるのでしょうか?)

最後に、もし誰かがどのMTU設定を使用しようとしているのかを明確に伝える方法を教えてくれるなら、それは素晴らしいことです!

回答 (5)

58
58
58
2011-08-02 02:59:21 +0000

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されています。

8
8
8
2011-11-07 19:52:04 +0000

@ian netshが実際に現在使用されているMTUを表示しているかどうかはよくわかりません。Windows XP Pro SP3 マシンで netsh interface ip show interface を実行すると、該当するインターフェイスの MTU 値が 1500 として報告されました。その後、以下のレジストリキーを追加しました。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnablePMTUDiscovery
    value: 0

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{ID}\MTU 
    value: various (e.g. 1200)

Microsoft曰く EnablePMTUDiscoveryを0に設定すると、MTUが576に設定されます。

レジストリエントリのMTUを設定すると、手動でMTUが設定されます。MTUのエントリの値をいくつか試してみました(その都度再起動)。

どちらの場合も、最初のエントリを追加してから2番目のエントリを追加しても、netshは依然としてMTUを1500と報告しています。pingでテストしたところ、レジストリで設定されたMTU値が実際に使用されていることが確認されました(少なくとも示唆されました)。

また、私のマシンで最初にこれを試したとき、ルーティングとリモートアクセスサービスは無効になっていたので、あなたの指示に従って起動することができませんでした。Control Panelの「Control Panel」→「Adminstrative Tools」→「Computer Management」→「Services and Applications」→「Services」で有効にしてみた。Startup type “をDisabledからManualに変更しました。そして、そのダイアログからもサービスを起動してみた。

あと、KB283165のMTU変更の指示が必ずしも正しいとは思えない。それらの指示は、Windows PPPoEクライアントを実行している場合にのみ関係があるのではないでしょうか?ルータがPPPoEクライアントであるルータを介してインターネットに接続する場合(私の場合)、これらの命令は関係ないのではないでしょうか?

上記のようにレジストリを変更するための指示は、 KB900926. MTUサイズが576以下のWANリンクの推奨TCP/IP設定 (方法2と3)にありました。

Edit by @ian

正解のようです。1,200に設定するが、netsh1500を報告している。

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

0x1&

ということで、元の質問への答えは、Windows XPでは Do not fragment フラグを使って試行錯誤して、送信可能な最大のパケットを見つけなければならないということだと思います。それからMTUがあります。

2
2
2
2009-09-08 11:47:58 +0000
ping <address> -f -l nnnn

-f . IPヘッダのDon’t Fragmentフラグを1に設定してエコー要求メッセージを送信することを指定します。 エコー要求メッセージは、宛先へのパス内のルータによって断片化されることはありません。このパラメータは、パス最大伝送単位(PMTU)問題のトラブルシューティングに役立ちます。

-l Size : 送信されるエコー要求メッセージのデータフィールドの長さをバイト単位で指定します。デフォルトは32です。最大サイズは 65,527 です。

長さが大きすぎると「Packet needs to be fragmented but DF set」というメッセージが表示されます。

1
1
1
2009-09-08 11:28:05 +0000

Microsoft KB314496. 異なるネットワークトポロジのデフォルトのMTUサイズ](http://support.microsoft.com/kb/314496).
通常のネットワーク設定でMTU設定をいじってはいけません。

VBコードリファレンスはこちら .

DrTCP というツールもあります。


レジストリで、

  • HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • 興味のあるアダプタを開く
  • ServiceNameの文字列をコピー
  • HKLM\Systemでその文字列を検索します。

また、Path MTU Discoveryの設定もチェックしてください。

1
1
1
2009-09-08 11:41:12 +0000

AdapterWatch](http://www.nirsoft.net/utils/awatch.html) を参照してください。

AdapterWatch は、ネットワークアダプタに関する便利な情報を表示します。IP アドレス、ハードウェアアドレス、WINS サーバ、DNS サーバ、MTU 値、受信または送信されたバイト数、現在の転送速度などです。さらに、ローカルコンピュータの一般的なTCP/IP/UDP/ICMP統計を表示します。