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 [ 1] などがある。
ICMPヘッダは以下のようにMACヘッダ・IPヘッダの後ろにある。
+------------+-----------+-------------+----------- |MAC ヘッダ |IP ヘッダ | ICMPヘッダ | データ... +------------+-----------+-------------+----------- ICMPヘッダは一般的に以下の通りとなる。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ コード チェックサム データ
データグラムのデータ部分の最初のオクテット はICMPタイプフィールドであり、このフィールドの値は、以降のICMP通知の書式を決定する。「未使用」とラベル付けされているフィールドは今後の拡張のために予約されており、送信時には0を入れなければならないが、受信者はこれらのフィールドを(チェックサムに含めることを除いて)使用すべきではない。チェックサムは、ICMPヘッダの先頭から(すなわちタイプから)データの末尾までを対象に、16ビット単位で算出される。チェックサムフィールド自身も計算対象に入っているが、計算時には0として扱う。バイト数が奇数の場合は末尾に0のバイトがあるものとして計算する。
また、いくつかのタイプでは、ICMP通知が発生する原因となった元データグラムの先頭部分をコピーしている。この種のタイプは以下の形式をとる。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ コード チェックサム 未使用 長さ 未使用 IPヘッダ + 元データグラムの先頭部分
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通知を構成するゲートウェイ かホスト のアドレス である。違った形で言及されない限り、これは何らかのゲートウェイのアドレスとなる。 宛先アドレス 通知が送られるべきゲートウェイかホストのアドレスである。 以下の種類がある。
(通知の後ろの () 内は和訳の一例であり、一般的な言い方でない可能性がある)
Echo Message(エコー要求通知)・Echo Reply Message(エコー応答通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ(0または8) コード (0) チェックサム 識別子 シーケンス番号 データ(可変長)
エコー要求はタイプ=8で送信される。現在のところ定義されているコードは0だけである。識別子は送信元で適当な値を決める。要求したプロセスのプロセスIDなどが使われる。シーケンス番号は、同じ識別子で繰り返しエコー要求を送信した場合の通し番号である。
宛先となっているホストがエコー要求を受け取ると、発信元と宛先のアドレスを入れ替え、タイプを0(エコー応答)に書き換え、チェックサムを再計算する。識別子とシーケンス番号はエコー要求で指定された値をそのまま返し、どの要求に対応する応答なのかを発信元で判別する際に使う。また、データフィールドも要求の内容をそのまま返す。
ネットワーク診断用コマンドping は、このEcho / Echo Replyメッセージを使っている。
Destination Unreachable Message(宛先到達不可能通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ (3) コード チェックサム 未使用 次HopのMTU IPヘッダ + 元データのデータグラムの先頭部分
コードは状況に応じて以下の値をとる。
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の項目はなく、未使用のみとなっている。
Source Quench Message(送出抑制要求通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ (4) コード (0) チェックサム 未使用 長さ 未使用 IPヘッダ + 元データのデータグラムの先頭部分
受信能力を超えた早さでデータグラムが届き、破棄してしまったことを通知する。ゲートウェイおよび宛先ホストのどちらでも発生する可能性がある。
Redirect Message(経路変更要求通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ (5) コード チェックサム ゲートウェイのIPアドレス IPヘッダ + 元データのデータグラムの先頭部分
ゲートウェイから送信元に対して、今後は他のゲートウェイを使うよう指示する。元のデータグラムも破棄せずに転送する。経路変更要求ICMPメッセージを受け取ったホストはルーティングテーブルに追記し、該当する次のデータグラムからは指示されたゲートウェイへ送るようになる。
コードは以下の値をとる。
0 - ネットワークに関する経路変更要求 1 - ホストに関する経路変更要求 2 - Type of Serviceとネットワークに関する経路変更要求 3 - Type of Serviceとホストに関する経路変更要求 Router Advertisement Message(ルーター広告通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ (9) コード (0) チェックサム ルーターアドレス数 1エントリあたりの長さ 有効期限 ルーターアドレスその1 優先度その1 ルーターアドレスその2 優先度その2 …
Router Advertisement Messageおよび次のRouter Solicitation Messageは、RFC 1256 で追加された。
デフォルトゲートウェイのアドレスを通知する。ルーターアドレス数で指定した数だけ列挙することができ、優先度(2の補数 表現による符号付き32ビット整数)が大きいものほど優先度が高い。1アドレスあたりの長さは32ビット単位で指定し、このバージョンの形式では2(すなわち1エントリあたり64ビット)となる。有効期限は応答時点からの秒単位で指定する。
Router Solicitation Message(ルーター要請通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ (10) コード (0) チェックサム 未使用
Time Exceeded Message(時間切れ通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ (11) コード チェックサム 未使用 長さ 未使用 IPヘッダ + 元データのデータグラムの先頭部分
コード0は、IPヘッダのTime to live (TTL;存在回数)が0になっても宛先ホストに到達しなかったことを通知する。コード1は、断片の再統合を行う際、制限時間内に断片が揃わなかったことを通知する。
ネットワーク診断用コマンドtraceroute は、TTLを1から順に増やして行き、各中継点からの時間切れ通知から経路を調べる。
Parameter Problem Message(不正引数通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ (12) コード (0) チェックサム ポインタ 長さ 未使用 IPヘッダ + 元データのデータグラムの先頭部分
パラメータに問題があって、元のデータグラムを破棄したことを通知する。ポインタは元データのうち問題となった箇所を、先頭からのオクテット数で指定する。
Timestamp Message(タイムスタンプ要求通知)・Timestamp Reply Message(タイムスタンプ応答通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ(13または14) コード (0) チェックサム 識別子 シーケンス番号 起点タイムスタンプ 受信タイムスタンプ 送信タイムスタンプ
タイムスタンプ要求はタイプ=13で送信される。現在のところ定義されているコードは0だけである。識別子およびシーケンス番号はエコー要求と同じ要領で使う。起点タイムスタンプには要求時のタイムスタンプを、UTC 0:00からの経過ミリ秒で設定する。日付は含まれておらず、毎日0に戻ることに注意。
宛先となったホストはタイムスタンプ要求を受け取ると、タイプ=14で応答する。識別子、シーケンス番号、起点タイムスタンプは、要求にセットされていた値をそのままコピーする。また要求を受信した際のタイムスタンプを受信タイムスタンプに、応答を送信する際のタイムスタンプを送信タイムスタンプにセットする。
要求を送信したホストは、応答を受信した際のタイムスタンプと、格納されている起点タイムスタンプを比較することで、往復に要した時間を知ることができる。
Information Request Message(情報要求通知)・Information Reply Message(情報応答通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ(15または16) コード (0) チェックサム 識別子 シーケンス番号
タイプ=15の情報要求通知はアドレス0に対して送られる。要求を受信した各ホストおよびゲートウェイは、タイプ=16の情報応答通知を返す。
Address Mask Request Message(アドレスマスク要求通知)・Address Mask Reply Message(アドレスマスク応答通知)[ 編集 ] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 タイプ(17または18) コード (0) チェックサム 識別子 シーケンス番号 アドレスマスク
Address Mask Request MessageおよびAddress Mask Reply Messageは、RFC 950 で追加された。
RFC 792 - Internet Control Message ProtocolRFC 950 - Internet Standard Subnetting ProcedureRFC 1122 - Requirements for Internet Hosts -- Communication LayersRFC 1191 - Path MTU DiscoveryRFC 1256 - ICMP Router Discovery MessagesRFC 1812 - Requirements for IP Version 4 RoutersRFC 4884 - Extended ICMP to Support Multi-Part Messages