Windows XPで使用されているMTUを確認する方法


21

Webページにアクセスしようとすると「サーバーへの接続がリセットされました」というエラーがランダムに発生するという非常に奇妙な問題に苦しんでいます(Windowsネットワーク診断ツールによるとHTTPエラー12031)-これはWebページが私がアクセスしようとしているのは、外部のインターネット上、またはローカルホストで実行されているローカルのApacheインスタンスからでもです。ローカルネットワーク(ワイヤレスではなくイーサネット)上のすべてのコンピューターに影響します。すべてのコンピューターはWindows XPを実行しています。

ネットワークトラフィックで使用されるMTUに関係しているのではないかと提案されました。断片化されないで通過できる最大のパケットを見つけるためにPingテストを行うと 1492バイトのパッケージ(ヘッダーの場合は28バイト?)でlocalhostにpingを実行でき、1462バイトのパッケージでルーターにpingを実行できます(28バイトのヘッダーを含めると1490バイトになります)。Googleのような外部で何かをpingしようとすると、1430(ヘッダー付きの1458)を超えるものは何も取得できません。

このMTU設定updateでWindows XPレジストリを更新するために、さまざまな指示に従って試してみましたHKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU。私は代替値の終わりを試していません:最も明らかな正しい値は1490のようですが、1462、1458、1430なども試しました。変更を有効にするためにコンピューターを再起動すると、思わ数分間の作業に(それは常にランダムではなく、一貫性のなので、ハード確実に伝えるために)それは長持ちしません。

当初、値として1430を試していたとき、数分間正常に動作した後、Pingテストの結果は28バイト減少しました。突然、1402バイトのパッケージしかGoogleに渡せないことがわかりました。MTUレジストリ設定を1402に更新した場合、再起動して数分待った後、1374、1346などになります。ネットワーク上の他のコンピューターは影響を受けず(1430のまま)、MTU設定を削除します。レジストリから物事を通常に復元します(そして、まだ壊れています)。

これをすべて診断することについて私が最も難しいと思うことは、正しいレジストリ設定で遊んでいるかどうかを見分けるのが非常に難しいということです。それで、最も簡単なことですが、私の質問は次のとおりです:Windowsが使用しようとしているMTU設定をどのように確認できますか?

また、MTUが28まで低下し続ける理由を知る方法を誰かが持っている場合、それも役立ちます(たとえば、値が変化するポイントで何かを記録するWindowsログファイルがありますか?)

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


FWIW、最終的に問題となったのは危険な電話回線でした。電話を差し込んだとき、ダイヤルトーンがありませんでした。
andygeers

回答:


58

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接続を取得するためにトンネルサービスを使用しているため、ローカルエリア接続IPv6インターフェイスのMTU(1280)は非常に低くなっています

MTU(Windows 7、Windows Vista)を変更することもできます。管理者特権のコマンドプロンプトから:

>netsh interface ipv4 set subinterface "Local Area Connection" mtu=1492 store=persistent
Ok.

Windows 7 Service Pack 1でテスト済み

Windows XP

netshWindows XP の構文はわずかに異なります。

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を含む)の詳細を表示する前に、ルーティングとリモートアクセスサービスを開始する必要があります。

C:\Users\Ian>net start remoteaccesss

Windows XPは、MTU設定をから変更する方法を提供しませんnetsh。そのためにできること:

Windows XP Service Pack 3でテスト済み

こちらもご覧ください


MTUとは何か、28バイトがどこから来ているかについての短い議論。

ネットワークカード(イーサネット)の最大パケットサイズは1,500 bytes次のとおりです。

+---------+
| 1500    |
| byte    |
| payload |
|         |
|         |
|         |
+---------+

TCP / IPのIP部分には、20バイトのヘッダー(12バイトのフラグ、ソースIPアドレスに4バイト、宛先IPアドレスに4バイト)が必要です。これにより、パケットで使用可能なスペースが少なくなります。

+------------------------+
| 12 bytes control flags | \
| 4 byte from address    | |- IP header: 20 bytes
| 4 byte to address      | /
|------------------------|
| 1480 byte payload      |
|                        |
|                        |
|                        |
+------------------------+

現在、ICMP(ping)パケットには8バイトのヘッダー(1バイトtype、1バイトcode、2バイトchecksum、4バイトの追加データ)があります。

+------------------------+
| 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      |
|                        |
|                        |
|                        |
+------------------------+

それが「欠落」28バイトです-pingパケットを送信するために必要なヘッダーのサイズです。

pingパケットを送信するときに、追加するペイロードデータの量を指定できます。この場合、1472バイトすべてを含めると:

>ping -l 1472 obsidian

次に、結果のイーサネットパケットはエラまでいっぱいになります。1500バイトのパケットのすべての最後のバイトが埋められます。

+------------------------+
| 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....|
|........................|
|........................|
|........................|
|........................|
+------------------------+

もう1バイト送信しようとした場合

>ping -l 1473 obsidian

ネットワークは、その1501バイトのパケットを複数のパケットにフラグメント化する必要があります。

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      |
|                        |
|                        |
|                        |
|                        |
|                        |
+------------------------+

この断片化は、理想的には知らないうちに舞台裏で発生します。

しかし、あなたは意地悪で、パケットが断片化されることを許可されていないことをネットワークに伝えることができます:

>ping -l 1473 -f obsidian

-fフラグ手段は分割されません。これで、ネットワークに適合しないパケットを送信しようとすると、エラーが発生します。

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

パケットはフラグメント化する必要がありますが、Do not Fragmentフラグが設定されました。

回線のどこかでパケットを断片化する必要がある場合、ネットワークは実際にICMPパケットを送信して、断片化が発生したことを通知します。マシンはこのICMPパケットを取得し、最大サイズが通知され、大きすぎるパケットの送信を停止することになっています。残念ながら、ほとんどのファイアウォールはこれらの「パスMTUディスカバリ」ICMPパケットをブロックするため、マシンはパケットが断片化されていることを認識しません(またはさらに悪いことに、断片化できなかったためにドロップされます)。

それがウェブサーバーが機能しない原因です。最初の小さな(<1280バイト)応答を取得できますが、大きなパケットは通過できません。また、Webサーバーのファイアウォールが正しく構成されていないため、ICMPパケットがブロックされています。そのため、Webサーバーは、パケットを受け取っていないことに気付きません。

パケットのフラグメンテーションはIPv6では許可されていません。全員がICMP mtuディスカバリパケットを(正しく)許可する必要あります。


8

@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はEnablePMTUDiscovery0に設定するとMTUが576に設定されると言っています。

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

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

また、自分のマシンで最初にこれを試したとき、ルーティングとリモートアクセスサービスが無効になっていたため、指示に従って起動することができませんでした。コントロールパネル>管理ツール>コンピューターの管理>サービスとアプリケーション>サービスに移動して有効にしました。「スタートアップの種類」を「無効」から「手動」に変更しました。その後、そのダイアログからもサービスを開始しました。

また、KB283165がMTUを変更するための正しい指示であるかどうかもわかりません。これらの指示は、Windows PPPoEクライアントを実行している場合にのみ関係しませんか?ルーターがPPPoEクライアントであるルーターを介してインターネットに接続する場合(私の場合のように)、これらの指示は関係ないでしょうか?

レジストリに上記の変更を加えるに至った指示は、KB900926にありました。MTUサイズが576未満のWANリンクの推奨TCP / IP設定(方法2および3)。


@ianによる編集

あなたは正しいようです。1,200に設定しますが、netshレポートし1500ます。

ここに画像の説明を入力してください

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

だから、元の質問に対する答えは、Windows XPでは、送信できる最大のパケットを見つけるためにDo not fragmentフラグを付けて試行錯誤を行う必要があるということだと思います。次に、MTUがあります。


2

pingを試行錯誤のアプローチで使用してMTUを見つけることができます。

ping <address> -f -l nnnn

ping

-f:Echo RequestメッセージがIPヘッダーのDo n't Fragmentフラグを1に設定して送信されることを指定します。EchoRequestメッセージは、宛先へのパスにあるルーターによってフラグメント化できません。このパラメーターは、パスの最大伝送単位(PMTU)の問題のトラブルシューティングに役立ちます。

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

長さが長すぎると、「パケットは断片化する必要がありますが、DFが設定されています」というメッセージが表示されます。


これは私が私が「Pingテスト」と呼ば際の上何をしていたかである
andygeers

1

AdapterWatchを参照してください。

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


1

Microsoft KB314496:さまざまなネットワークトポロジのデフォルトのMTUサイズ
通常のネットワーク設定でMTU設定を試してはなりません。

あり、ここでVBのコードの参照がDrTCP
と呼ばれるツールもあります:

代替テキスト


レジストリで、

  • に行く HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • 興味のあるアダプターを開きます
  • ServiceName文字列をコピーする
  • その文字列を検索しますHKLM\System; あなたはNetCfgInstanceIdキーと一致します
  • それより少し上がMaxFrameSizeキーになります(私の表示は1514です)

netshコマンドでこれを変更する方法もあります。

また、パスMTUディスカバリー構成を確認してください。


それに感謝しますが、理想的には、デフォルトを期待するだけでなく、実際にどのMTU を使用しいるかをWindowsに実際に教えてもらえれば、もっと安心できます。たぶんこれは不可能かもしれません:-(
andygeers
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.