ICMP(Internet Control Message Protocol)とは、IPの機能を補完するためのプロトコルです。IPプロトコル自体の機能としては、IPアドレスの情報からネットワークを識別して、特定のコンピュータ(送信元)から特定のコンピュータ(宛先)まで、データパケットを届けることに終始一貫しているため、実際に自分自身で送受信が成功したのかどうかの確認を行いません。この確認を行うためには、上位の層であるトランスポート層(TCPプロトコルなど)の協力を得なくてはなりません。しかし、できれば同階層であるインターネット層でもある程度の信頼性を確保しておきたいところです。そこで登場するのがICMPプロトコルで、そのプロトコルを利用したコマンドがほとんど全てのコンピュータに実装されている「Pingコマンド」です(下図参照)。他にもデータグラムの配送中にエラーが発生したことを始点ホストへ通知するさいに使われたり、非効率なルーティングを行っているときにルーティングテーブルを更新するためなどに使用されます。
例1)パケットが到達した場合
例2)ネットワーク不通のため、パケットが相手に届かない場合
例3)パケットが相手に届く前に時間切れとなってしまった場合
上記の図を見てもわかるとおり、相手コンピュータが返すICMPメッセージによってインターネット層でもある程度のネットワーク状況が把握できるようになっています。そのICMPの種類も1種類だけではなく、何種類かのメッセージがあることもおわかりになるでしょう。以下の表にその種類が記述されているので参考にしてください。
#defineされている文字 |
コード |
意味 |
ICMP_ECHOREPLY |
0 |
エコー応答 |
ICMP_UNREACH |
3 |
終点到達不能 |
ICMP_SOURCEQUENCH |
4 |
始点抑制 |
ICMP_REDIRECT |
5 |
リダイレクト |
ICMP_ECHO |
8 |
エコー要求 |
ICMP_TIMXCEED |
11 |
時間超過 |
ICMP_PARAMPROB |
12 |
パラメータエラー |
|
ただし、ひとつだけ注意しなくてはいけないことはICMPプロトコルを利用しても、ネットワークの状態が漠然とわかるだけで、完全に信頼してはいけないということです。ICMPはあくまでもIPプロトコルの機能を補完し、ネットワークの状態がどのようになっているのかを事前に知っておくために利用するものです。実際に、確実な信頼性を確保するためにはその上位層であるトランスポート層やアプリケーション層に依存しなくてはなりません。
このようにTCP/IPにおけるデータ通信は、上下層との連携があってはじめて成り立っているということを再確認しておいてください。なお、「Pingコマンド」の実践においては「
PINGコマンド/MTU値の調整」を参考にしてください。以下に記すものはICMPの構造について記したものです。管理人の労力の関係上、全てのICMPの構造を説明するのは不可能なので、エコー要求(Type8)、エコー応答(Type0)、到達不能(Type3)について簡単に解説しておきました。興味のある方は参考にしてください。