ICMPとはどんなプロトコルのこと?メッセージの詳細7つを解説

ICMPとはどんなプロトコルのこと?メッセージの詳細7つを解説のアイキャッチイメージ

ICMPとはどんなプロトコルのこと?


ICMPとは「Internet Control Message Protocol」の略で、IP(Internet Protocol)データグラムが送信元から送信先に届くまでの処理で発生したエラーや状態を送信元に報告するためのプロトコルです。

IPと同じネットワーク層(OSI 参照モデルのレイヤー3)のプロトコルで、ポート番号の概念はなくIPを使用してIPの上位プロトコルのように処理されます。

pingとの違い

pingはICMPで実装されている機能の一つであるエコー/エコー応答(Echo Message/Echo Reply Message)を使用して、指定した通信先までの到達が可能かどうか判断するコマンド(ツール)です。

あくまでもICMPの機能の一部であり、ICMPであるからpingである、というわけではありません。

ICMPの役割とは


IPプロトコルはIPデータグラムの送受信を行うプロトコルですが、処理がエラーとなってしまった場合など、結果の詳細を報告する機能は実装されていません。

ICMPは、IPの代わりに通信の疎通状態や処理エラーを報告するといった、IPの補助の動作します。

IP通信の疎通状態を確認する

送信先IPアドレスを指定して CMPデータを含んだIPデータグラム(Echo Message)を送信し、送信先で受け取ると送信元と送信先のアドレスやタイプ、チェックサムを書き換えて返信します。この返信が送信元に到着することで、送信先は送信元との疎通状態を判断できます。

問題があるときにエラー情報を送る

IPデータグラムの処理でエラーが発生した時に、その詳細な原因を送信元に通知します。

具体的な原因の例として、送信先のネットワークやホストに到着できない、指定されたポート番号に接続できない、パケットが分割できない、TTL(Time To Live)を超えてしまったなどがあります。

送信元がこれらのエラーを受け取ることで、なぜ疎通できないかの理由が判断できます。

ICMPのポート番号の代わりにあるTYPEとCODEとは


ICMPはIPを使用してIPの上位プロトコルのように処理されると記載しましたが、IPの上位プロトコルの代表であるTCPとは異なりポート番号といった概念はありません。

ポート番号の代わりに、ICMPメッセージ を表す「TYPE」と「TYPE」内の特定の意味を表す「CODE」があり、これらの組み合わせでICMPメッセージの意味が特定できます。

ポート番号代わりであるTypeとそのメッセージの詳細

ポート番号に代わる定義済みのICMP Typeは複数ありますが、ここでは一般的に良く使用されるICMP Typeについて説明します。

Type0は、受信したType8のecho message(エコー要求)に対するecho reply message(エコー応答)を送信する際にセットされ、pingやtracerouteコマンドで使用されます。

echo messageで指定した送信先が受信すると、データフィールド内のデータはそのままに送信先と送信元のIPアドレスの入れ替え、Type0への変更、チェックサムを再計算して返信します。

Type3は、IPデータグラムで指定された送信先やネットワークに何らかの理由で到達できなかった場合に、ネットワーク送信元に対してDestination Unreachable Messageを送信する際にセットされます。

到達できなかった理由はゲートウェイや送信先から送信されるCODEによって判別できます。

Type5は、ネットワーク上に複数のゲートウェイが存在し、送信先/送信元が指定しているゲートウェイより良いルートを持ったゲートウェイが同じネットワーク上にある場合、送信元へ良いルート方法を通知する際にセットされます。

送信先/送信元が指定しているゲートウェイより良いルートを持ったゲートウェイが同じネットワーク上にある場合、送信元へ良いルートへのゲートウェイを通知(Redirect)する際にセットされます。

Redirect通知を受け取ったホストは、自分のルーティングテーブルを書き換え、良いネットワークに対してIPデータグラムを送信します。

Type8は、指定した送信先に対してecho messageを送信する場合にセットされ、送信先からType0のecho reply messageが帰って来ることで、送信先とのIPネットワークに関する疎通確認ができます。

Type固有のデータ内で識別子やシーケンス番号を含めることが可能で、echoとreplyの対応付けに利用できます。

Type9は、RFC1256で追加され、ネットワーク機器が自身のアドレスをデフォルトゲートウェイとして使用できることを通知したりホストが自分のネットワーク上のルーターを発見する際にセットされます。

一般的にはマルチキャストで使用されますが、ブロードキャストにも送信されます。

Type11は、送信先までに通過するネットワーク機器が多すぎたり、ネットワーク上でループが発生している環境でTTL(Time To Live)が「0」となり、パケットが破棄されたことを送信元に通知する際にセットされます。

また、フラグメント化されたIPデータグラムの不足により設定された時間内にホストが再構築できずパケットが破棄された場合にも送信元に通知します。

Type12は、ゲートウェイまたはホストがIPデータグラム処理時にIPヘッダーのパラメーターに問題を発見し、パケットが破棄されたことを送信元に通知する際にセットされます。

破棄された理由はCODEに設定された値によってどのパラメーターに問題があったかを判断できます。

ポート番号代わりであるCODEとそのメッセージの詳細7つ

上記で説明したTypeには、固有のメッセージを表す「CODE」が定義されています。ポート番号の代わりとなるTypeとCODEの組み合わせにより、より具体的なICMPメッセージが特定されます。

ここでは各Typeに定義されている代表的で、よく使われるCODEについてまとめて説明します。

1:ICMP Type0

今後拡張されて追加される可能性はありますが、Type0(とType8)に関しては現時点ではポート番号に代わるCODEとして「0」のみ定義されています。

CODEが「0」で指定された場合、Identifierと Sequence Numberがecho messageとecho reply messageを関連付ける情報になります(0でも構いません)。

2:ICMP Type3

Type3のDestination Unreachable Messageでは、ポート番号に代わるCODEとしてRFC792で0から5までが定義されており、RFC1122で6から12、RFC1812で13から15までの定義が追加されました。

ここではポート番号に代わるCODEとして当初定義された0から5までに関して説明します。

3:ICMP Type5

Type5のRedirectでポート番号に代わるCODEとして以下の4つがあります。

CODE0はRedirect datagrams for the Networkを表します。特定ネットワーク宛てのIPデータグラムをリダイレクトする場合にセットされます。

CODE1はRedirect datagrams for the Hostを表します。特定ホスト宛てのIPデータグラムをリダイレクトする場合にセットされます。

CODE2はRedirect datagrams for the Type of Service and Networkを表します。特定のToS(Type of Service)を要求する特定ネットワーク宛てのIPデータグラムをリダイレクトする場合にセットされます。

CODE3はRedirect datagrams for the Type of Service and Hostを表します。特定のToS(Type of Service)を要求する特定ホスト宛てのIPデータグラムをリダイレクトする場合にセットされます。

4:ICMP Type8

今後拡張されて追加される可能性はありますが、Type8(と Type0)に関しては現時点ではポート番号に代わるCODEとして「0」のみ定義されています。

CODEが「0」で指定された場合、IdentifierとSequence Numberがecho messageとecho reply messageを関連付ける情報になります (0でも構いません)。

5:ICMP Type9

Type9のRouter Advertisementでポート番号に代わるCODEとして以下の2つがあります。

CODE0は、通常のRouter Advertisementの場合にセットされ、CODE16は共通トラフィックを転送しない場合にセットされます(RFC3344 定義されました)。

6:ICMP Type11

Type11のTime Exceeded Messageでポート番号に代わるCODEとして以下の2つがあります。

CODE0はtime to live exceeded in transitを表します。TTLの期限切れの場合にセットされます。

CODE1はfragment reassembly time exceededを表します。時間内にフラグメント化されたパケットの再構築ができなかった場合にセットされます。

7:ICMP Type12

Type12のParameter Problem Messageでポート番号に代わるCODEとして以下の3つがあります。

CODE0はpointer indicates the errorを表します。IPヘッダーでエラーが発生した場合にセットされます。

CODE1はProblem Missing Optionを表します。必須のオプションが不足している場合にセットされます。

CODE2はIP Header bad lengthを表します。IPヘッダー長が不正な場合にセットされます。

ICMPプロトコルに利用できるコマンドとは


ICMPを利用しているコマンドとして、pingとtracerouteがあり、どちらも ICMPのecho messageとecho reply messageを使用してIPレベルでのネットワークの状態を診断できます。

Linuxの最新バージョンではダウンロードが必要だったり代替コマンドとなっているケースがありますが、よく使われるWindowsやLinux、SolarisなどのOSに標準で実装されています。以下で詳細を説明します。

pingを利用する

pingは指定した送信先への到達可否やネットワーク遅延などの問題を診断するために活用できます。

OSによって指定するオプションに違いはありますが、送信パケットのサイズ指定やTTLの指定、フラグメントの禁止オプションがあり、これらを活用することで送信先への疎通やネットワークの状態の確認が可能です。

pingでポート番号を指定するオプションがないことからも、ICMPを使用していることがわかります。

tracerouteを利用する

traceroute(Windowsでは tracert)は送信元から送信先までに経由するネットワークルートの確認やネットワーク遅延などの問題を診断するために活用できます。

tracerouteではTTLを段階的に増加させることで、ネットワーク上に存在するルーターのIPアドレスを確認します。例えば、TTLを「1」にすると1台目に通過するルーターでTTLが「0」になるため、ルーターはパケットを破棄してType11、CODE0のTime Exceedを送信元に通知します。

このTime Exceedのパケットには破棄したルーターのIPアドレスが含まれるため、送信元はTTLを1つずつ増やすことで、ネットワーク上のルーターのIPアドレスがわかります。

ただし、ICMPに応答しないように設定されているルーターの情報は取得できません。なお、LinuxのtracerouteはUDPを使用しているためポート番号を指定可能ですが、WindowsではICMPを使用するためポート番号の指定はできません。

ここからも、ICMPではポート番号を使用していないことがわかります。

ICMPのポート番号代わりとなるTYPEとCODEについて理解しよう


ICMPはpingやtracerouteで使用されており、知らないうちに利用しているケースが多いと思いますが、非常に重要なプロトコルです。

TCPのようなポート番号といった概念はありませんが、TYPEとCODEを使用してネットワークで発生した問題の切り分けや絞り込み、原因の特定などがより詳細に行えるようになります。

この機会にICMPのTYPEとCODEを理解し、ネットワーク上でのトラブルシューティングに活用できるようにしましょう。

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。