新Linux入門|ICMPのメッセージ構造と動作原理

 ネットワーク通信の世界では、パケットがうまく届かないことや、ルート上で問題が発生することがあります。
 そんな時、通信機器同士が「今どんな状態なのか?」を知らせ合うために使われるのが ICMP(Internet Control Message Protocol) です。

 ICMPは、インターネットの健全な通信を裏で支える “連絡係” のような存在で、エラー通知や診断メッセージを交換するために使われます。
 普段何気なく使っている pingtraceroute コマンドも、実はこの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には多くのメッセージタイプがありますが、ここでは代表的なものを紹介します。

タイプコードメッセージ名説明
00Echo Replyping応答(通信可能であることを示す)
3各種Destination Unreachable宛先に到達できない場合に通知
40Source Quench(非推奨)混雑制御のために一時的な抑制を通知
5各種Redirectより適切なルートを案内するメッセージ
80Echo Requestping要求(接続確認用)
110または1Time ExceededTTL超過でパケットが破棄されたことを通知
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 秒応答を待つ時間(タイムアウト)を指定
-4IPv4を強制使用
-6IPv6を強制使用(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 / Replyping6 コマンドで使用
Neighbor Solicitation / AdvertisementMACアドレス解決(ARPに相当)
Router Solicitation / Advertisementルータの探索と情報取得
Packet Too Bigフラグメント不可能な場合に通知

💬ポイント
IPv6ではICMPv6が通信制御の中核を担っており、IPv4よりもさらに重要な存在になっています。

🌈 まとめ

  • ICMPは、通信の状態やエラーを通知する制御プロトコル。
  • Echo Request / Reply により、ホスト間の疎通確認が可能。
  • traceroute などのツールもICMPメッセージを活用して経路を解析。
  • 攻撃に悪用されるリスクもあるため、ファイアウォール設定で制御が必要。
  • IPv6ではICMPv6がネットワーク制御の中心的役割を担っている。

 ICMPは、まるでネットワークの“神経系”のように、通信の異常を感知し、伝える重要なプロトコルです。
AlmaLinuxでも、ぜひ ping や traceroute を使ってICMPの動きを体験してみましょう!