ICMP(Internet Control Message Protocol)

ICMP(Internet Control Message Protocol)は、IPと同じインターネット層に位置するプロトコルでIPのトラブルシューティングに役立つプロトコルです。送信元ホストへIPパケットの送信エラー報告などの制御メッセージを通知する役割を持ちます。

ICMPについての詳細は下記ページを参照してください。
 → ICMPプロトコル

以下はpingコマンドを実行した際のパケットです。

pingコマンド実行例

上記ではIPアドレス「10.0.0.1」のPCから「10.0.0.254」宛にICMPエコー要求パケットを4回送信しています。「10.0.0.254」は、エコー要求を4回受信し、エコー応答を4回返しています。

pingパケット詳細部

パケット詳細部の「Internet Control Message Protocol」を展開してみると、ICMPがいかに小さいパケットか分かると思います。

重要なのはICMPメッセージの種類はタイプです。上図のパケットは「Type:8 (Echo (ping) request)」となっているため、エコー要求パケットであることがわかります。また、データ部には「abcdefghijk…」と意味のないデータが入っていることがわかります。

対して、応答パケットの詳細部を見てみます。

pingコマンド応答パケット詳細部

こちらのパケットは「Type:0 (Echo (ping) reply)」となっているため、エコー応答パケットであることがわかります。また、データ部にはエコー要求パケットと同じく意味のないデータが入っています。

pingコマンドではエコー要求パケットを送信してからエコー応答パケットを受信するまでの時間も計測してくれますが、pingコマンドのオプションによりデータサイズを変えることができるため、例えばデータサイズを実データと同じサイズに指定してやれば、より実用的なスループットを計測することもできます。

送信エラー報告

上記はエコー応答が正しく返ってきたときの例ですが、今度はエコー応答が返らないときの例を試してみます。

PC(192.168.0.1)と同じネットワーク(192.168.0.0/24)に存在しないIPアドレスに対してpingコマンドを実行してみます。

> ping 192.168.0.200

192.168.0.200 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。

192.168.0.200 の ping 統計:
    パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)、

上記のようにタイムアウトとなります。
(環境によっては「宛先ホストに到達できません。」と表示されるかもしれません。その場合は、自分自身のIPアドレスからエコー応答(Host unreachable)が返っているはずです。)

次に、ルータが知らないネットワークにpingコマンドを実行してみます。

> ping 10.0.0.254

10.0.0.254 に ping を送信しています 32 バイトのデータ:
192.168.0.254 からの応答: 宛先ホストに到達できません。
192.168.0.254 からの応答: 宛先ホストに到達できません。
192.168.0.254 からの応答: 宛先ホストに到達できません。
192.168.0.254 からの応答: 宛先ホストに到達できません。

10.0.0.254 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、

「宛先ホストに到達できません」と表示されます。また、そのメッセージを返しているのはルータ(192.168.0.254)です。

宛先ホストに到達できません

PCは宛先のネットワークを知らないためデフォルトゲートウェイであるルータにパケットを送信しますが、ルータからも宛先ホストに到達できないため、ルータが「到達できません」というメッセージを返しています。

キャプチャしたパケットを見ると、ルータからタイプ3(宛先到達不能)、コード1(宛先ホストに到達できない)が返されているのが分かります。

ICMPリダイレクト

ICMPの使われ方として、ICMPリダイレクトがあります。ICMPリダイレクトは、今より適切な経路があることを伝えるICMP タイプ5(経路変更)のメッセージです。このICMPパケットの中で、Gateway Addressという情報があり、より適切なゲートウェイ(ルータ)情報を通知します。

例として以下のネットワーク構成図で考えてみます。

icmpリダイレクト

PCのデフォルトゲートウェイ設定は192.168.0.254としています。この構成で10.0.0.0/24のネットワークに通信しようとすると、まずルータ1に通信し、それからルータ2に行きます。

これでも通信は可能ですが、ルータ1への通信が無駄であり、ルータ2へ直接通信した方が効率が良いことがわかると思います。そこで、もっと良い経路があることを伝えるのがICMPリダイレクトというわけです。

この仕組みを使用し、HTTPアクセス時などで他に最適経路があるならばその経路を通知し、無駄のない通信を行うことができます。

ICMPv6

最後に少し余談となりますが、IPv6ではIPv4に比べてICMPの役割が非常に大きくなります。(IPv6でのICMPをICMPv6と表現します。)

特に大きいのか、IPアドレスからMACアドレスを調べる仕組みとしてIPv4ではARPが担当していましたが、IPv6からはICMP近隣探索メッセージに変更されるという点です。