こんにちは!ネットワークやインフラの世界へようこそ。
日々の業務や学習で、パケットが飛び交う仕組みに触れるたび、「一体ルーターの中では何が起きているんだろう?」とワクワクしたり、時には途方に暮れたりしていませんか?
今回は、ネットワークのトラブルシューティングや経路調査で大活躍する、ちょっぴり切なくて重要なメッセージ「ICMP Type 11 (Time Exceeded)」にスポットを当てます。
「難しそうな英語が出てきたな……」なんて身構えなくて大丈夫ですよ。一歩ずつ、身近な例えから紐解いていきましょう!
—
1. パケットの「寿命」ってご存知ですか?
私たちが普段何気なく使っているインターネット。自分のパソコンから送信されたデータ(パケット)は、世界中の無数のルーターという「交差点」を経由して、目的地のWebサーバーまで届けられます。
ここで、ちょっと想像してみてください。
もし、宛先が存在しないパケットや、設定ミスで永遠にルーターの間をぐるぐると回り続ける「迷子のパケット」が生まれたらどうなるでしょうか?
交差点はあっという間に迷子だらけになり、本当に届けたい大切なデータが渋滞に巻き込まれて、インターネット全体が麻痺してしまいますよね。
それを防ぐために、ネットワークの世界には「パケットの寿命(有効期限)」という素晴らしい仕組みが用意されています。
郵便配達で例えてみよう
これを「手紙の配達」に例えてみましょう。
あなたが友人に手紙を送るとき、封筒の隅に「この手紙は、最大でも5つのポスト(ルーター)までしか経由してはいけない」というスタンプが押されているとします。
郵便局員(ルーター)は、手紙を受け取るたびに、そのスタンプの数字を「5 ➔ 4 ➔ 3……」と減らしていきます。そして、ついに数字が「0」になってしまった時、どうなるでしょうか?
「これ以上、この手紙を旅させるわけにはいかないな……。ルール違反だから、ここでシュレッダーにかけるしかないか」
……とはなりません!優しい郵便局員さんは、ちゃんと差出人であるあなた(送信元)のところへ戻ってきて、こう教えてくれるのです。
「ごめんね、この手紙、寿命(TTL)が切れてしまって目的地まで届かなかったよ!」
この「寿命切れを伝えるメッセージ」こそが、今回主役のICMP Type 11 (Time Exceeded / 時間切れ)なのです。
—
2. TTL(Time To Live)と ICMP Type 11 の関係
ネットワークの世界では、先ほどの手紙のスタンプに相当する値を TTL(Time To Live) と呼びます。厳密には時間ではなく「ルーターを通過できる残りのホップ数(経由回数)」を意味しています。
パケットがルーターを1台通過するたびに、ルーターはこの TTL の値を「1」ずつ減らしていきます。
そして、運悪く(あるいは意図的に) TTL が 0 になってしまった瞬間、そのパケットを受け取ったルーターは、そのパケットを容赦なく破棄します。同時に、パケットの送信元へ向けて「ICMP Type 11 (Time Exceeded)」というお叱り(通知)の手紙を送り返すのです。
コードで見る!PythonでICMPパケットの挙動をイメージしてみよう
実際にプログラムやOSがどのようにネットワークと対話しているのか、Pythonを使った簡単なイメージコードを見てみましょう(※ソケットの低レイヤー処理を分かりやすく表現しています)。
import socket
import struct
def create_icmp_socket():
# ICMPプロトコルを扱うためのソケットを作成します
# ネットワークの基礎を学ぶ上で、OSのネットワーク機能に直接触れる第一歩です!
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
print("ICMPソケットの作成に成功しました。")
return sock
except PermissionError:
print("エラー: RAWソケットを作成するには管理者権限(rootなど)が必要です。")
return None
# ここでは概念的な流れを説明していますが、
# 実際のOSはTTL切れ(ICMP Type 11)を受信すると、自動的にアプリケーション層へ通知してくれます。
—
3. これが真骨頂! traceroute はどうやって道順を特定しているのか?
「寿命切れを知らせるメッセージ」が何をするものか分かったところで、現場のエンジニアが愛してやまない名コマンド traceroute(Windowsでは tracert) の裏側のカラクリを覗いてみましょう。
traceroute は、「自分のパソコンから目的地のサーバーまでに、どんなルーターを通っているか」を丸裸にする魔法のようなコマンドです。でも、これ、実はすごく泥臭いトリックを使っています。
意図的に「寿命切れ」を起こすクレバーな戦略
traceroute は、宛先に向かってパケットを投げる際、あえて TTL の値を 1、2、3……と、1つずつ増やしながら送信します。
1. TTL = 1 のパケットを送信!
- すぐ隣の「1台目のルーター」に届いた瞬間、ルーターが
TTLを減らして0にします。 - ルーターは「おっと、寿命だ!」と、送信元へ
ICMP Type 11を送り返します。 - これにより、「1台目のルーターのIPアドレス」が判明します!
2. TTL = 2 のパケットを送信!
- 1台目のルーターは無事に通過しますが、「2台目のルーター」に届いたところで
TTLが0になります。 - 2台目のルーターが
ICMP Type 11を送り返してくれます。 - これにより、「2台目のルーターのIPアドレス」が判明します!
3. これを目的地に届くまで繰り返す!
このように、「あえて途中で寿命切れを起こさせ、怒って返してくるルーターの返事(ICMP Type 11)をキャッチすることで、経路上にいるルーターの顔写真(IPアドレス)を順番にアルバムに収めていく」という、非常にユニークで理にかなった仕組みで動いているんです。
実践! traceroute コマンドを叩いてみよう
ご自身の端末(ターミナルやコマンドプロンプト)で、実際にこの通信の旅を覗いてみましょう。
# GoogleのパブリックDNS(8.8.8.8)までの経路を調査するコマンド例
# LinuxやmacOSの場合
traceroute 8.8.8.8
# Windows環境の場合(コマンドプロンプト)
tracert 8.8.8.8
実行すると、以下のような結果が画面に流れます。
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 2.124 ms 1.895 ms 1.654 ms <-- 自宅のWi-Fiルーター(TTL=1で応答)
2 10.0.0.1 (10.0.0.1) 5.432 ms 5.120 ms 4.980 ms <-- プロバイダの終端装置(TTL=2で応答)
3 172.16.100.1 (172.16.100.1) 12.341 ms 11.980 ms 12.110 ms <-- キャリアのバックボーン
...
左側に並んでいる数字(1, 2, 3……)こそが、送信時に指定した TTL の値そのものなのだと気づくと、ネットワークのロマンを感じずにはいられませんよね!
—
4. もう一つの発生条件:フラグメント再構築のタイムアウト
さて、ここまで「TTL切れ」を中心に解説してきましたが、実は ICMP Type 11 が発生するケースはもう一つあります。それが「IPフラグメントの再構築タイムアウト」です。
こちらも軽く触れておきましょう。
大きな荷物は分割して運ぶ
ネットワークでは、一度に送れるデータの大きさ(MTU と呼びます)に限界があります。そのため、巨大なデータを送る際は、ルーターや送信元で小さな断片(フラグメント)にバラバラに分割して送り、宛先で元の形にパッチワークのように組み立て直します。
しかし、ここでトラブルが発生します。
「バラバラにした荷物のうち、半分だけが先に届き、残りの半分が途中の事故で迷子になってしまった……」
宛先のコンピュータは待ち続けます。「早く残りのピースが届かないかなぁ……」。
しかし、いつまで経っても残りのピースが届きません。無限に待ち続けるわけにはいかないので、OSには「一定時間(タイマー)以内にすべてのピースが揃わなかったら、集まったピースはすべてゴミ箱行きにする」というルールがあります。
このタイマーがタイムアウトした瞬間、宛先のコンピュータは送信元へ向けて、こう叫びます。
「送ってくれた荷物のピース、途中で一部が届かなくなっちゃったから、諦めて全部破棄したよ!(ICMP Type 11: 発生コード 1)」
—
まとめ:パケットの「声」に耳を澄ませてみよう
いかがでしたでしょうか?今回は、少しとっつきにくそうな「ICMP Type 11 (Time Exceeded)」について、郵便配達の例えや traceroute の仕組みを交えて解説しました。
- TTLが0になると、ルーターはパケットを捨てて「ICMP Type 11」を送り返す。
tracerouteはこの仕組みを逆手に取り、わざとTTLを1ずつ増やして経路上のルーターを暴いている。- フラグメント(分割パケット)の組み立てが間に合わなかった時も、このメッセージが使われる。
ネットワークのトラブルシューティングに出会ったとき、パケットたちは常に私たちへ何かしらの「声」を送ってくれています。今回の仕組みを知っていれば、エラーログやパケットキャプチャを見たときに、「あ、今このルーターが寿命切れを優しく教えてくれているんだな」と、パケットたちのドラマが鮮やかに見えてくるはずです。
日々のインフラ学習、一歩ずつ楽しく深めていきましょう!
コメント