通信の到達確認やエラー通知を行うネットワーク層のプロトコル。
ICMP(Internet Control Message Protocol)とは、通信の到達確認やエラー通知を行うネットワーク層のプロトコルです。ネットワーク層=相手まで届けるための住所(IPアドレス)を扱う層、のことです。データ本体を運ぶのではなく、通信が「うまくいったか/失敗したか」を知らせる連絡係です。
身近な例で考えると、宅配便の「不在連絡票」や「配達完了メール」に似ています。荷物(データ)そのものではなく、「届きました」「届け先が見つかりませんでした」といった状況を知らせてくれる仕組みです。
ICMP を使う代表的なコマンドが ping と traceroute です。上のツールで▶ボタンを押すと、問いかけと返事のやり取りや、エラーが通知される流れを確認できます。シナリオを切り替えて3つの使い方を見比べてみてください。
ping は「相手に届くか」を確かめるコマンドです。仕組みはシンプルです。
・Echo Request:「そこにいますか?」と問いかけるメッセージを送る
・Echo Reply:相手が「ここにいますよ」と返事を返す
・往復時間(RTT):送信から返事までの時間で、通信の速さや安定性が分かる
traceroute は「相手までどのルータを通るか」を1台ずつたどるコマンドです。鍵になるのが TTL(Time To Live=パケットの寿命)です。TTL はルータを1台通るたびに1ずつ減り、0になるとそのルータがパケットを捨て、ICMP の Time Exceeded(時間超過)を送信元に返します。
そこで TTL を 1, 2, 3 …と1ずつ増やしながら送ると、1台目・2台目・3台目…と順番にルータが Time Exceeded を返してくれます。これを集めれば経路がまるごと分かる、という仕掛けです。上のツールの traceroute シナリオで、TTL が減って 0 になり応答が返る流れを確認できます。
ICMP のもうひとつの大事な役割がエラー通知です。データを届けられないとき、ただ黙って捨てると送信元は理由が分からず待ち続けてしまいます。そこで ICMP が「なぜ届かなかったか」を送信元に知らせます。
代表的なエラー通知メッセージには次のようなものがあります。
・Destination Unreachable(宛先到達不能):その宛先へは届けられないと知らせる
・Time Exceeded(時間超過):TTL が 0 になりパケットを捨てたと知らせる
・Redirect(経路変更):もっと良い経路があると教える
身近な例で考えると、手紙が届かなかったときに郵便局が「あて先不明で配達できませんでした」と差出人に戻してくれるのと同じです。理由が分かるから、送り直したり住所を確認したりできます。上のツールのエラー通知シナリオで、ルータが Destination Unreachable を返す流れを確認できます。
ICMP のメッセージは大きく「問い合わせ系」と「エラー通知系」の2種類に分類できます。それぞれ目的が異なるため、受け取ったときの対応も変わります。
| メッセージ名 | 種別 | 役割・意味 |
|---|---|---|
| Echo Request | 問い合わせ | ping の「そこにいる?」。相手の生存確認 |
| Echo Reply | 問い合わせ | ping の「ここにいるよ」。到達確認のOK応答 |
| Destination Unreachable | エラー | その宛先には届けられないと通知 |
| Time Exceeded | エラー | TTLが0になりパケットを破棄したと通知 |
| Redirect | 情報 | より良い経路があることを送信元に通知 |
なぜICMPはTCPやUDPと別になっているのか。TCPとUDPはデータを運ぶための仕組みですが、ICMPはデータを運ぶのではなくネットワーク自体の状態を知らせる制御専用です。郵便で言えば、手紙(TCP/UDP)と、配達状況を知らせる不在連絡票や追跡メール(ICMP)は別物、と考えると分かりやすいです。
TTL(Time To Live=パケットの生存時間)とは、パケット(=送られるデータのかたまり)がネットワーク上で「何台のルータを通過できるか」を表す数値です。ルータ(=ネットワーク間でデータを中継する機器)を1台通るたびにTTLは1ずつ減り、0になった時点でそのルータがパケットを破棄します。
なぜTTLが必要なのか。誤った経路情報があると、パケットがネットワーク中をぐるぐる回り続ける(ルーティングループ)ことがあります。TTLがなければ、このパケットが永遠に流れ続けてネットワークが詰まってしまいます。TTLは「通過できるルータ数の上限」として働き、迷子のパケットを自動的に処分する仕組みです。
身近な例で考えると、回覧板を回すとき「最大10軒まで」と決めておくようなものです。宛先が見つからなくてもいつか止まるので、回覧板が無限に回り続けることがありません。上のツールの traceroute シナリオで、TTLが減って0になったルータが Time Exceeded を返す様子を確認してみてください。