Edited at

tracerouteコマンドの動きについて

More than 1 year has passed since last update.


概要

ネットワークのトラブルシューティングの際、必ず使うコマンドの一つ。

http://itpro.nikkeibp.co.jp/article/COLUMN/20100225/344989/

によると


通信のあて先となるホスト(サーバーやネットワーク機器など)までの通信経路を表示するコマンドである



どのIPが出力されるか。

ネットワークが切り替わるタイミング、

つまり経由したレイヤー3のルーター等を経由した時にのみ出力される。

レイヤー2以下、スイッチや、無線LANのアクセスポイントを経由した場合は記録されないので、

レイヤー2以下の経路についてはこのコマンドで直接調べられない。


記録されるのは往路のみ。

復路の結果を知りたい場合、対向側から同様にtracerouteを実施してもらう必要がある。


tracerouteコマンドの仕組み

パケットのTTLを利用している。

TTLはルーターを経由するごとに1づつ減る。

宛先に到達する前にTTLが0になると、[ICMP time exceeded]というメッセージが送られる。

TTLを意図的に小さくしてパケットを送ることで途中経路のルーターの存在を知ることができる。

http://web.mit.edu/freebsd/head/contrib/traceroute/traceroute.c

950         for (ttl = first_ttl; ttl <= max_ttl; ++ttl) {

951 u_int32_t lastaddr = 0;
952 int gotlastaddr = 0;
953 int got_there = 0;
954 int unreachable = 0;
955 int sentfirst = 0;
956 int loss;
957
958 Printf("%2d ", ttl);
959 for (probe = 0, loss = 0; probe < nprobes; ++probe) {
960 register int cc;
961 struct timeval t1, t2;
962 register struct ip *ip;
963 struct outdata outdata;