インターネットって何だろう?

第14回ネットワーク運用には欠かせない!tracertコマンド

前回は、ネットワークの向こう側にいる相手がIP的に到達可能かどうかを確認するためのpingコマンドを紹介しました。次は、ネットワークの向こうにいるホストまでの経路を知ることが出来るtracerouteコマンドです(UNIX系、Mac OS Xはtraceroute、Windowsではtracert⁠⁠。

ここでは、ユーザ環境がWindowsであると想定して書いていますが、UNIX系OSやMac OS Xをご利用の場合は「tracert」の部分を「traceroute」に置き換えて読んで下さい。

とりあえず、試してみよう

tracertは、指定した宛先までの途中経路を表示してくれます。名前も「trace」「route」と、経路を探索するという意味を持っています。

では、実際にtracertコマンドを試してみましょう。たとえば、www.google.co.jpまでtracertした場合には図1のような感じの出力になります(ただし、図中のホストやIPアドレスには一部存在しないものを入れています⁠⁠。

図1 tracert例
図1 tracert例

tracertの結果では、指定した宛先までの途中ルータがわかります。また、それぞれまでのRTT(Round Trip Time)も表示されます。 IPアドレスに対応するホスト名(FQDN)がDNSの逆引きで取得できない場合には、IPアドレスのまま表示されます。

この結果では、目的のホストまで17ホップあることがわかります。

tracertは何故動くか?

では、何故tracertは動作するのかという説明をしたいと思います。

インターネットには、特定のパケットが永遠にネットワーク内を徘徊しないように、各パケットに安全装置があります。安全装置は、IPヘッダ内にTTL(Time To Live)というフィールドを作ることによって実現しています。このTTLフィールドは、ルータによりパケットが転送されるたびに値が1引かれます。

IPパケットの転送が繰り返されると、TTLの値は転送ごとに減って行きます。最終的にIPパケットが宛先まで届けば良いのですが、宛先に届く前にTTLが0になってしまうとIPパケットは消滅します。しかし、単に消滅してしまうと何が起きたのかがわからない場合があるので、ルータはTTLが0のIPパケットを破棄するときにはIPパケットを送った送信元に対してICMP Time Exceededという種類のICMPパケットを送信します。

tracertは、このICMP Time Exceededを利用しています。意図的にTTLの値を小さくして、ICMP Time Exceedが発生する環境を作成しているのです。

では、実際のtracertの動作を見て行きましょう。

tracertは、まず最初にTTL=1でIPパケットを送信します。すると、パケットが一度転送された状態でTTLが0となり、tracertを実行した機器の隣のルータからICMP Time Exceedが返ってきます。

図2 TTL=1でIPパケットを送信
図2 TT

次に、TTL=2でIPパケットを送信します。今度は、隣の隣にいるルータがICMP Time Exceed を返してきます。

図3 TTL=2でIPパケットを送信
図3 TT

このように順次TTLを上げていき、徐々に届く範囲を広げていきます。最終的にIPパケットが目的の宛先に到着するまで送信するTTLは上がっていきます。

最後の1ホップ

このようにTTLの値を利用して1ホップずつ把握していけるtracertですが、このままでは最終的な目的地に到達したときに困ります。本来の目的地についたということは、TTLとして十分な値が設定されたということだからです。ICMP Time Exceedが送信されるのはTTLが0となった場合であるため、パケットが目的地に到達した場合にはICMP Time Exceedは送信されません。

そのため、tracertは最後の1ホップだけはICMP Time Exceedを利用しません。最終的な目的地にIPパケットが到着したことを知る手段で一般的なものは2つあります。

1つは、tracertによって送信されるIPパケットをICMP Echoパケットにすることです。それにより、ICMP Echoパケットを受け取った宛先はICMP Echo Replyを返してくれます。ICMP EchoとICMP Echo Replyに関してはpingの説明をご覧ください。

2つめの方法は、tracertによって送信されるIPパケットをUDPにすることです。UDPの宛先ポート番号は、宛先でサービスが存在しないものを利用します。そうすることにより、宛先にUDPパケットが届いたときに、宛先ホストはICMP Port Unreachを送り返してくれます。 ICMP Port Unreachは、⁠そのポートは開いていないよ」と教えてくれるICMPメッセージです。

このような方法でtracertは途中経路を計測しています。

tracertはインターネットの仕組みを巧みに利用したアプリケーションであり、ネットワークのトラブルシューティングにはなくてはならないものです。tracertを使ったことがない方も、ぜひ、使い方を覚えてください。

注意事項

ただし、一点注意すべきことがあります。覚えたら使いたくなるのが人情ですが、自分で管理していないホストへむやみにtracertをしないよう、ご注意ください。

コンピュータセキュリティに関しては人により考え方が異なります。tracertでパケットを送られるという事を「攻撃をされた」と受け取る人もいます。トラブルに巻き込まれないためにも、他人のホストにむやみにtracertは控えましょう。

あと、tracertのRTTだけを見てルータの性能だと考えるのも避けましょう。ルータにとってはTTLが無くなったパケットのためのICMPパケットを作成するのは負荷の高い作業です。そのため、多くのトラフィックが集中するCoreルータでは、ICMPパケットの優先度を低くしている場合があります。

「何か自分のネットワークが遅い」と思ってtracertしてみて、Coreルータっぽいところで急にRTTが大きくなったからこのネットワークのバックボーンは弱いに違いないという考え方はしないでください。多くの場合は単にICMPパケット生成の優先度が下げられているだけで、その予測は間違いです。

最後に

今回は、ネットワーク管理には欠かせないtracertコマンドを紹介しました。tracertは、ネットワーク運用だけではなく、研究にも活用されています。次回は、ネットワーク管理という視点ではなく、tracertを使う事でインターネット全体の状況を把握しようとしている人々を紹介しようと思います。

おすすめ記事

記事・ニュース一覧