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通知の書式を決定する。「未使用」とラベル付けされているフィールドは今後の拡張のために予約されており、送信時には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ヘッダーフィールドの値は以下の通りとなる。 バージョン 4 IHL 32ビットワードでのインターネット・ヘッダー長である。 サービスの形式 0 合計長 オクテット単位での、インターネット・ヘッダーとデータの合計の長さである。識別、フラグ、断片化オフセット、断片化の中で使用される。 存在回数 存在保持回数ともいい、このフィールドはデータグラムが処理されるマシンを通る度に1ずつ減らされる。そのためこのフィールドの値は少なくともこのデータグラムが通るゲートウェイの数と同じ大きさでなければならない。 プロトコル ICMP = 1 ヘッダー・チェックサム 送信元アドレス ICMP通知を構成するゲートウェイかホストのアドレスである。違った形で言及されない限り、これは何らかのゲートウェイのアドレスとなる。 宛先アドレス 通知が送られるべきゲートウェイかホストのアドレスである。 以下の種類がある。 （通知の後ろの () 内は和訳の一例であり、一般的な言い方でない可能性がある） エコー要求はタイプ=8で送信される。現在のところ定義されているコードは0だけである。識別子は送信元で適当な値を決める。要求したプロセスのプロセスIDなどが使われる。シーケンス番号は、同じ識別子で繰り返しエコー要求を送信した場合の通し番号である。 宛先となっているホストがエコー要求を受け取ると、発信元と宛先のアドレスを入れ替え、タイプを0（エコー応答）に書き換え、チェックサムを再計算する。識別子とシーケンス番号はエコー要求で指定された値をそのまま返し、どの要求に対応する応答なのかを発信元で判別する際に使う。また、データフィールドも要求の内容をそのまま返す。 ネットワーク診断用コマンドpingは、このEcho / Echo Replyメッセージを使っている。 コードは状況に応じて以下の値をとる。 0 - ネットワーク到達不能 1 - ホスト到達不能 2 - プロトコル到達不能 3 - ポート到達不能 4 - 断片化が必要だがDFフラグが設定されている 5 - 送信元ルーティング失敗 RFC 1122において、以下のコードが追加されている。 6 - 宛先ネットワーク不明 7 - 宛先ホスト不明 8 - 発信元ホストが孤立している 9 - 宛先ネットワークとの通信が管理上禁止 10 - 宛先ホストとの通信が管理上禁止 11 - Type of Serviceに対してネットワーク到達不能 12 - Type of Serviceに対してホスト到達不能 さらにRFC 1812では、以下のコードが追加されている。 13 - 通信が管理上禁止 14 - ホスト優先度違反 15 - 優先度が低すぎる コード9および10は特殊な用途のために定義されており、通常のルーターは13を発生させるよう求めている。 次HopのMTUはRFC 1191で導入された。コード=4のときに設定され、経路MTU探索のために使われる。タイプ=3、コード=4のICMPパケットをファイアウォール等でフィルタしてしまうと、経路MTU探索ブラックホールと呼ばれる問題が発生する。 また、RFC 792 (ICMPプロトコル本体の)Destination Unreachable Messageをみると次HopのMTUの項目はなく、未使用のみとなっている。 受信能力を超えた早さでデータグラムが届き、破棄してしまったことを通知する。ゲートウェイおよび宛先ホストのどちらでも発生する可能性がある。 ゲートウェイから送信元に対して、今後は他のゲートウェイを使うよう指示する。元のデータグラムも破棄せずに転送する。経路変更要求ICMPメッセージを受け取ったホストはルーティングテーブルに追記し、該当する次のデータグラムからは指示されたゲートウェイへ送るようになる。 コードは以下の値をとる。 0 - ネットワークに関する経路変更要求 1 - ホストに関する経路変更要求 2 - Type of Serviceとネットワークに関する経路変更要求 3 - Type of Serviceとホストに関する経路変更要求 Router Advertisement Messageおよび次のRouter Solicitation Messageは、RFC 1256で追加された。 デフォルトゲートウェイのアドレスを通知する。ルーターアドレス数で指定した数だけ列挙することができ、優先度（2の補数表現による符号付き32ビット整数）が大きいものほど優先度が高い。1アドレスあたりの長さは32ビット単位で指定し、このバージョンの形式では2（すなわち1エントリあたり64ビット）となる。有効期限は応答時点からの秒単位で指定する。 コード0は、IPヘッダのTime to live（TTL；存在回数）が0になっても宛先ホストに到達しなかったことを通知する。コード1は、断片の再統合を行う際、制限時間内に断片が揃わなかったことを通知する。 ネットワーク診断用コマンドtracerouteは、TTLを1から順に増やして行き、各中継点からの時間切れ通知から経路を調べる。 パラメータに問題があって、元のデータグラムを破棄したことを通知する。ポインタは元データのうち問題となった箇所を、先頭からのオクテット数で指定する。 タイムスタンプ要求はタイプ=13で送信される。現在のところ定義されているコードは0だけである。識別子およびシーケンス番号はエコー要求と同じ要領で使う。起点タイムスタンプには要求時のタイムスタンプを、UTC 0:00からの経過ミリ秒で設定する。日付は含まれておらず、毎日0に戻ることに注意。 宛先となったホストはタイムスタンプ要求を受け取ると、タイプ=14で応答する。識別子、シーケンス番号、起点タイムスタンプは、要求にセットされていた値をそのままコピーする。また要求を受信した際のタイムスタンプを受信タイムスタンプに、応答を送信する際のタイムスタンプを送信タイムスタンプにセットする。 要求を送信したホストは、応答を受信した際のタイムスタンプと、格納されている起点タイムスタンプを比較することで、往復に要した時間を知ることができる。 タイプ=15の情報要求通知はアドレス0に対して送られる。要求を受信した各ホストおよびゲートウェイは、タイプ=16の情報応答通知を返す。 Address Mask Request MessageおよびAddress Mask Reply Messageは、RFC 950で追加された。