traceroute
宛先までの経路上にあるルータを、順番に調べるコマンド。IPv4のTTL(IPv6のホップリミット)を1から順に増やしながらパケットを送り、途中のルータから返ってくるICMPのエラーで、経由した機器を知る。
イマシルちゃんの解説
pingが「相手まで届く?」を調べる道具なら、
tracerouteは「相手まで、どの道を通っていくの?」を調べる道具なんだ。
「1つ目の交差点まで行ったら戻ってきて」「次は2つ目まで」……って、
少しずつ遠くまで行かせて、そのたびに「ここまで来たよ」って返事をもらうんだよ。
そうすると、通り道の交差点(ルータ)が、順番にわかるんだ!
より深い解説
定義
traceroute(Windowsでは tracert、IPv6用には traceroute6 や tracert -6)は、宛先までの経路上のルータを列挙し、それぞれまでの往復時間を表示するコマンドである。
仕組み
- TTL(ホップリミット)を1にしたパケットを宛先に送る
- 1台目のルータで、TTLが0になってパケットが破棄され、ルータからICMPの時間超過(IPv6ではICMPv6 Time Exceeded)が返ってくる。その送信元アドレスが、1台目のルータのアドレスである
- TTLを2、3…と増やしながら同じことを繰り返す
- 宛先に届くと、宛先から応答(UNIXのtracerouteではUDPの宛先ポート到達不能、Windowsのtracertではエコー応答)が返り、終了する
| 実装 | 送るパケット |
|---|---|
| UNIX系の traceroute | UDP(使われていない大きなポート番号宛て) |
| Windowsの tracert | ICMPのエコー要求 |
表示されるアドレス
時間超過のメッセージの送信元は、パケットを受信したインタフェース(または実装によって決まるインタフェース)のアドレスである。そのため、ルータのインタフェースにどのアドレスを割り当てているかで、表示が変わる。
| 状況 | 結果 |
|---|---|
| 各インタフェースに固有のGUA(IPv6)や管理しやすいアドレスを割り当てている | アドレスから、どの機器のどのインタフェースかを識別しやすい |
| アドレスを割り当てていない(IPv6でLLAだけ) | ほかのインタフェースのアドレスで応答するなど、どの機器かが分かりにくくなる |
| 途中の機器がICMPを返さない、遮断されている | その段は「*」と表示される |
IPv6でルータ間のネットワークにGUAを静的に割り当てる利点の1つは、traceroute6 で経路を調べたときに、各機器を識別しやすくなることである。
結果を読むときの注意
| 注意点 | 内容 |
|---|---|
| 行きの経路しかわからない | 戻りの経路は別のことがある |
| 負荷分散 | 経路が複数あると、試行ごとに違うルータが表示されることがある |
| ICMPの扱い | ICMPの応答を後回しにするルータでは、表示される時間が実際の転送の遅延より長くなることがある |