ICMPの重要な役割の1つは、パケットの廃棄など、IPによる通信経路の途中で発生したさまざまなエラーを、送信元に伝えることです。

 また、ネットワークから情報を収集するためにも使われます。例えばpingやtracerouteなどのプログラムは、エコー要求/エコー応答といったICMPメッセージを使っています。

 ICMPで通知された情報は、あるときにはIPの上位プロトコルに通知され、別の場合には何らかの処理が起動されます。IPとICMPは定義としては別のプロトコルですが、仕組みとして一体化したプロトコルと言えます。

ICMPv6とは

 ICMPv6は、ICMPの機能を引き継ぐだけでなく、IPv4でのブロードキャストの代わりにもなるマルチキャスト用のIGMP(Internet Group Management Protocol)の機能や、アドレス解決用のARP/RARP(Address Resolution Protocol/Reverse ARP)の機能なども含んでいます。

 また、RFC1256で拡張されたICMPを使うルーター発見プロトコルについては、IPv6が持つ自動設定機能として近隣探索プロトコル(NDP:Neighbor Discovery Protocol)に取り込まれました。NDPは、ICMPv6のメッセージとして定義されています。

エラーと情報通知の2タイプ

ICMPv6パケットは、IPv6ヘッダー内の「次ヘッダー」に58が指定されます。IPv6ヘッダーに続くのはICMPv6メッセージであり、4バイトのメッセージ・ヘッダーと、メッセージ本体から構成されます(図1の上)。

図1 どちらもIPヘッダーの後ろに、ICMPのメッセージ・ヘッダーとメッセージ本体が続く。ICMPv6パケットでは、チェックサムはIPv6ヘッダーを仮想ヘッダーの形で取り込んで計算を行う。ICMPのチェックサムには、IPv4ヘッダーは含まれない。
図1 どちらもIPヘッダーの後ろに、ICMPのメッセージ・ヘッダーとメッセージ本体が続く。ICMPv6パケットでは、チェックサムはIPv6ヘッダーを仮想ヘッダーの形で取り込んで計算を行う。ICMPのチェックサムには、IPv4ヘッダーは含まれない。
[画像のクリックで拡大表示]

 ICMPv6メッセージ・ヘッダーは、「タイプ」、「コード」、「チェックサム」からなります。メッセージの種類を表すタイプは、1バイトで0~255の範囲になります。前半の0~127がエラー・メッセージ用、後半の128~255は情報通知用です。

 次の「コード」フィールドは付加的な情報を表します。コードが定義されていないタイプでは、ゼロになります。

 チェックサムは、パケット書き換えエラーなどを検出するためのものです。仮想ヘッダー(図2)を前に置き、チェックサムを計算します。仮想ヘッダーは、TCPなどICMPv6以外のプロトコルでも利用します。

図2 IPv6ヘッダーは固定長だが、チェックサム計算を高速に行うため、仮想ヘッダーを使う。IPv6ヘッダーと配置が違っているのは、上位プロトコル側を起点にしてIPv6ヘッダー内の情報にアクセスさせるため。
図2 IPv6ヘッダーは固定長だが、チェックサム計算を高速に行うため、仮想ヘッダーを使う。IPv6ヘッダーと配置が違っているのは、上位プロトコル側を起点にしてIPv6ヘッダー内の情報にアクセスさせるため。
[画像のクリックで拡大表示]

 メッセージ本体には、ICMPv6で通知される情報や、エラーとなったパケットの一部などが入ります。IPv6は、最小MTU(Maximum Transfer Unit)値が「1280バイト」なので、ICMPv6のパケット・サイズ(IPv6ヘッダー、ICMPv6ヘッダー、ICMPv6メッセージ本体の合計)は、これ以下に制限されます。

 ICMPv6で定義されたタイプは、9種類です(表1)。このほかNDP用に5種類のメッセージが定義されています。一方ICMPでは、27個のメッセージが定義されています。ICMPで定義されていてICMPv6では定義されなかったのは、例えば「アドレス・マスク要求/応答」です。アドレス・マスク要求/応答は、IPv6ではNDPに同等の機能が入っています。

[画像のクリックで拡大表示]