Internet Control Message Protocol

Internet Control Message Protocolとは、通信処理で使われるプロトコルのひとつで、Internet Protocolのデータグラム処理における誤りの通知や通信に関する情報の通知などのために使用される。ICMPに関するICMP通知は、通知が無限ループに陥るのを防ぐために送られない。

IPv4のための ICMP  は 792}} によって規定され、IPv6のための ICMP  は 4443}} によって規定されている。ICMP は TCP、UDP などと同様にInternet Protocolの上位のプロトコルであるが、Internet Protocolと同様のインターネット層のプロトコルであるかのような特別の処理をされる。

ICMPを利用しているツールにpingやtracerouteなどがある。

1. 通知書式
-------

ICMPヘッダは以下のようにMACヘッダ・IPヘッダの後ろにある。 +------------+-----------+-------------+----------- | MACヘッダ | IPヘッダ | ICMPヘッダ | データ... +------------+-----------+-------------+-----------

1.1. ICMPヘッダ
------------

ICMPヘッダは一般的に以下の通りとなる。

データグラムのデータ部分の最初のオクテットはICMPタイプフィールドであり、このフィールドの値は、以降のICMP通知の書式を決定する。「未使用」とラベル付けされているフィールドは今後の拡張のために予約されており、送信時には0を入れなければならないが、受信者はこれらのフィールドを使用すべきではない。チェックサムは、ICMPヘッダの先頭からデータの末尾までを対象に、16ビット単位で算出される。チェックサムフィールド自身も計算対象に入っているが、計算時には0として扱う。バイト数が奇数の場合は末尾に0のバイトがあるものとして計算する。

また、いくつかのタイプでは、ICMP通知が発生する原因となった元データグラムの先頭部分をコピーしている。この種のタイプは以下の形式をとる。

792}}では長さフィールドは未使用で、元データグラムの先頭部分は64ビットと決まっていた。その後1812}}および4443}}において、MTUの最小限として保障されるサイズまで拡張された。4884}}において長さフィールドが追加され、この可変長領域の長さを32ビット単位で記述することになった。

ICMP通知は基礎的なIPヘッダーを使用して送られる。個々の型式記述の下で違った形で言及されない限り、ICMPヘッダに先行するIPヘッダーフィールドの値は以下の通りとなる。

バージョン 4 IHL 32ビットワードでのインターネット・ヘッダー長である。 サービスの形式 0 合計長 オクテット単位での、インターネット・ヘッダーとデータの合計の長さである。識別、フラグ、断片化オフセット、断片化の中で使用される。 存在回数 存在保持回数ともいい、このフィールドはデータグラムが処理されるマシンを通る度に1ずつ減らされる。そのためこのフィールドの値は少なくともこのデータグラムが通るゲートウェイの数と同じ大きさでなければならない。 プロトコル ICMP = 1 ヘッダー・チェックサム 送信元アドレス ICMP通知を構成するゲートウェイかホストのアドレスである。違った形で言及されない限り、これは何らかのゲートウェイのアドレスとなる。 宛先アドレス 通知が送られるべきゲートウェイかホストのアドレスである。

2. 通知の種類
--------

以下の種類がある。



2.1. EchoEcho Message・Echo Reply Message
----------------------------------------

エコー要求はタイプ=8で送信される。現在のところ定義されているコードは0だけである。識別子は送信元で適当な値を決める。要求したプロセスのプロセスIDなどが使われる。シーケンス番号は、同じ識別子で繰り返しエコー要求を送信した場合の通し番号である。

宛先となっているホストがエコー要求を受け取ると、発信元と宛先のアドレスを入れ替え、タイプを0に書き換え、チェックサムを再計算する。識別子とシーケンス番号はエコー要求で指定された値をそのまま返し、どの要求に対応する応答なのかを発信元で判別する際に使う。また、データフィールドも要求の内容をそのまま返す。

ネットワーク診断用コマンドpingは、このEcho / Echo Replyメッセージを使っている。

2.2. Destination Unreachable}}Destination Unreachable Message
-------------------------------------------------------------

コードは状況に応じて以下の値をとる。

0 - ネットワーク到達不能
1 - ホスト到達不能
2 - プロトコル到達不能
3 - ポート到達不能
4 - 断片化が必要だがDFフラグが設定されている
5 - 送信元ルーティング失敗1122}}において、以下のコードが追加されている。

6 - 宛先ネットワーク不明
7 - 宛先ホスト不明
8 - 発信元ホストが孤立している
9 - 宛先ネットワークとの通信が管理上禁止
10 - 宛先ホストとの通信が管理上禁止
11 - Type of Serviceに対してネットワーク到達不能
12 - Type of Serviceに対してホスト到達不能さらに1812}}では、以下のコードが追加されている。

13 - 通信が管理上禁止
14 - ホスト優先度違反
15 - 優先度が低すぎるコード9および10は特殊な用途のために定義されており、通常のルーターは13を発生させるよう求めている。

次HopのMTUは1191}}で導入された。コード=4のときに設定され、経路MTU探索のために使われる。タイプ=3、コード=4のICMPパケットをファイアウォール等でフィルタしてしまうと、経路MTU探索ブラックホールと呼ばれる問題が発生する。

また、792}} Destination Unreachable Messageをみると次HopのMTUの項目はなく、未使用のみとなっている。

2.3. Source Quench}}Source Quench Message
-----------------------------------------

受信能力を超えた早さでデータグラムが届き、破棄してしまったことを通知する。ゲートウェイおよび宛先ホストのどちらでも発生する可能性がある。

2.4. Redirect}}Redirect Message
-------------------------------

ゲートウェイから送信元に対して、今後は他のゲートウェイを使うよう指示する。元のデータグラムも破棄せずに転送する。経路変更要求ICMPメッセージを受け取ったホストはルーティングテーブルに追記し、該当する次のデータグラムからは指示されたゲートウェイへ送るようになる。

コードは以下の値をとる。

0 - ネットワークに関する経路変更要求
1 - ホストに関する経路変更要求
2 - Type of Serviceとネットワークに関する経路変更要求
3 - Type of Serviceとホストに関する経路変更要求

2.5. Router Advertisement}}Router Advertisement Message
-------------------------------------------------------

Router Advertisement Messageおよび次のRouter Solicitation Messageは、1256}}で追加された。

デフォルトゲートウェイのアドレスを通知する。ルーターアドレス数で指定した数だけ列挙することができ、優先度が大きいものほど優先度が高い。1アドレスあたりの長さは32ビット単位で指定し、このバージョンの形式では2となる。有効期限は応答時点からの秒単位で指定する。

2.6. Router Solicitation}}Router Solicitation Message
-----------------------------------------------------



2.7. Time Exceeded}}Time Exceeded Message
-----------------------------------------

コード0は、IPヘッダのTime to liveが0になっても宛先ホストに到達しなかったことを通知する。コード1は、断片の再統合を行う際、制限時間内に断片が揃わなかったことを通知する。

ネットワーク診断用コマンドtracerouteは、TTLを1から順に増やして行き、各中継点からの時間切れ通知から経路を調べる。

2.8. Parameter Problem}}Parameter Problem Message
-------------------------------------------------

パラメータに問題があって、元のデータグラムを破棄したことを通知する。ポインタは元データのうち問題となった箇所を、先頭からのオクテット数で指定する。

2.9. TimestampTimestamp Message・Timestamp Reply Message
-------------------------------------------------------

タイムスタンプ要求はタイプ=13で送信される。現在のところ定義されているコードは0だけである。識別子およびシーケンス番号はエコー要求と同じ要領で使う。起点タイムスタンプには要求時のタイムスタンプを、UTC 0:00からの経過ミリ秒で設定する。日付は含まれておらず、毎日0に戻ることに注意。

宛先となったホストはタイムスタンプ要求を受け取ると、タイプ=14で応答する。識別子、シーケンス番号、起点タイムスタンプは、要求にセットされていた値をそのままコピーする。また要求を受信した際のタイムスタンプを受信タイムスタンプに、応答を送信する際のタイムスタンプを送信タイムスタンプにセットする。

要求を送信したホストは、応答を受信した際のタイムスタンプと、格納されている起点タイムスタンプを比較することで、往復に要した時間を知ることができる。

2.10. Information RequestInformation Request Message・Information Reply Message
------------------------------------------------------------------------------

タイプ=15の情報要求通知はアドレス0に対して送られる。要求を受信した各ホストおよびゲートウェイは、タイプ=16の情報応答通知を返す。

2.11. Address Mask RequestAddress Mask Request Message・Address Mask Reply Message
---------------------------------------------------------------------------------

Address Mask Request MessageおよびAddress Mask Reply Messageは、950}}で追加された。

3. 脚注
-----

4. 参考文献
-------

5. 関連項目
-------

Internet Control Message Protocol for IPv6

6. 外部リンク
--------

792}} - Internet Control Message Protocol
950}} - Internet Standard Subnetting Procedure
1122}} - Requirements for Internet Hosts -- Communication Layers
1191}} - Path MTU Discovery
1256}} - ICMP Router Discovery Messages
1812}} - Requirements for IP Version 4 Routers
4884}} - Extended ICMP to Support Multi-Part Messages