ICMP活用例(pingコマンド)

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パケットの破棄が発生したルーターやホスト上で自動的に生成されて、破棄対象となったパケットの送信元ホストに送信されます。