Traceroute
tracerouteはTTLを1ずつ増やしながらパケットを送信することで、経路情報を取得する。TTLとはパケットの生存期間を表し、ルータを1つ経由することに1ずつ減算される。ルータはTTLが2以上のパケットが届いた場合、TTLの値を1だけ小さくし次のルータへ転送する。TTLが1のパケットが届いた場合、届いたパケットを破棄してICMP time exceededパケットを送信者に返す。
tracerouteはまず、TTLを1にセットしたパケットを送信する。最初のルータに届いた時点でTTLがゼロになり、ICMP time exceededメッセージが戻ってくる。このメッセージの送信元アドレスを見れば、最初のルータのIPアドレスがわかる。次にTTLを2にセットして送信すると、今度は2番目のルータからICMP time exceededが戻ってくる。以降、TTLを3、4・・・と増やしていく事で、順にルータのIPアドレスを得る事ができる。
実際には、以上の作業を3回繰り返して行い、応答までに要した時間を表示する。経由しているルータが応答せずタイムアウトが発生した場合は、*マークを表示する。tracerouteで得られる経路情報は往路のみである。反対側からの経路も同じとは限らない。
tracerouteが送信するパケットは原理上は何でも構わないが、一般的なtracerouteの実装ではランダムなポート番号のUDPデータグラムが使用される。
Windowsのtracertではpingと同じICMP Echo requestパケットを使用している。また、オプションスイッチによって使用するパケットを切り替えられる実装もある。
UDPを使用するtracerouteは、ポート番号が定まらないためパケットフィルタリングを行っているネットワークでは利用が難しい面があり、特にファイアウォールがある場合は問題になりやすい。また、最終的な宛先ノードにパケットが到達した際、ICMP Echo requestの場合は単にICMP Echo replyが返されるだけだが、UDPの場合は、たまたまそのポート番号が使われていた等で、期待した動作にならない事がある。
他方、ICMPを使用した実装は、ICMP Echo requestメッセージのTTL切れに対してICMP time exceededが発生する事を前提としている。RFC1812ではICMPがクエリとエラーに分けられ、クエリに対するエラーの送信は禁止されてはいないが、RFC792では単に「ICMPメッセージについてのICMPは送信しない」とされており、この記述には合致していない。現代ではほとんどの機器で動作するが、RFC792だけを見て実装された機器では期待通りに動かない可能性もある。