ICMP 通信において Protocol Unreachable が発生することがある

現象
以下のシナリオを考えます。
・ ping.exe コマンドの -w オプションに 1000 ミリ秒以下のタイムアウト値を指定して、ICMP Echo Request を発行します。
・ 送信先には、正常にネットワーク通信が到達可能です。
・ ping.exe コマンドの結果として、「要求がタイムアウトしました」というメッセージが表示されることがあります。
xxx.xxx.xxx.xxx に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
・ この時、ネットワーク パケット ログには、以下のようなメッセージが記録されます。
ICMP:Destination Unreachable Message, Protocol Unreachable

原因
この資料の「対象製品」の OS では、ping.exe コマンドで指定した -w のタイムアウト値を正しく計測できません。
タイムアウト値として 1000 ミリ秒未満が指定された場合、並行して動作しているタイムアウト処理にて、ICMP Echo Reply パケットの到着可否にかかわらず、未着として判断してしまうことがあります。
この問題は、ICMP Echo Reply が返ってくる時間内よりも、ICMP Echo Request の発行と、次のタイムアウト処理が起動する時間が短い場合に発生します。

この資料の「対象製品」の OS では、ICMP パケットのタイムアウトを判定する処理が、ICMP パケットの送受信処理とは独立して、500 ミリ秒の一定間隔で動作しています。
ping.exe コマンドで指定された -w のタイムアウト値は、500 ミリ秒を 1 単位としたカウンターに丸められて計算されます (999 ミリ秒以下のタイムアウト値は 1 単位に丸められて計算されます)。このカウンターは、タイムアウト処理が実行されるたびに減算されて、0 になるとタイムアウトと判定され、ICMP Echo Reply が未着として、Protocol Unreachable と判断されます。
ICMP Echo Request はタイムアウト処理とは無関係に、任意のタイミングで発行されます。これに対する ICMP Echo Reply が数十ミリ秒で返ってくる接続状態であった場合でも、数十ミリ秒以内に次のタイムアウト処理が動作し、カウンターが 0 になるとタイムアウトと判定し、Protocol Unreachable エラーを発生させてしまいます。

ping.exe コマンドで、"要求がタイムアウトしました" という応答になる現象に関しては、他の要因もあります。以下のドキュメントを参照してください。
ping コマンドを使用する
解決方法
上記に記載した原因により、タイムアウト値を 999 ミリ秒以下にした場合、予期せず Protocol Unreachable が発生する場合があります。
タイムアウト値は 1000 ミリ秒以上を指定してください。

また、指定したタイムアウト値で実際に保証可能なタイムアウト時間は、「指定した時間 - 500」(1000ミリ秒を指定した場合、保証可能な時間は 500 ミリ秒) となります。タイムアウト時間を保証したい場合は、500ミリ秒を加算した値を、タイムアウト値として指定してください。

具体的には、ICMP Echo Request を発行する側で、以下のような対処をします。
・ping コマンドの -w オプションには、「保証したいタイムアウト値 + 500 ミリ秒」の値を指定します。(ただし、1000 ミリ秒以上であること。)
・ICMP Echo Request を発行する、以下の API において、「保証したいタイムアウト値 + 500 ミリ秒」の値を指定します。(ただし、1000 ミリ秒以上であること。)
  ・ IcmpSendEcho
  ・ IcmpSendEcho2
  ・ IcmpSendEcho2Ex
回避策
状況
マイクロソフトでは、この資料の「対象製品」として記載されているマイクロソフト製品の問題として認識しています。
当現象に対する修正プログラムは用意されておりません。
詳細
この文書は、送信側におけるタイムアウト処理に問題がありますが、パケットを受け取った側で、そのパケットを破棄してしまう不具合により、"Protocol Unreachable" が発生する問題があります。
この問題に関しては、Windows 7/Windows Server 2008 のサービス パック 1 を対象に、受信先側に対する修正プログラムが公開されています。以下のサポート技術情報を参照してください。

Raw packet is discarded after a UDP broadcast packet is received on a computer that is running Windows 7 or Windows Server 2008 R2 (2738401)

なお、この修正プログラムと同等の修正は、上記以外の OS には実装されておりません。
関連情報
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2931152 - 最終更新日: 09/29/2016 11:39:00 - リビジョン: 4.0

Windows Server 2008 Datacenter, Windows Server 2008 Enterprise, Windows Server 2008 Foundation, Windows Server 2008 Standard, Windows Server 2008 Service Pack 2, Windows Server 2008 R2 Datacenter, Windows Server 2008 R2 Enterprise, Windows Server 2008 R2 Foundation, Windows Server 2008 R2 Standard, Windows Server 2008 R2 Service Pack 1, Windows Server 2012 Datacenter, Windows Server 2012 Essentials, Windows Server 2012 Foundation, Windows Server 2012 Standard, Windows Server 2012 R2 Datacenter, Windows Server 2012 R2 Essentials, Windows Server 2012 R2 Foundation, Windows Server 2012 R2 Standard, Windows Vista Business, Windows Vista Enterprise, Windows Vista Home Basic, Windows Vista Home Premium, Windows Vista Ultimate, Windows Vista Service Pack 1, Windows Vista Service Pack 2, Windows 7 Enterprise, Windows 7 Home Basic, Windows 7 Home Premium, Windows 7 Professional, Windows 7 Ultimate, Windows 7 Service Pack 1, Windows 8, Windows 8.1

  • KB2931152
フィードバック