Internet Control Message Protocol

Internet Control Message Protocol（インターネット制御通知プロトコル、ICMP）とは、通信処理で使われるプロトコルのひとつで、Internet Protocolのデータグラム処理における誤りの通知や通信に関する情報の通知などのために使用される。ICMPに関するICMP通知は、通知が無限ループに陥るのを防ぐために送られない。
IPv4（Internet Protocol version 4）のための ICMP (ICMPv4) は RFC 792 によって規定され、IPv6（Internet Protocol version 6）のための ICMP (ICMPv6) は RFC 4443 によって規定されている。ICMP は TCP、UDP などと同様にInternet Protocolの上位のプロトコルであるが、Internet Protocolと同様のインターネット層のプロトコルであるかのような特別の処理をされる。
ICMPを利用しているツールにpingやtracerouteなどがある。
通知書式.
ICMPヘッダは以下のようにMACヘッダ・IPヘッダの後ろにある。
 | MACヘッダ | IPヘッダ | ICMPヘッダ | データ...
ICMPヘッダ.
ICMPヘッダは一般的に以下の通りとなる。
データグラムのデータ部分の最初のオクテットはICMPタイプフィールドであり、このフィールドの値は、以降のICMP通知の書式を決定する。「未使用」とラベル付けされているフィールドは今後の拡張のために予約されており、送信時には0を入れなければならないが、受信者はこれらのフィールドを（チェックサムに含めることを除いて）使用すべきではない。チェックサムは、ICMPヘッダの先頭から（すなわちタイプから）データの末尾までを対象に、16ビット単位で算出される。チェックサムフィールド自身も計算対象に入っているが、計算時には0として扱う。バイト数が奇数の場合は末尾に0のバイトがあるものとして計算する。
また、いくつかのタイプでは、ICMP通知が発生する原因となった元データグラムの先頭部分をコピーしている。この種のタイプは以下の形式をとる。
RFC 792では長さフィールドは未使用で、元データグラムの先頭部分は64ビット（8オクテット）と決まっていた。その後RFC 1812およびRFC 4443において、MTUの最小限として保障されるサイズ（IPv4は576オクテット、IPv6は1280オクテット）まで拡張された。RFC 4884において長さフィールドが追加され、この可変長領域の長さを32ビット単位で記述することになった。
ICMP通知は基礎的なIPヘッダーを使用して送られる。個々の型式記述の下で違った形で言及されない限り、ICMPヘッダに先行するIPヘッダーフィールドの値は以下の通りとなる。
通知の種類.
以下の種類がある。
Echo Message（エコー要求通知）・Echo Reply Message（エコー応答通知）.
エコー要求はタイプ=8で送信される。現在のところ定義されているコードは0だけである。識別子は送信元で適当な値を決める。要求したプロセスのプロセスIDなどが使われる。シーケンス番号は、同じ識別子で繰り返しエコー要求を送信した場合の通し番号である。
宛先となっているホストがエコー要求を受け取ると、発信元と宛先のアドレスを入れ替え、タイプを0（エコー応答）に書き換え、チェックサムを再計算する。識別子とシーケンス番号はエコー要求で指定された値をそのまま返し、どの要求に対応する応答なのかを発信元で判別する際に使う。また、データフィールドも要求の内容をそのまま返す。
ネットワーク診断用コマンドpingは、このEcho / Echo Replyメッセージを使っている。
Destination Unreachable Message（宛先到達不可能通知）.
コードは状況に応じて以下の値をとる。
RFC 1122において、以下のコードが追加されている。
さらにRFC 1812では、以下のコードが追加されている。
コード9および10は特殊な用途のために定義されており、通常のルーターは13を発生させるよう求めている。
次HopのMTUはRFC 1191で導入された。コード=4のときに設定され、経路MTU探索のために使われる。タイプ=3、コード=4のICMPパケットをファイアウォール等でフィルタしてしまうと、経路MTU探索ブラックホールと呼ばれる問題が発生する。
また、RFC 792 (ICMPプロトコル本体の)Destination Unreachable Messageをみると次HopのMTUの項目はなく、未使用のみとなっている。
Source Quench Message（送出抑制要求通知）.
受信能力を超えた早さでデータグラムが届き、破棄してしまったことを通知する。ゲートウェイおよび宛先ホストのどちらでも発生する可能性がある。
Redirect Message（経路変更要求通知）.
ゲートウェイから送信元に対して、今後は他のゲートウェイを使うよう指示する。元のデータグラムも破棄せずに転送する。経路変更要求ICMPメッセージを受け取ったホストはルーティングテーブルに追記し、該当する次のデータグラムからは指示されたゲートウェイへ送るようになる。
コードは以下の値をとる。
Router Advertisement Message（ルーター広告通知）.
Router Advertisement Messageおよび次のRouter Solicitation Messageは、RFC 1256で追加された。
デフォルトゲートウェイのアドレスを通知する。ルーターアドレス数で指定した数だけ列挙することができ、優先度（2の補数表現による符号付き32ビット整数）が大きいものほど優先度が高い。1アドレスあたりの長さは32ビット単位で指定し、このバージョンの形式では2（すなわち1エントリあたり64ビット）となる。有効期限は応答時点からの秒単位で指定する。
Time Exceeded Message（時間切れ通知）.
コード0は、IPヘッダのTime to live（TTL；存在回数）が0になっても宛先ホストに到達しなかったことを通知する。コード1は、断片の再統合を行う際、制限時間内に断片が揃わなかったことを通知する。
ネットワーク診断用コマンドtracerouteは、TTLを1から順に増やして行き、各中継点からの時間切れ通知から経路を調べる。
Parameter Problem Message（不正引数通知）.
パラメータに問題があって、元のデータグラムを破棄したことを通知する。ポインタは元データのうち問題となった箇所を、先頭からのオクテット数で指定する。
Timestamp Message（タイムスタンプ要求通知）・Timestamp Reply Message（タイムスタンプ応答通知）.
タイムスタンプ要求はタイプ=13で送信される。現在のところ定義されているコードは0だけである。識別子およびシーケンス番号はエコー要求と同じ要領で使う。起点タイムスタンプには要求時のタイムスタンプを、UTC 0:00からの経過ミリ秒で設定する。日付は含まれておらず、毎日0に戻ることに注意。
宛先となったホストはタイムスタンプ要求を受け取ると、タイプ=14で応答する。識別子、シーケンス番号、起点タイムスタンプは、要求にセットされていた値をそのままコピーする。また要求を受信した際のタイムスタンプを受信タイムスタンプに、応答を送信する際のタイムスタンプを送信タイムスタンプにセットする。
要求を送信したホストは、応答を受信した際のタイムスタンプと、格納されている起点タイムスタンプを比較することで、往復に要した時間を知ることができる。
Information Request Message（情報要求通知）・Information Reply Message（情報応答通知）.
タイプ=15の情報要求通知はアドレス0に対して送られる。要求を受信した各ホストおよびゲートウェイは、タイプ=16の情報応答通知を返す。
Address Mask Request Message（アドレスマスク要求通知）・Address Mask Reply Message（アドレスマスク応答通知）.
Address Mask Request MessageおよびAddress Mask Reply Messageは、RFC 950で追加された。