ICMP

July 21, 2018

ICMP のパケットフォーマット

ICMP (Internet Control Message Protocol) は IP から見ると上位のプロトコルとなるが、機能的には OSI 参照モデルの第 3 層 (ネットワーク層) に分類される。
ICMP のパケットフォーマットは以下の通り。

f:id:shiro_kochi:2018××××××××:plain:w100:left

ICMP データのフォーマットは、ICMP メッセージごとに規定される。

ICMP メッセージ

ICMP は IP パケットの転送でエラーが発生した場合、それを送信元に通知する機能や、接続性を確認するエコー要求/応答メッセージを転送する機能などを持つ、代表的な ICMP メッセージを以下に示す。

f:id:shiro_kochi:2018××××××××:plain:w100:left

ICMP メッセージは、紹介メッセージとエラーメッセージの二つに分類できる。ICMP エラーメッセージを格納した IP データグラムの転送に失敗したとき、そのための ICMP メッセージは例外的に通知されない。よって、エラー通知の失敗が新たなエラー通知を誘発するという悪循環は避けられる。
以下、主要な ICMP メッセージについて解説する。

  • エコー要求 / 応答 (Echo Request / Echo Reply)
    エコー要求 / 応答は最もよく使われる ICMP 機能であり、ネットワークのループバックテストに使用される。エコー要求メッセージは ping コマンドを実行することで送信される。
    エコー要求を受け取ったホストは、その要求元にエコー応答メッセージを送信する。
  • 宛先到達不能 (Destination Unreachable)
    経路途中のルータで転送エラーが発生したときや、宛先ホストで受信エラーが発生したときは、エラーとなった IP パケットを破棄した上で、その送信元ホストに向けて宛先到達不能メッセージを送信する。
    宛先到達不能メッセージでは ICMP ヘッダのコード領域に値をセットする。代表的なものは以下。
コード (値) 説明
ホスト到達不能 (0x1) 宛先へのルートがルーティングテーブル内に見つからない
プロトコル到達不能 (0x2) プロトコル (IP ヘッダのプロトコル番号領域で指定) が受信ホストで使用されていない
ポート到達不能 (0x3) UDP ヘッダ内の宛先ポートが受信ホストで使用されていない (TCP ヘッダ内の宛先ポートが見つからない場合は接続リセットを返信する)
フラグメンテーションが必要だが、DF ビットが設定されている (0x4) 途中経路のルータがフラグメンと化を試みたが、DF ビットが設定されているために失敗した (データリンクの MTU の値が返答される)
  • リダイレクト
    同一サブネットに 2 台以上のルータが存在しており、送信元ホストが最適ではないルータを経由して IP パケットを送信したとする。
    この際、そのルータはパケットを適切なルータへ転送し、同時に送信元ホストにリダイレクトメッセージを送信し、同一サブネット上には自分より適切なルータが存在することを通知する。
    これを受け、送信元ホストはルーティングテーブルを変更し、それ以降、最適なルータを経由して IP パケットを送信するようになる。
    なお、途中経路のルータが最適でないルートを使って IP パケットを転送しても、リダイレクトメッセージは発行されない。
  • 時間超過
    ルータは IP パケットを転送する際、IP ヘッダ内の TTL 領域を読み取り、値をひとつ減らして格納し直す (チェックサムも更新される)。
    TTL 領域の値が 0 になった際、ルータは IP パケットを破棄して、送信元ホストに時間超過メッセージを送信する。典型的な例としては、ルーティングループが発生し、IP パケットが複数のルータを循環して転送される状態。

 © 2023, Dealing with Ambiguity