メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. IPv4記事一覧/

ICMP(Internet Control Message Protocol)とは

目次

ICMPとは

ICMP(Internet Control Message Protocol)は、IPv4通信における制御メッセージやエラー通知をやり取りするためのプロトコルです。RFC 792で定義されています。

IP自体には信頼性を保証する仕組みがなく、パケットが宛先に届かなかった場合でも送信元に通知する手段を持ちません。ICMPは、こうしたIPの通信状況(到達不能・経路上のエラー・疎通確認など)を報告するために用意された補助的なプロトコルであり、ユーザーデータを運ぶために使われることはありません。

ICMPはIPヘッダーの直後に続く形でIPパケットのペイロードとして運ばれ、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)によって異なります。

フィールド名サイズ説明
Type1 バイトメッセージの種別。Echo Request(8)、Echo Reply(0)、Destination Unreachable(3)、Time Exceeded(11)など。
Code1 バイトTypeごとに定義されるサブ種別。同じTypeでもCodeの値によって詳細な意味が変わる。
Checksum2 バイトICMPメッセージ全体(ヘッダー+データ)を対象とした誤り検出用のチェックサム。
Rest of Header4 バイトメッセージ種別ごとに内容が異なるフィールド。例えばEchoではIdentifierとSequence Numberが入り、Destination UnreachableやTime Exceededでは未使用(0埋め)となる。
Data可変長メッセージ種別に応じたデータ。Echoでは任意のパディングデータ、エラー系メッセージでは問題の原因となった元のIPパケットの一部が格納される。

主なICMPメッセージタイプ

ICMPには多数のメッセージタイプが定義されていますが、実務でよく目にするのは以下のものです。

Type名称主なCode概要
0Echo Reply0Echo Requestへの応答(ping)
3Destination Unreachable0〜15宛先に到達できないことの通知
5Redirect0〜3より適切な経路(ネクストホップ)が存在することの通知
8Echo Request0疎通確認要求(ping)
11Time Exceeded0, 1TTL超過などによりパケットが破棄されたことの通知
12Parameter Problem0〜2IPヘッダーのパラメータに問題があることの通知

全タイプ・全Codeの一覧はIANAで管理されています。

ICMPメッセージ生成時の制約(RFC 1122)

ICMPのエラーメッセージが無制限に送出されると、ネットワーク上でエラーの連鎖(ICMPエラーに対してさらにICMPエラーが生成される等)が発生しかねません。これを防ぐため、RFC 1122では以下のような制約が定められています。

  • ICMPエラーメッセージに対しては、新たなICMPエラーメッセージを生成しない(Echo ReplyのようなICMP問い合わせメッセージへのエラー応答は例外的に許容される場合がある)。
  • 2つ目以降のフラグメント(フラグメントオフセットが0でないパケット)に対してはICMPエラーメッセージを生成しない。
  • 宛先がブロードキャストアドレスまたはマルチキャストアドレスであるパケットに対しては、原則としてICMPエラーメッセージを生成しない。
これらの制約があるため、ICMPは「エラーを報告することはあっても、エラーの報告自体が新たなエラーの連鎖を生まない」設計になっています。

参考

RFCタイトル概要
RFC 792Internet Control Message ProtocolICMPの原典。基本的なメッセージフォーマットとタイプを定義。
RFC 1122Requirements for Internet Hosts – Communication LayersICMPメッセージの生成に関する制約を含む、ホストの要件を定義。

関連記事