教育・資格支援

【ネットワーク基礎】ICMPとは?仕組みと役割をやさしく解説

今回は、ネットワークの基礎プロトコル ICMP(Internet Control Message Protocol) について、
実際の通信を追いながらわかりやすく解説します。

ICMPと聞くと少しマニアックに感じるかもしれませんが、
実は pingコマンドで使われている、とても身近なプロトコル です。

サーバーやPCの疎通確認で「とりあえずping打ってみるか」とやったことがある方も多いのではないでしょうか。

この記事では、

  • ICMPはどんな役割を持つプロトコルなのか

  • どんなフォーマットで通信しているのか

  • ping実行時に実際どんなパケットが流れているのか

を、Wiresharkでキャプチャしたデータも交えながら、
中身をのぞきつつ理解していきます。

「なんとなく使っているpingの裏側」を一緒に見ていきましょう。


ICMPとは

ICMP(Internet Control Message Protocol)はTCP/IPプロトコルスタックのインターネット層に位置するプロトコルで、通信診断やエラー通知を規定したプロトコルになり、メッセージの種類はQuery(通信診断)とError(エラー通知)の2種類になります。

位置づけとしてはIPを補助するプロトコルになり、pingやtracerouteコマンドなどが代表的なコマンドになります。

ユウイチ
ユウイチ
サーバーにつながれへんなぁ、とりあえずpingは通るかな

みたいな感じで疎通確認することは多いと思うのですが、このときにICMPのルールに従っています。


ICMPフォーマット

では、実際のICMPメッセージフォーマットですが、以下のようになり、IPヘッダの上位につく感じになります。

ですので厳密に言えばインターネットプロトコル(IP)の上位のプロトコルという位置づけになると思うのですが、「IPを補助する」という表現が一般的な気がします。

メッセージの意味は、タイプがICMPメッセージの機能、コードはエラー時の詳細を示す値、チェックサムがエラーチェック(ICMPメッセージ自体のエラーです)、データがタイプに依存する部分となります。以下に主なタイプと内容を記載します。

タイプ内容種類
0:Echo Replyエコー応答Query
3:Destination Unreachable到達不能Error
8:Echo Requestエコー要求Query
11:Time Exceeded時間超過Error

タイプの種類がQueryタイプの場合、ICMPヘッダのコードは0となりますが、タイプの種類がErrorタイプの場合はエラー詳細がコードにて定義されています。例えば、種類がErrorである「3:Destination Unreachable」に設定されているコードは以下になります。

コード番号内容
0:Network Unreachableネットワーク到達不能
1:Host Unreachableホスト到達不能
2:Protocol Unreachableプロトコル到達不能
4:TFragmentation Needed and Don't Fragment was Set分散禁止が設定されている(分散処理が必要時)
5:Source Route Failedソースルートに失敗
6:Destination Network Unknown宛先ネットワーク不明
7:Destination Host Unknown宛先ホスト不明
8:Source Host Isolated送信元ホストが孤立
9:Communication with Destination Network is Administratively Prohibited宛先ネットワークとの通信が管理上禁止されている
10:Communication with Destination Host is Administratively Prohibited宛先ホストとの通信が管理上禁止されている

ですので、ICMPメッセージのタイプが「3:Destination Unreachable」、コードが「7:Destination Host Unknown」の場合は「宛先ホストが不明で到達できませんでした」ということになります。

では実際のデータの流れについてpingコマンドを例に説明します。


データの流れ(pingコマンド)

pingコマンドはICMPメッセージのEcho RequestとEcho Replyを使用して通信します。

例えば、IPアドレス:192.168.0.9のPC(A)からIPアドレス192.168.0.20のPC(B)へpingコマンド投げる例で説明しますと、以下のようになります。

シーケンス

  • AのPCにて「ping 192.168.0.20」コマンドを実行
  • AのPC→BのPCへEcho Request
  • BのPC→AのPCへEcho Reply

結果は以下のようになります。

Windowsは上記②と③を4回繰り返しますので、結果が4回返ってきております。(Windowsで実施しました)

凄く簡単な流れなのですが、本当にICMPメッセージがEcho RequestとEcho Replyになっているのか確認してみます。以下、Wiresharkというパケットキャプチャソフトでpingのやり取りをキャプチャした結果です。

Protocolが「ICMP」になっており、request→replyの順で4回繰り返されていることがわかります。そして、requestは192.168.0.9→192.168.0.20へ、replyは192.168.0.20→192.168.0.9へ向いていることが確認できます。(Sourceが送信元、Destinationが送信先です)

では、さらにそれぞれの中をみてみます。まず、Echo Requestから。Wiresharkでパケットの中を確認すると以下の結果になっておりました。

見慣れないとわかりにくいのですが、青で選択されている部分がICMPメッセージになります。先に示したように先頭8bit(1byte)がタイプ、次の8bit(1byte)がコードになりますので、このメッセージはタイプが「8」、コードが「0」でEcho Requestになっています。「08」 「00」となっているのですが、Wiresharkは16進数表記になっていますので、「08」 「00」という単位でそれぞれ8bit(1byte)となります。(16進数表記に慣れていない方イメージつかないかもですね。また別の記事で2進数、10進数、16進数について書こうと思います)

ちなみに、下にくっついているデータ(青で選択されていない)はEthernetヘッダとIPヘッダになります。ですので、

という感じでパケットができていることがわかります。

それでは、次に、Echo ReplyをWiresharkで見てみると以下の結果になっておりました。

見るところは先ほどと同じですので、メッセージタイプが「0」、コードが「0」でEcho Replyになっています。

これでめでたくpingの中が解読できたわけですが、きっちりとICMPに従っておりました。

ちなみに、正常に疎通ができなかった場合。例えば別ネットワークにあるPCにpingを飛ばしたけど、ルーターでルーティングできてなかったときなどは先ほど説明した「3:Destination Unreachable」タイプでICMPメッセージが返ってきます。タイプがエラーですので、その際はコードも原因にあったコードがつけられます。「1:Host Unreachable」とか「6:Destination Network Unknown」とかで返ってくると思います。このエラーメッセージを返すのはこの例ではルーターです。目的のPCまでにはたどり着けてませんので、PCはどうやっても返しようがないですからね。

以上、今回はICMPについて説明してみました。


まとめ

何気なく使っているpingコマンドでも、中をのぞいて解析してみると結構面白かったりします。プロトコルのルールと合わせて見てみるとより理解が深まりますのでとてもオススメです。今回キャプチャしたデータはWiresharkというフリーソフトを使ったのですが、これ、本当にオススメです。(いわれるまでもなく使っている方大勢いらっしゃるでしょうが^^;)

いろんなプロトコルの中が見れますんで、もし使っていないという方は是非試してみてください。

今後も基本的な知識をわかりやすく伝えていこうと思います。

※TCP/IPの各プロトコルについてこちらで紹介しております。

こちらもCHECK

【完全版】TCP/IPプロトコルの仕組みを図でわかりやすく解説!

続きを見る


✅ ITキャリアを育てるコミュニティ「ITキャリアラボ」

「独学だと続かない…」
「相談できる人がいない…」
「同じ目標の仲間がほしい…」

そんな方向けに、
無料のLINEコミュニティ『ITキャリアラボ』を運営しています。

エンジニア歴20年・講師の僕が、

・資格学習のコツ
・勉強法アドバイス
・キャリア相談
・IT業界のリアル情報

などを発信&質問対応しています。

📌 参加無料・匿名OK・LINEだけで完結
📌 まずは「話を聞くだけ」でも大歓迎

独学で悩む時間を減らしたい人は、気軽に頼ってください。

👇お気軽にどうぞ

ITキャリアラボ

【無料】ITの悩みを気軽に相談できるコミュニティ・ITキャリアラボ

続きを見る

  • この記事を書いた人
  • 最新記事

ユウイチ

20年間ソフトウェアエンジニアとして働いた後、フリーランスを経て現在は1人社長として活動。 プログラミング講師やIT教育を中心に活動しながら、趣味でゲーム開発やシナリオ作成にも挑戦中。どちらも「創ることを通じて人を笑顔にしたい」という想いから始めた、大切なライフワーク。 「創造と教育で、人生に迷う人の“自由な一歩”を支援」を理念に発信中。

-教育・資格支援