ICMPとは
ICMP(Internet Control Message Protocol)は、IPv4通信における制御メッセージやエラー通知をやり取りするためのプロトコルです。RFC 792で定義されています。
IP自体には信頼性を保証する仕組みがなく、パケットが宛先に届かなかった場合でも送信元に通知する手段を持ちません。ICMPは、こうしたIPの通信状況(到達不能・経路上のエラー・疎通確認など)を報告するために用意された補助的なプロトコルであり、ユーザーデータを運ぶために使われることはありません。
1 です。TCPやUDPと同様にIPの上位に位置しますが、実際にはIPスタックの一部として扱われることが多く、独立したトランスポート層プロトコルとは区別されます。IPv6における同等の機能はICMPv6が担っており、ARPの解決機能も含めて別プロトコルとして再定義されています。Ethernetフレーム内でのICMPの位置
ICMPはIPパケットのペイロード(データ部分)として運ばれるため、Ethernetフレーム上では宛先MACアドレスや送信元MACアドレスといったEthernetヘッダーの後、IPヘッダーに続く形で格納されます。ICMP自身はEthernetヘッダーやFCS(フレームチェックシーケンス)を持たず、あくまでIPパケットの中身の一部として扱われる点に注意が必要です。
宛先ホストは、Ethernetヘッダーのタイプフィールド(0x0800 = IPv4)でペイロードがIPパケットであることを、さらにIPヘッダーのProtocolフィールド(1)でそのデータ部分がICMPメッセージであることを判別し、ICMPとして処理します。
ICMPパケットフォーマット
すべてのICMPメッセージは、共通の8バイトヘッダーから始まります。先頭4バイトは全メッセージ共通のフォーマットですが、続く4バイト(Rest of Header)と、その後のData部分の構造はメッセージ種別(Type/Code)によって異なります。
| フィールド名 | サイズ | 説明 |
|---|---|---|
| Type | 1 バイト | メッセージの種別。Echo Request(8)、Echo Reply(0)、Destination Unreachable(3)、Time Exceeded(11)など。 |
| Code | 1 バイト | Typeごとに定義されるサブ種別。同じTypeでもCodeの値によって詳細な意味が変わる。 |
| Checksum | 2 バイト | ICMPメッセージ全体(ヘッダー+データ)を対象とした誤り検出用のチェックサム。 |
| Rest of Header | 4 バイト | メッセージ種別ごとに内容が異なるフィールド。例えばEchoではIdentifierとSequence Numberが入り、Destination UnreachableやTime Exceededでは未使用(0埋め)となる。 |
| Data | 可変長 | メッセージ種別に応じたデータ。Echoでは任意のパディングデータ、エラー系メッセージでは問題の原因となった元のIPパケットの一部が格納される。 |
主なICMPメッセージタイプ
ICMPには多数のメッセージタイプが定義されていますが、実務でよく目にするのは以下のものです。
| Type | 名称 | 主なCode | 概要 |
|---|---|---|---|
| 0 | Echo Reply | 0 | Echo Requestへの応答(ping) |
| 3 | Destination Unreachable | 0〜15 | 宛先に到達できないことの通知 |
| 5 | Redirect | 0〜3 | より適切な経路(ネクストホップ)が存在することの通知 |
| 8 | Echo Request | 0 | 疎通確認要求(ping) |
| 11 | Time Exceeded | 0, 1 | TTL超過などによりパケットが破棄されたことの通知 |
| 12 | Parameter Problem | 0〜2 | IPヘッダーのパラメータに問題があることの通知 |
全タイプ・全Codeの一覧はIANAで管理されています。
ICMPメッセージ生成時の制約(RFC 1122)
ICMPのエラーメッセージが無制限に送出されると、ネットワーク上でエラーの連鎖(ICMPエラーに対してさらにICMPエラーが生成される等)が発生しかねません。これを防ぐため、RFC 1122では以下のような制約が定められています。
- ICMPエラーメッセージに対しては、新たなICMPエラーメッセージを生成しない(Echo ReplyのようなICMP問い合わせメッセージへのエラー応答は例外的に許容される場合がある)。
- 2つ目以降のフラグメント(フラグメントオフセットが0でないパケット)に対してはICMPエラーメッセージを生成しない。
- 宛先がブロードキャストアドレスまたはマルチキャストアドレスであるパケットに対しては、原則としてICMPエラーメッセージを生成しない。
参考
| RFC | タイトル | 概要 |
|---|---|---|
| RFC 792 | Internet Control Message Protocol | ICMPの原典。基本的なメッセージフォーマットとタイプを定義。 |
| RFC 1122 | Requirements for Internet Hosts – Communication Layers | ICMPメッセージの生成に関する制約を含む、ホストの要件を定義。 |