
新Linux入門|ICMPのメッセージ構造と動作原理
ネットワーク通信の世界では、パケットがうまく届かないことや、ルート上で問題が発生することがあります。
そんな時、通信機器同士が「今どんな状態なのか?」を知らせ合うために使われるのが ICMP(Internet Control Message Protocol) です。
ICMPは、インターネットの健全な通信を裏で支える “連絡係” のような存在で、エラー通知や診断メッセージを交換するために使われます。
普段何気なく使っている ping や traceroute コマンドも、実はこのICMPが動いているおかげなんです✨

📡 ICMPの役割
ICMPは、IP通信の制御・診断を行う補助プロトコル です。
IPパケットそのものを転送するのはIPですが、ICMPは「転送できなかった」「時間切れになった」「別ルートに送った方がいい」といった情報を伝える役割を持っています。
| 項目 | 説明 |
|---|---|
| プロトコル名 | ICMP(Internet Control Message Protocol) |
| 主な目的 | ネットワークの状態を通知・診断する。 |
| 通信対象 | IP通信に関するエラーや情報メッセージ |
| OSI階層 | ネットワーク層(IP層と密接に連携) |
| 使用例 | ping、traceroute、pathpingなど |
💬ポイント
たとえば、通信先が存在しない場合、ICMPが「Destination Unreachable(宛先に届きません)」というメッセージを返してくれることで、原因の切り分けができます。
🧩 ICMPメッセージの基本構造
ICMPメッセージはとてもシンプルで、次のような構成になっています。

| フィールド名 | サイズ(ビット) | 説明 |
|---|---|---|
| Type(タイプ) | 8 | メッセージの種類(例:Echo Request=8、Echo Reply=0) |
| Code(コード) | 8 | メッセージの詳細分類 |
| Checksum(チェックサム) | 16 | データの誤り検出 |
| Data(データ部) | 可変長 | メッセージ固有のデータ(IPヘッダー情報や識別子など) |
💡ポイント
この構造により、ICMPは「どんな種類の通知か」「どの経路で問題が起きたのか」を簡潔に表現できます。
📨 ICMPメッセージの種類と意味
ICMPには多くのメッセージタイプがありますが、ここでは代表的なものを紹介します。
| タイプ | コード | メッセージ名 | 説明 |
|---|---|---|---|
| 0 | 0 | Echo Reply | ping応答(通信可能であることを示す) |
| 3 | 各種 | Destination Unreachable | 宛先に到達できない場合に通知 |
| 4 | 0 | Source Quench(非推奨) | 混雑制御のために一時的な抑制を通知 |
| 5 | 各種 | Redirect | より適切なルートを案内するメッセージ |
| 8 | 0 | Echo Request | ping要求(接続確認用) |
| 11 | 0または1 | Time Exceeded | TTL超過でパケットが破棄されたことを通知 |
| 12 | 各種 | Parameter Problem | ヘッダーに問題があることを通知 |
💬ポイント
たとえば、ping コマンドで使用されるのは Echo Request(タイプ8) と Echo Reply(タイプ0) です。
これにより、「相手が生きているか(応答があるか)」を確認できます。
🧭 ICMPの動作原理(例:pingの仕組み)
ICMPの動作を最もわかりやすく示すのが ping コマンドです。
以下は、ICMPがどのように動作して通信状態を確認しているかを示す流れです。
1️⃣ suzukiがICMP Echo Request(タイプ8)を送信
2️⃣ 送信先ホストが受信し、Echo Reply(タイプ0)を返す
3️⃣ suzukiは応答を受け取り、往復時間(RTT)を表示
実行例
[suzuki@AlmaLinux ~]$ ping -c 4 192.168.1.100
PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.213 ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=0.198 ms
--- 192.168.1.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3063ms
rtt min/avg/max/mdev = 0.198/0.205/0.213/0.007 ms💬ポイント
icmp_seq はパケットの順番、ttl は生存時間(Time To Live)、time は往復時間を示します。
この情報から、ネットワークの応答性や経路上の問題を推測できます。
⚙️ pingコマンド
コマンド書式
ping [オプション] 宛先ホスト名またはIPアドレス主なオプション
| オプション | 説明 |
|---|---|
| -c 回数 | 指定した回数だけ送信して終了 |
| -i 秒 | パケット送信間隔を指定 |
| -s サイズ | 送信データサイズを指定(デフォルト56バイト) |
| -W 秒 | 応答を待つ時間(タイムアウト)を指定 |
| -4 | IPv4を強制使用 |
| -6 | IPv6を強制使用(ICMPv6) |
使用例
[suzuki@AlmaLinux ~]$ ping -c 3 -i 0.5 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.174 ms
--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1002ms💡ポイント
このように ping はICMPメッセージを活用して通信経路の状態を簡単に確認できます。
🧭 tracerouteとICMPの関係
traceroute コマンドもICMPを利用する代表的なツールです。
TTL(Time To Live)を1ずつ増やしながら送信し、各ルータから返ってくる「Time Exceeded(タイプ11)」メッセージを利用して経路を特定します。
使用例
[suzuki@AlmaLinux ~]$ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max
1 192.168.1.1 0.654 ms
2 203.0.113.1 4.312 ms
3 8.8.8.8 7.125 ms💬ポイント
このように、ICMPの「Time Exceeded」メッセージを活用することで、パケットがどのルータを通っているかを調べられます。
🔒 ICMPのセキュリティ面
ICMPは便利なプロトコルですが、悪意のある攻撃に使われることもあります。
| 攻撃例 | 内容 |
|---|---|
| Ping Flood攻撃 | 大量のICMP Echo Requestを送ってサーバに負荷をかける。 |
| Smurf攻撃 | ブロードキャストを悪用してDoS攻撃を行う。 |
| ICMP Redirect悪用 | 不正なルート情報を注入し、通信を誘導する。 |
💬ポイント
そのため、多くの企業ネットワークでは、ファイアウォール(firewalld など)でICMPの一部タイプを制限する設定を行っています。
🌍 ICMPv6(IPv6でのICMP)
IPv6環境では ICMPv6 が使用されます。
ICMPv6は単なる診断だけでなく、アドレス自動設定・ネイバー探索・ルータ広告 など、IPv6通信の基盤を支える重要な役割を担っています。
| 機能 | 説明 |
|---|---|
| Echo Request / Reply | ping6 コマンドで使用 |
| Neighbor Solicitation / Advertisement | MACアドレス解決(ARPに相当) |
| Router Solicitation / Advertisement | ルータの探索と情報取得 |
| Packet Too Big | フラグメント不可能な場合に通知 |
💬ポイント
IPv6ではICMPv6が通信制御の中核を担っており、IPv4よりもさらに重要な存在になっています。
🌈 まとめ
- ICMPは、通信の状態やエラーを通知する制御プロトコル。
- Echo Request / Reply により、ホスト間の疎通確認が可能。
- traceroute などのツールもICMPメッセージを活用して経路を解析。
- 攻撃に悪用されるリスクもあるため、ファイアウォール設定で制御が必要。
- IPv6ではICMPv6がネットワーク制御の中心的役割を担っている。
ICMPは、まるでネットワークの“神経系”のように、通信の異常を感知し、伝える重要なプロトコルです。
AlmaLinuxでも、ぜひ ping や traceroute を使ってICMPの動きを体験してみましょう!
