ICMP(Internet Control Message Protocol)は、IPと同じインターネット層に位置するプロトコルでIPのトラブルシューティングに役立つプロトコルです。送信元ホストへIPパケットの送信エラー報告などの制御メッセージを通知する役割を持ちます。
ICMPについての詳細は下記ページを参照してください。
→ ICMPプロトコル
以下はpingコマンドを実行した際のパケットです。
上記ではIPアドレス「10.0.0.1」のPCから「10.0.0.254」宛にICMPエコー要求パケットを4回送信しています。「10.0.0.254」は、エコー要求を4回受信し、エコー応答を4回返しています。
パケット詳細部の「Internet Control Message Protocol」を展開してみると、ICMPがいかに小さいパケットか分かると思います。
重要なのはICMPメッセージの種類はタイプです。上図のパケットは「Type:8 (Echo (ping) request)」となっているため、エコー要求パケットであることがわかります。また、データ部には「abcdefghijk…」と意味のないデータが入っていることがわかります。
対して、応答パケットの詳細部を見てみます。
こちらのパケットは「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という情報があり、より適切なゲートウェイ(ルータ)情報を通知します。
例として以下のネットワーク構成図で考えてみます。
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近隣探索メッセージに変更されるという点です。