ICMP Time Exceededとは
ICMP Time Exceeded(Type 11)は、IPv4ヘッダーのTTL(Time To Live)が0になったこと、またはフラグメントの再構成がタイムアウトしたことを送信元に通知するエラーメッセージです。RFC 792で定義されています。
TTLはパケットがループし続けて永久にネットワーク上に残ることを防ぐための仕組みで、ルータを1台経由するごとに1ずつ減算されます。TTLが0になったパケットはそれ以上転送されず、その時点のルータで破棄されます。破棄したルータは、パケットが失われたことを送信元に知らせるためにTime Exceededを送信します。
| Code | 意味 |
|---|---|
| 0 | TTL exceeded in transit:転送中にTTLが0になった(最も一般的) |
| 1 | Fragment reassembly time exceeded:フラグメントの再構成が規定時間内に完了しなかった |
パケットフォーマット
Time Exceededの「Rest of Header」は未使用(0埋め)で、Dataには問題の原因となった元のIPパケットの一部(IPヘッダー+先頭8バイト)が格納されます。これにより、送信元はどのパケットが破棄されたのかを識別できます。
| フィールド名 | サイズ | 説明 |
|---|---|---|
| Type | 1 バイト | 11固定。 |
| Code | 1 バイト | 0(TTL超過)または1(フラグメント再構成タイムアウト)。 |
| Checksum | 2 バイト | ICMPメッセージ全体を対象とした誤り検出用の値。 |
| Unused | 4 バイト | 未使用。すべて0。 |
| Data | 可変長 | 破棄された元のIPパケットの一部(一般的にはIPヘッダー+先頭8バイト。上位層がTCP/UDPの場合、送信元/宛先ポート番号を含む)。 |
tracerouteの仕組み
tracerouteは、このTime Exceededを意図的に発生させることで、宛先までの経路上にあるルータを1台ずつ特定するツールです。TTLを1から順に増やしながら同じ宛先にパケットを送信し、それぞれのTTLで「どのルータが破棄したか」を記録していきます。
R1(192.168.0.1)からR4(192.168.3.1)へtracerouteを実行し、途中にR2・R3が存在する場合の例です。
sequenceDiagram
participant R1 as R1
participant R2 as R2 (Hop1)
participant R3 as R3 (Hop2)
participant R4 as R4 (Hop3・宛先)
Note over R1: TTL=1のパケットを送信
R1->>R2: パケット(TTL=1→0で破棄)
R2-->>R1: ICMP Time Exceeded(Type 11, Code 0)
送信元: R2のIPアドレス
Note over R1: TTL=2のパケットを送信
R1->>R2: パケット(TTL=2→1で通過)
R2->>R3: パケット(TTL=1→0で破棄)
R3-->>R1: ICMP Time Exceeded(Type 11, Code 0)
送信元: R3のIPアドレス
Note over R1: TTL=3のパケットを送信
R1->>R2: パケット(TTL=3→2で通過)
R2->>R3: パケット(TTL=2→1で通過)
R3->>R4: パケット(TTL=1→0だが宛先到達)
Note over R4: 宛先ホストは、UDPなら
Destination Unreachable(Port)、
ICMPならEcho Replyを返す
- TTL=1のパケットを送信すると、最初のホップであるR2でTTLが0になり破棄される。R2は自身のIPアドレスを送信元としたTime Exceededを返す。これにより1ホップ目の機器がR2であると判明する。
- TTL=2のパケットを送信すると、R2は通過させるがR3で破棄される。R3からTime Exceededが返り、2ホップ目がR3であると判明する。
- 以降TTLを1ずつ増やしながら同様の送信を繰り返し、パケットが最終的に宛先R4へ到達するまで続ける。
- 宛先に到達すると、パケットはそれ以上転送されないためTime Exceededは発生しない。宛先ホストからの応答(後述)を受け取った時点でtracerouteは終了する。
OSによるプローブパケットの違い
「TTLを1ずつ増やして送る」という基本原理は共通ですが、実際にどのプロトコルのパケットを送信するかはOSによって異なります。これは、宛先到達時にどのような応答で終了を判定するかにも直結します。
| OS/機器 | コマンド | 既定のプローブ | 宛先到達時の応答 |
|---|---|---|---|
| Linux/macOS | traceroute | UDP(宛先ポート33434以降を使い捨てで使用) | ICMP Destination Unreachable(Port Unreachable, Code 3) |
| Windows | tracert | ICMP Echo Request | ICMP Echo Reply |
| Cisco IOS XE | traceroute | UDP(宛先ポート33434以降) | ICMP Destination Unreachable(Port Unreachable) |
tracertはICMP Echo Requestを使うため、ICMPが遮断されている場合に同様の問題が起こります。実機での検証
R1〜R4(Cisco IOS XE)を下図のとおり直列に接続し、各ルータに隣のルータ方向へのスタティックルート(デフォルトルート)を設定しています。各ルータの経路が隣接ルータへ順につながっているため、R1→R4方向に限らずR1〜R4間で双方向に疎通が可能です(Time Exceeded・Destination UnreachableといったICMPエラーがR2・R3・R4からR1へ返ってこられるのも、この戻り経路があるためです)。R1からtraceroute 10.3.4.4を実行し、Cisco IOS XEのtraceroute(UDPプローブ)の動作をパケットキャプチャで確認しました。
tracerouteの実行結果
R1#traceroute 10.3.4.4
Type escape sequence to abort.
Tracing the route to 10.3.4.4
VRF info: (vrf in name/id, vrf out name/id)
1 10.1.2.2 7 msec 4 msec 3 msec
2 10.2.3.3 4 msec 3 msec 3 msec
3 10.3.4.4 78 msec * 11 msec
R1#Cisco IOS XEのtracerouteは、各TTL値ごとに3回ずつプローブを送信し、往復時間を表示します。1ホップ目・2ホップ目はそれぞれR2(10.1.2.2)・R3(10.2.3.3)からTime Exceededが返っており、3ホップ目は宛先R4(10.3.4.4)に到達したことを示しています。3ホップ目の2回目のプローブは*(応答なし=タイムアウト)になっており、実際のキャプチャでも該当するプローブへの応答パケットが記録されていません。
パケットキャプチャ
送信元ポートは1プローブごとに1つずつ増加し(49154, 49155, …)、宛先ポートも同様に増加します(33434, 33435, …)。これはUDPプローブ自身にSequence Numberに相当する識別情報がないため、ポート番号の組み合わせでどのプローブに対する応答かを区別しているためです。
1ホップ目(TTL=1): R2からのTime Exceeded
Ethernet II, Src: 52:54:00:2a:86:3e, Dst: 52:54:00:a8:33:3e
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 10.1.2.1, Dst: 10.3.4.4
Time to Live: 1
Protocol: UDP (17)
Total Length: 28
User Datagram Protocol, Src Port: 49154, Dst Port: 33434
Length: 8 (データ0バイト)Ethernet II, Src: 52:54:00:a8:33:3e, Dst: 52:54:00:2a:86:3e
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 10.1.2.2, Dst: 10.1.2.1
Time to Live: 255
Protocol: ICMP (1)
Total Length: 56
Internet Control Message Protocol
Type: 11 (Time Exceeded)
Code: 0 (TTL exceeded in transit)
Checksum: 0x0f22
Unused: 0x00000000
[元のデータグラム]
Internet Protocol Version 4, Src: 10.1.2.1, Dst: 10.3.4.4, Time to Live: 1
User Datagram Protocol, Src Port: 49154, Dst Port: 33434TTL=1で送信されたプローブがR2で破棄され、R2(10.1.2.2)自身を送信元としたTime Exceededが返っています。
2ホップ目(TTL=2): R3からのTime Exceeded
Ethernet II, Src: 52:54:00:a8:33:3e, Dst: 52:54:00:2a:86:3e
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 10.2.3.3, Dst: 10.1.2.1
Time to Live: 254
Protocol: ICMP (1)
Total Length: 56
Internet Control Message Protocol
Type: 11 (Time Exceeded)
Code: 0 (TTL exceeded in transit)
Checksum: 0x0f22
Unused: 0x00000000
[元のデータグラム]
Internet Protocol Version 4, Src: 10.1.2.1, Dst: 10.3.4.4, Time to Live: 1
User Datagram Protocol, Src Port: 49157, Dst Port: 33437送信元がR3(10.2.3.3)に変わっている点に注目してください。プローブ自体はTTL=2で送信されていますが(R1→R2間のキャプチャ時点ではTTL=2)、R2を通過する際に2→1へ減算され、R3で1→0となって破棄されるため、Time Exceededの中に埋め込まれた元パケットのTTLは(送信時の値ではなく)破棄された時点の値である1になっています。
3ホップ目(TTL=3): 宛先R4からのDestination Unreachable(Port Unreachable)
Ethernet II, Src: 52:54:00:2a:86:3e, Dst: 52:54:00:a8:33:3e
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 10.1.2.1, Dst: 10.3.4.4
Time to Live: 3
Protocol: UDP (17)
Total Length: 28
User Datagram Protocol, Src Port: 49160, Dst Port: 33440
Length: 8 (データ0バイト)Ethernet II, Src: 52:54:00:a8:33:3e, Dst: 52:54:00:2a:86:3e
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 10.3.4.4, Dst: 10.1.2.1
Time to Live: 253, DSCP: CS6 (0xc0)
Protocol: ICMP (1)
Total Length: 56
Internet Control Message Protocol
Type: 3 (Destination Unreachable)
Code: 3 (Port Unreachable)
Checksum: 0x171f
Unused: 0x00000000
[元のデータグラム]
Internet Protocol Version 4, Src: 10.1.2.1, Dst: 10.3.4.4, Time to Live: 1
User Datagram Protocol, Src Port: 49160, Dst Port: 33440TTL=3のプローブはR2・R3を通過(TTL 3→2→1)してR4に到達します。R4は宛先ポート33440で待ち受けているプロセスが存在しないため、ICMP Destination Unreachable(Type 3, Code 3: Port Unreachable)を返送しています。前述のとおり、Time Exceededとは異なりTypeが3になっている点、送信元が宛先ホストR4自身になっている点が、tracerouteが「宛先に到達した」と判断するポイントです。
78 msec * 11 msecと、2回目のプローブがタイムアウト(*)しています。実際のキャプチャでも、1・3回目のプローブ(送信元ポート49160・49162)にはそれぞれ約0.06秒後にPort Unreachableが返っている一方、2回目のプローブ(送信元ポート49161)に対する応答パケットは記録されておらず、次のプローブが送信されるまで約3秒間応答を待っていたことが確認できます。 R1 config(r1_icmp-time-exceeded.cfg) をダウンロード
R2 config(r2_icmp-time-exceeded.cfg) をダウンロード
R3 config(r3_icmp-time-exceeded.cfg) をダウンロード
R4 config(r4_icmp-time-exceeded.cfg) をダウンロード