ICMP【Internet Control Message Protocol】

広告

広告

ICMP とは

最終更新
2005-07-13T00:00:00+09:00
この記事のURI参照
https://www.7key.jp/nw/tcpip/ip/icmp.html#icmp

ICMPはIPネットワークとして接続されたホスト間で通信を行う際に、通信状態の診断を行ったりエラー通知を行ったりするために使われるネットワーク層プロトコルです。IPは送信元のホストから宛先ホストまでパケットを届けることが主な機能となっています。ただ実際には、IPは一方的にパケットを宛先に送りつけるだけで(少し語弊がありますが)、送信したパケットが宛先ホストまで無事に届いているのかどうかは送信元ホスト(のネットワーク層)では分からないのです。無事にデータが宛先に届いたかどうかを知るためは更に上位層のプロトコルであるTCPの協力が必要なのですが、TCPに頼らずともネットワーク層である程度の信頼性を確保するために考えられたのがICMPというわけです。もともとはネットワークに障害があった際に、その経路上のルータやホストが送信元ホストへその障害を知らせるためのプロトコルでした。そのためにエラー報告プロトコルとも呼ばれています。

ICMP の仕組み

最終更新
2005-07-13T00:00:00+09:00
この記事のURI参照
https://www.7key.jp/nw/tcpip/ip/icmp.html#structure

ICMPはIP上で動く仕組みとなっていますので、当然 IPパケットに載せられて伝達されることとなります。トランスポート層セグメント部分がそのままICMPメッセージと考えてもらえれば分かりやすいかもしれません(Figure:ICMP-01)。

ICMP-01

ICMPの種類はTypeフィールドの性質によって「Queryメッセージ」と「Errorメッセージ」に大きく分けられます。Queryメッセージは調査のために使われるメッセージ、Errorメッセージはエラーを通知するためのメッセージと位置付けされています。上図(Figure:ICMP-01)の「Type」フィールドに下表の番号(数字)で表されています。

ICMPのType
タイプ説明意味種類
0Echo ReplyEcho要求への返答Query
3Destination Unreachable宛先到達不能Error
4Source Quench軋轢発生による転送抑制指示Error
5Redirectより最適な経路への変更指示Error
8Echo RequestEcho要求Query
9Router Advertismentルータ通知Query
10Router Solicitationルータ要求Query
11Time ExceededTTLの超過によるパケットの破棄報告Error
12Paramter ProblemパケットパラメータにおけるエラーError
13Timestamp Requestタイムスタンプ保持要求Query
14Timestamp Replyタイムスタンプ保持要求への返答。Query
15Information Request
(未使用)
-Query
16Information Reply
(未使用)
-Query
17AddressMask Requestアドレスマスク要求。サブネット内のサブネットマスク値を要求するQuery
18AddressMask Replyアドレスマスク要求への返答Query

また、Errorメッセージの中でも「Destination Unreachable(Type=3)エラーの場合は、上図1「Code」フィールドに以下の詳細な障害情報が含まれることとなっています。

Type3
Code説明意味
0Network Unreachableネットワークへ到達不能
1Host Unreachableホストへ到達不能
2Protocol Unreachableそのプロトコルは使用できない
3Port Unreachable対象ポートが開いていない
4Fragmentation Needed and DF setパケットを分割したいが不可となっている
5Source Route Failedソースルートが不明
6Destinantion Network Unknown宛先ネットワークが不明
7Destinantion Host Unknown宛先ホストが不明
8Source Host Isolated宛先ホストがネットワークから分離されている
9Network Administartively Prohibited宛先ネットワークとの通信が禁止されている
10Destinantion Host Administartively Prohibited宛先ホストとの通信が禁止されている
11Network Unreachable For TOS指定したサービスタイプでは宛先ネットワークへ到達不能
12Host Unreachable For TOS指定したサービスタイプでは宛先ホストへ到達不能
13Communication Administratively Prohibitedフィルタリング設定により通信禁止
14Host Precedence Violationホストの優先順位侵害
15Precedence Cutoff in Effect優先順位により遮断発動

Dataフィールドには、「Echo Request」の場合は任意の文字列で埋められ、Errorメッセージの場合はどのパケットに対するエラーかを示すために、対応するパケットのIPヘッダが格納されます。

Echo Reply(0)

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 ...
   +-+-+-+-+-

Destination Unreachable(3)

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      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Redirect(5)

こちらは最適ルートの情報をホストに伝える役割を持っています。通常ルータ間ではルーティングプロトコルが使われ、経路にあった最適ルートが計算されます(もちろん手動で固定的に設定する場合もありますが)。しかしこれはあくまでルータ間での情報のやり取りであって、もしルートが変更されたとしてもホストにはこの情報が伝わることはありません。そこでICMPのType=5を使用し、最適ルートの情報をホストに伝えることとなっています。具体的には4つのCode(下表参照)があり、オプションには新しい最適ルータのIPアドレスを入れてホストへ送り返します。

Code
0Redirect datagrams for the Network対象ネットワークへのルート変更
1Redirect datagrams for the Host対象ホストへのルート変更
2Redirect datagrams for the Type of Service and Networkネットワークへのルート変更
3Redirect 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 Request(8)

この要求メッセージ(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 ...
   +-+-+-+-+-

Time Exceeded(11)

生存期間が終了した(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(13,14)

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(15,16)

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のエラーメッセージが送られることはありません。

広告

Copyright (C) 2005 七鍵 key@do.ai 初版:2005年07月13日 最終更新:2005年07月13日