インターネット制御メッセージプロトコル(ICMP )は、インターネットプロトコルスイートのサポートプロトコルです[ 2 ]。ルーターなどのネットワークデバイスが、別のIPアドレスとの通信の成功または失敗を示すエラーメッセージや運用情報を送信するために使用されます。たとえば、要求されたサービスが利用できない場合や、ホストまたはルーターに到達できなかった場合にエラーが示されます[ 3 ] 。ICMPは、 TCPやUDPなどのトランスポートプロトコルとは異なり、通常はシステム間でデータを交換するために使用されず、エンドユーザーのネットワークアプリケーションによって定期的に使用されることもありません( pingやtracerouteなどの診断ツールを除く)。
ICMPはRFC 792で定義されているインターネットプロトコルスイートの一部です。ICMPメッセージは通常、診断または制御目的で使用され、またはIP操作のエラーに応じて生成されます(RFC 1122で規定)。ICMPエラーは、発信元パケットの送信元IPアドレスに送信されます。[ 3 ]
例えば、IPデータグラムを転送するすべてのデバイス(中間ルーターなど)は、まずIPヘッダーのTTL( Time To Live)フィールドを1ずつ減らします。その結果TTLが0になった場合、パケットは破棄され、ICMPタイムアウトメッセージがデータグラムの送信元アドレスに送信されます。
一般的に使用される多くのネットワークユーティリティは、ICMPメッセージに基づいています。tracerouteコマンドは、IP TTLヘッダーフィールドを特別に設定したIPデータグラムを送信し、応答として生成されるICMP時間超過メッセージと宛先到達不能メッセージを探すことで実装できます。関連するpingユーティリティは、ICMPエコー要求メッセージとエコー応答メッセージを使用して実装されています。
ICMPは、あたかも上位プロトコルであるかのようにIPの基本機能を利用しますが、実際にはIPの不可欠な構成要素です。ICMPメッセージは標準IPパケット内に含まれていますが、通常は通常のIP処理とは区別された特殊なケースとして処理されます。多くの場合、ICMPメッセージの内容を検査し、ICMPメッセージの送信を促したIPパケットを送信したアプリケーションに適切なエラーメッセージを返す必要があります。
ICMPはネットワーク層プロトコルであり、7層OSIモデルでは第3層プロトコルに相当します。4層TCP/IPモデルに基づくと、ICMPはインターネット層プロトコルであり、インターネット標準RFC 1122 TCP/IP 4層モデルでは第2層プロトコル、最新の5層TCP/IPプロトコル定義(Kozierok、Comer、Tanenbaum、Forouzan、Kurose、Stallingsによる)では第3層プロトコルに相当します。
ICMPパケットにはポート番号は関連付けられていません。これらの番号はTCPやUDPなどの上位のトランスポート層のプロトコルに関連付けられています。 [ 5 ]
ICMPパケットはIPv4パケットにカプセル化されます。[ 3 ]パケットはヘッダーとデータセクションで構成されます。
ICMP ヘッダーはIPv4 ヘッダーの後に始まり、プロトコル番号1で識別されます。[ 6 ]すべての ICMP パケットは 8 バイトのヘッダーと可変サイズのデータセクションを持ちます。ヘッダーの最初の 4 バイトは固定フォーマットですが、最後の 4 バイトは ICMP パケットのタイプとコードによって異なります。[ 3 ]
ICMP エラー メッセージには、IPv4 ヘッダー全体のコピーと、エラー メッセージの原因となった IPv4 パケットの最初の 8 バイト以上のデータを含むデータ セクションが含まれています。ICMP エラー メッセージの長さは 576 バイトを超えてはなりません。[ 1 ]このデータは、ホストがメッセージを適切なプロセスに照合するために使用されます。上位レベルのプロトコルがポート番号を使用する場合、ポート番号は元のデータ グラムのデータの最初の 8 バイトに含まれていると想定されます。[ 2 ]
ICMPパケットのデータセクションのサイズが可変であることは悪用されてきた。「Ping of death」と呼ばれる攻撃では、大きなICMPパケットや断片化されたICMPパケットがサービス拒否攻撃に利用される。ICMPデータは、通信のための秘密チャネルを作成するためにも使用できる。これらのチャネルはICMPトンネルとして知られている。
制御メッセージは、タイプフィールドの値によって識別されます。コードフィールドには、メッセージに関する追加のコンテキスト情報が含まれます。プロトコルが最初に導入されて以来、一部の制御メッセージは非推奨となっています。
Source Quenchは、送信者に対し、ルーターまたはホストに送信されるメッセージの送信レートを下げるよう要求します。このメッセージは、ルーターまたはホストに要求を処理するための十分なバッファ領域がない場合、またはルーターまたはホストのバッファが限界に近づいている場合に生成される可能性があります。
データは、ホストから、または複数のホストから同時に、ネットワーク上の特定のルーターへ非常に高速で送信されます。ルーターにはバッファリング機能がありますが、バッファリングは指定された範囲に制限されています。ルーターは、限られたバッファリングスペースの容量を超えるデータをキューに入れることはできません。そのため、キューがいっぱいになると、キューがいっぱいでなくなるまで受信データは破棄されます。しかし、ネットワーク層には確認応答メカニズムが存在しないため、クライアントはデータが正常に宛先に到達したかどうかを知ることができません。したがって、このような状況を回避するために、ネットワーク層で何らかの対策を講じる必要があります。これらの対策は、ソースクエンチと呼ばれます。
ソースクエンチ機構では、ルータは受信データレートが送信データレートよりもはるかに速いことを検知すると、ICMPメッセージをクライアントに送信し、データ転送速度を落とすか、一定時間待ってから次のデータ送信を試みるように指示します。クライアントはこのメッセージを受信すると、自動的に送信データレートを落とすか、十分な時間待機し、ルータがキューを空にできるようにします。このように、ソースクエンチICMPメッセージはネットワーク層におけるフロー制御として機能します。
研究により「ICMP Source Quenchは輻輳に対する非効率的(かつ不公平)な対策」であることが示唆されたため[ 10 ] 、ルーターによるSource Quenchメッセージの作成は1995年にRFC 1812によって非推奨となった。さらに、Source Quenchメッセージの転送およびそれに対するあらゆる種類の反応(フロー制御アクション)は、2012年にRFC 6633によって非推奨となった。
どこ:

リダイレクトは、データ パケットを別のルートで送信するように要求します。ICMP リダイレクトは、ルータがルーティング情報をホストに伝えるためのメカニズムです。このメッセージは、ホストにルーティング情報を更新するように(パケットを別のルートで送信するように)指示します。ホストがルータ( R1) を介してデータを送信しようとし、R1 がデータを別のルータ (R2) に送信し、ホストから R2 への直接パスが利用可能である場合 (つまり、ホストと R2 が同じサブネットワーク上にある場合)、R1 はリダイレクト メッセージを送信して、宛先への最適なルートが R2 経由であることをホストに通知します。ホストは、ルーティング情報を変更し、その宛先へのパケットを直接 R2 に送信する必要があります。ルータは、元のデータ グラムを意図した宛先に引き続き送信します。[ 15 ]ただし、データ グラムにルーティング情報が含まれている場合、より良いルートが利用可能であっても、このメッセージは送信されません。RFC 1122 では、リダイレクトはゲートウェイによってのみ送信されるべきであり、インターネット ホストによって送信されるべきではないと規定されています。
どこ:
時間超過メッセージは、ゲートウェイによって生成され、有効期限フィールドがゼロになったために破棄されたデータグラムの送信元に通知します。また、ホストが時間制限内に断片化されたデータグラムを再構成できなかった場合にも、時間超過メッセージが送信されることがあります。
タイムアウトメッセージは、tracerouteユーティリティによって、2つのホスト間の経路上のゲートウェイを特定するために使用されます。
どこ:
タイムスタンプは時刻同期に使用されます。送信元のタイムスタンプは、送信者が最後にパケットにアクセスした時刻(午前0時からのミリ秒単位)に設定されます。受信および送信時のタイムスタンプは使用されません。
どこ:
タイムスタンプ応答は、タイムスタンプメッセージに対する応答です。タイムスタンプ応答は、タイムスタンプの送信者によって送信された元のタイムスタンプ、タイムスタンプが受信された日時を示す受信タイムスタンプ、およびタイムスタンプ応答が送信された日時を示す送信タイムスタンプで構成されます。
どこ:
インターネットノードの時計を同期するためにタイムスタンプとタイムスタンプ応答メッセージを使用する方法は、UDPベースのネットワークタイムプロトコルと高精度タイムプロトコルにほぼ置き換えられました。[ 16 ]
アドレスマスク要求は通常、適切なサブネットマスクを取得するためにホストからルーターに送信されます。
受信者はこのメッセージに対し、アドレスマスク付きの返信メッセージで返信してください。
どこ:
ICMP アドレス マスク要求は、ターゲット ネットワークに関する情報を収集するための偵察攻撃の一部として使用される可能性があるため、Cisco IOSでは ICMP アドレス マスク応答はデフォルトで無効になっています。[ 17 ]
アドレスマスク応答は、アドレスマスク要求メッセージに対して適切なサブネットマスクで応答するために使用されます。
どこ:
宛先到達不能は、何らかの理由で宛先に到達できないことをクライアントに通知するために、ホストまたはその受信ゲートウェイ[ 2 ]によって生成されます。このメッセージの理由としては、ホストへの物理的な接続が存在しない(距離が無限大である)、指定されたプロトコルまたはポートがアクティブでない、データを断片化する必要があるが「断片化しない」フラグがオンになっているなどが考えられます。[ 18 ]特に、到達不能なTCPポートは、予想されるような宛先到達不能タイプ3ではなく、TCP RSTで応答します。宛先到達不能は、 IPマルチキャスト送信では報告されません。
以下のフィールド内容で:
ICMPメッセージには追加情報を追加できます。この情報は、ICMP拡張ヘッダーに先行する1つ以上の拡張オブジェクトによって伝送されます。[ 19 ]
拡張オブジェクトは、一般的に以下の構造を持ちます。
これはタイム プロトコルと ICMP タイムスタンプ メッセージから発展したもので、両方の適切な代替手段です。