【入門編】 ICMP Type 11 (Time Exceeded) の発生条件 – ネットワーク基礎とWebセキュリティ実践ガイド

こんにちは!ネットワークやインフラの世界へようこそ。
日々の業務や学習で、パケットが飛び交う仕組みに触れるたび、「一体ルーターの中では何が起きているんだろう?」とワクワクしたり、時には途方に暮れたりしていませんか?

今回は、ネットワークのトラブルシューティングや経路調査で大活躍する、ちょっぴり切なくて重要なメッセージ「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ずつ増やして経路上のルーターを暴いている。
  • フラグメント(分割パケット)の組み立てが間に合わなかった時も、このメッセージが使われる。

ネットワークのトラブルシューティングに出会ったとき、パケットたちは常に私たちへ何かしらの「声」を送ってくれています。今回の仕組みを知っていれば、エラーログやパケットキャプチャを見たときに、「あ、今このルーターが寿命切れを優しく教えてくれているんだな」と、パケットたちのドラマが鮮やかに見えてくるはずです。

日々のインフラ学習、一歩ずつ楽しく深めていきましょう!

コメント

タイトルとURLをコピーしました