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を運営しているネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。


新着案件New Job
-
【高額年収】/【CCNA取得者歓迎】/ネットワークの構築/BIG-IP/東京都千代田区/【WEB面談可】/在宅ワーク/20代~30代の方活躍中
年収540万~540万円東京都千代田区(神保町駅) -
東京都中央区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅ワーク
年収600万~600万円東京都中央区(小伝馬町駅) -
【高額年収】/インフラ構築支援/東京都港区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅ワーク
年収960万~960万円東京都港区(新橋駅) -
ガバナンス推進、セキュリティ基盤支援/東京都港区/【WEB面談可】/在宅ワーク/20代~40代の方活躍中
年収780万~780万円東京都港区(新橋駅) -
カー用品販売会社の情報システム運用/東京都千代田区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/テレワーク
年収576万~576万円東京都千代田区(水道橋駅) -
ネットワーク構築、検証/東京都渋谷区/【WEB面談可】/テレワーク/20代~40代の方活躍中
年収540万~540万円東京都渋谷区(渋谷駅)