広告
広告
https://www.7key.jp/nw/tcpip/ip/icmp.html#icmpICMPはIPネットワークとして接続されたホスト間で通信を行う際に、通信状態の診断を行ったりエラー通知を行ったりするために使われるネットワーク層のプロトコルです。IPは送信元のホストから宛先ホストまでパケットを届けることが主な機能となっています。ただ実際には、IPは一方的にパケットを宛先に送りつけるだけで(少し語弊がありますが)、送信したパケットが宛先ホストまで無事に届いているのかどうかは送信元ホスト(のネットワーク層)では分からないのです。無事にデータが宛先に届いたかどうかを知るためは更に上位層のプロトコルであるTCPの協力が必要なのですが、TCPに頼らずともネットワーク層である程度の信頼性を確保するために考えられたのがICMPというわけです。もともとはネットワークに障害があった際に、その経路上のルータやホストが送信元ホストへその障害を知らせるためのプロトコルでした。そのためにエラー報告プロトコルとも呼ばれています。
https://www.7key.jp/nw/tcpip/ip/icmp.html#structureICMPはIP上で動く仕組みとなっていますので、当然 IPパケットに載せられて伝達されることとなります。トランスポート層のセグメント部分がそのままICMPメッセージと考えてもらえれば分かりやすいかもしれません(Figure:ICMP-01)。

ICMPの種類はTypeフィールドの性質によって「Queryメッセージ」と「Errorメッセージ」に大きく分けられます。Queryメッセージは調査のために使われるメッセージ、Errorメッセージはエラーを通知するためのメッセージと位置付けされています。上図(Figure:ICMP-01)の「Type」フィールドに下表の番号(数字)で表されています。
| タイプ | 説明 | 意味 | 種類 |
|---|---|---|---|
| 0 | Echo Reply | Echo要求への返答 | Query |
| 3 | Destination Unreachable | 宛先到達不能 | Error |
| 4 | Source Quench | 軋轢発生による転送抑制指示 | Error |
| 5 | Redirect | より最適な経路への変更指示 | Error |
| 8 | Echo Request | Echo要求 | Query |
| 9 | Router Advertisment | ルータ通知 | Query |
| 10 | Router Solicitation | ルータ要求 | Query |
| 11 | Time Exceeded | TTLの超過によるパケットの破棄報告 | Error |
| 12 | Paramter Problem | パケットパラメータにおけるエラー | Error |
| 13 | Timestamp Request | タイムスタンプ保持要求 | Query |
| 14 | Timestamp Reply | タイムスタンプ保持要求への返答。 | Query |
| 15 | Information Request (未使用) | - | Query |
| 16 | Information Reply (未使用) | - | Query |
| 17 | AddressMask Request | アドレスマスク要求。サブネット内のサブネットマスク値を要求する | Query |
| 18 | AddressMask Reply | アドレスマスク要求への返答 | Query |
また、Errorメッセージの中でも「Destination Unreachable(Type=3)エラーの場合は、上図1「Code」フィールドに以下の詳細な障害情報が含まれることとなっています。
| Code | 説明 | 意味 |
|---|---|---|
| 0 | Network Unreachable | ネットワークへ到達不能 |
| 1 | Host Unreachable | ホストへ到達不能 |
| 2 | Protocol Unreachable | そのプロトコルは使用できない |
| 3 | Port Unreachable | 対象ポートが開いていない |
| 4 | Fragmentation Needed and DF set | パケットを分割したいが不可となっている |
| 5 | Source Route Failed | ソースルートが不明 |
| 6 | Destinantion Network Unknown | 宛先ネットワークが不明 |
| 7 | Destinantion Host Unknown | 宛先ホストが不明 |
| 8 | Source Host Isolated | 宛先ホストがネットワークから分離されている |
| 9 | Network Administartively Prohibited | 宛先ネットワークとの通信が禁止されている |
| 10 | Destinantion Host Administartively Prohibited | 宛先ホストとの通信が禁止されている |
| 11 | Network Unreachable For TOS | 指定したサービスタイプでは宛先ネットワークへ到達不能 |
| 12 | Host Unreachable For TOS | 指定したサービスタイプでは宛先ホストへ到達不能 |
| 13 | Communication Administratively Prohibited | フィルタリング設定により通信禁止 |
| 14 | Host Precedence Violation | ホストの優先順位侵害 |
| 15 | Precedence Cutoff in Effect | 優先順位により遮断発動 |
Dataフィールドには、「Echo Request」の場合は任意の文字列で埋められ、Errorメッセージの場合はどのパケットに対するエラーかを示すために、対応するパケットのIPヘッダが格納されます。
Type=8であるEchoRequestの返答として返される応答メッセージです。主に「ping」コマンドでネットワーク機器間の疎通テストに使われます。
Echo Request Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier | Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data ...
+-+-+-+-+-
Codeフィールドの説明の際に少し触れましたが、こちらは「宛先到達不能」を表すエラーメッセージとなっています。Type3のErrorメッセージが返ってきたことにより宛先にパケットが届かなかったことが分かり、Codeフィールドにより何が原因で届かなかったのかが分かります。
Destination Unreachable Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
こちらは最適ルートの情報をホストに伝える役割を持っています。通常ルータ間ではルーティングプロトコルが使われ、経路にあった最適ルートが計算されます(もちろん手動で固定的に設定する場合もありますが)。しかしこれはあくまでルータ間での情報のやり取りであって、もしルートが変更されたとしてもホストにはこの情報が伝わることはありません。そこでICMPのType=5を使用し、最適ルートの情報をホストに伝えることとなっています。具体的には4つのCode(下表参照)があり、オプションには新しい最適ルータのIPアドレスを入れてホストへ送り返します。
| 0 | Redirect datagrams for the Network | 対象ネットワークへのルート変更 |
|---|---|---|
| 1 | Redirect datagrams for the Host | 対象ホストへのルート変更 |
| 2 | Redirect datagrams for the Type of Service and Network | ネットワークへのルート変更 |
| 3 | Redirect datagrams for the Type of Service and Host | ホストへのルート変更 |
Redirect Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Gateway Internet Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
この要求メッセージ(Echo要求)を受け取ったネットワーク機器は送信元に対して応答メッセージ(Echo応答)を返します。主に「ping」コマンドでネットワーク機器間の疎通テストに使われます。
Echo Request Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier | Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data ...
+-+-+-+-+-
生存期間が終了した(TTL=0となった)パケットはルータによって破棄されるのですが、勝手に破棄だけするわけではありません。事後報告となりますが、送信元にICMP(Type=11)を送り返し「パケットを破棄しました」ということを伝えるのです。
Time Exceeded Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Timestamp or Timestamp Reply Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier | Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Originate Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Receive Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Transmit Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Information Request or Information Reply Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier | Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
エラー通知が無限ループになる可能性もあるため、ICMPメッセージに対してICMPのエラーメッセージが送られることはありません。
広告