ICMPを活用することで、トラブル時の原因調査やネットワークの状況確認に役立ちます。
pingコマンド
pingコマンドは、宛先の機器を指定して、IPで通信できる状態にあるかどうかを調べるコマンドです。ネットワークにつながらなくなった場合、pingコマンドを使ってルーターやサーバーに疎通できるのかどうか確認した経験がある人は多いと思います。
このpingコマンドではICMPプロトコルが使用されています。ICMPのしくみを知ることで、pingコマンドを使ってトラブル原因を突き止めるのに役立ちますし、ルーターがどのようなICMPメッセージを送っているかを知ることで、IPによる通信のしくみをより深く理解できるようになります。
ICMPでやりとりするメッセージはいくつか種類はありますが大別すると「問い合わせ」と「エラー通知」の2つに分けられます。
宛先との接続性を確認したい場合、「エコー要求」という問い合わせメッセージを宛先に送信します。
ICMPエコー要求メッセージを受信したホストは、自動的にエコー応答を返信します。エコー要求に対する応答が受信できれば、「送信元と宛先ホストとの間は、物理層、データリンク層、ネットワーク層までは接続性が確認できた」と判断できます。
この仕組みを利用しているのがpingコマンドです。pingコマンドは、引数で指定した宛先に対して、ICMPエコー要求メッセージを送信することで、疎通確認やトラブルシューティングなどに広く利用されています。
>ping 172.16.0.254 172.16.0.254 に ping を送信しています 32 バイトのデータ: 172.16.0.254 からの応答: バイト数 =32 時間 =4ms TTL=64 172.16.0.254 からの応答: バイト数 =32 時間 <1ms TTL=64 172.16.0.254 からの応答: バイト数 =32 時間 <1ms TTL=64 172.16.0.254 からの応答: バイト数 =32 時間 <1ms TTL=64 172.16.0.254 の ping 統計: パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、 ラウンド トリップの概算時間 (ミリ秒): 最小 = 0ms、最大 = 4ms、平均 = 1ms
上記はWindowsでpingコマンドを実行した際の結果です。指定した宛先にICMPエコーを4つ送信します。この例では、エコー要求に対するエコー応答を4つとも全て受信できたことを示しています。
「バイト数=32」は送信したデータサイズ、「時間<1ms」はICMPエコーを送信してからエコー応答を受信するまでにかかった時間、「TTL」はあとルータをいくつ通過できるかを表しています。 最後の行の「ラウンド トリップの概算時間 (ミリ秒)」は、ICMPエコーを送信してからエコー応答を受信するまでにかかた時間のうち「最小時間/最大時間/平均時間」を表しています。 もし、エコー要求が何らかの理由で指定した宛先に届かなかった場合、以下例のようにICMP宛先到達不能メッセージが戻ってきます。
>ping 172.16.0.100 172.16.0.100 に ping を送信しています 32 バイトのデータ: 172.16.0.5 からの応答: 宛先ホストに到達できません。 172.16.0.5 からの応答: 宛先ホストに到達できません。 172.16.0.5 からの応答: 宛先ホストに到達できません。 172.16.0.5 からの応答: 宛先ホストに到達できません。 172.16.0.100 の ping 統計: パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)
ICMP宛先到達不能(Destination Unreachable)メッセージは、何らかの理由でIPパケットを宛先に届けられず、破棄されたことを、送信元ホストに通知するために使用されています。
IPパケットが破棄される原因には、宛先ホストのIP設定が不正である、経路上のルーターに宛先の経路情報が登録されていない、IPパケットがフィルタリング対象になっている、などがあります。
宛先到達不能メッセージは、IPパケットの破棄が発生したルーターやホスト上で自動的に生成されて、破棄対象となったパケットの送信元ホストに送信されます。