traceroute(Windowsではtracert)は、あるホストから別のホストまでのネットワーク経路をリスト表示するコマンドだ。ここでいう経路とは、ホスト間を接続するルーター(ゲートウェイ)のこと。tracerouteにより、経路上にどのようなルーターが位置しているかを表示する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
traceroute(Windowsではtracert)は、あるホストから別のホストまでのネットワーク経路をリスト表示するコマンドだ。ここでいう経路とは、ホスト間を接続するルーター(ゲートウェイ)のこと。tracerouteにより、経路上にどのようなルーターが位置しているかを表示する。
主な用途としては、pingで相手ホストから正常な応答がなかった場合などに、ホスト自身や経路上のルーターのルーティング設定が正しいかどうかを確認するために用いられる。また、目的ホストまでのルーターのリストから、「設置場所が不明なホストのおおまかな場所を推測する」といった利用も行えるだろう。
その他、各ルーターからのレスポンス時間などの統計値も表示されるので、経路上のボトルネックを探るなどの簡易的なネットワーク性能評価にも役立つ。
IPv4/v6兼用
tracert [-d] [-h 最大ホップ数] [-j ゲートウェイ・リスト] [-w タイムアウト時間] [-R] [-S ソースアドレス] [-4] [-6] 対象ホスト(ホスト名またはIPアドレス)
-d | 結果に表示するIPアドレスからホスト名への名前解決を行わない |
---|---|
-h | 使用する最大TTL(Time To Live)。つまりここで指定した数のルーターしかホップしない |
-j | 経由すべきゲートウェイ(ルーター)のアドレスを最大9個まで指定できる。ただし指定されていないゲートウェイも経由できる(loose source routed)。IPv4のみ |
-w | タイムアウト時間を指定する。単位はミリ秒 |
-R | 往復のパスをトレースする。IPv6のみ |
-S | 自身ではない別のホストを送信元ホストとして指定する。ただしもちろん結果は自身へは返ってこない。あくまで試験用オプション。IPv6のみ |
-4 | IPv4の使用を強制する |
-6 | IPv6の使用を強制する |
IPv4用
traceroute [-adDeFInrSvx] [-A ASサーバ] [-f 初期TTL値] [-g ゲートウェイ・リスト] [-i インタフェース] [-M 初期TTL値] [-m 最大TTL値] [-P プロトコル] [-p ポート番号] [-q 試行回数] [-s 送信元アドレス] [-t TOS] [-w 待機時間] [-z pausemsecs] 対象ホスト(ホスト名またはIPアドレス) [パケットサイズ]
-a | BGPのAS番号を表示する |
---|---|
-d | モードで動作する |
-D | パケットの内容を表示する |
-e | ファイアウォール回避モード。通常は試行の度にインクリメントされる送信先ポート番号を固定してファイアウォールを回避しやすくする |
-F | IPパケットの分割(フラグメント)を禁止する |
-I | UDPの代わりにICMP Echo Requestを用いる。これは-Pオプションのシノニムでもある |
-n | 出力をIPアドレスのみに抑制する(DNS逆引きを行わない) |
-r | ルーティングテーブルを無視して直接パケットを指定したホストに転送するように指示する。すなわち、同一の物理ネットワーク上に目的のホストがない場合はエラーになる |
-S | ホップごとに返答率を表示する |
-v | 詳細モード |
-x | ICMPのCheckSumの評価を行う |
-A | BGPのAS番号を表示するとともに、指定されたASサーバを使用する |
-f | 使用するTTLの初期値を指定する |
-g | 経由すべきゲートウェイ(ルーター)のアドレスを最大8個まで指定できる |
-i | 指定されたインタフェース(バインドされたIPアドレス)を用いて実行する |
-M | 使用するTTLの初期値を指定する |
-m | 使用するTTLの最大値を指定する。つまりこの最大値のホップ数のゲートウェイまでが表示される |
-P | 使用するIPプロトコルを指定する。UDP、TCP、GRE、ICMPが指定できる |
-p | 使用するUDP/TCPパケットのポート番号を指定する(UDP/TCPパケットを使用する場合) |
-q | 1つのゲートウェイに対する試行回数を指定する。デフォルトは3 |
-s | 指定されたIPアドレスからの実行とする(Source Addressを指定する) |
-t | パケットのTOS(Type Of Service)を指定された値に設定する |
-w | タイムアウト時間を指定する。単位は秒 |
IPv6用
traceroute6 [-dIlnNrUv] [-f 初期ホップ数] [-g ゲートウェイ・リスト] [-m 最大ホップ数] [-p ポート番号] [-q 試行回数] [-s 送信元アドレス] [-w 待機時間] 対象ホスト(ホスト名またはIPアドレス) [パケットサイズ]
-d | デバッグモードで動作する |
---|---|
-I | UDPの代わりにICMP Echo Requestを用いる |
-l | ホスト名とIPアドレス両方を表示する |
-n | 出力をIPアドレスのみに抑制する(DNS逆引きを行わない) |
-N | 調査目的のため、上位レイヤーのヘッダを含まないようにする |
-r | ルーティングテーブルを無視して直接パケットを指定したホストに転送するように指示する。すなわち、同一の物理ネットワーク上に目的のホストがない場合はエラーになる |
-U | UDPパケットを用いる(デフォルト) |
-v | 詳細モード |
-f | 使用する初期ホップ数を指定する。つまりこの初期値のホップ数のみのトレースとなる |
-g | 経由すべきゲートウェイ(ルーター)のアドレスを最大8個まで指定できる |
-m | 最大ホップ数を指定する。最大は255、デフォルトは30 |
-p | 使用するUDP/TCPパケットのポート番号を指定する(UDP/TCPパケットを使用する場合) |
-q | 1つのホップにおける試行回数を指定する |
-s | 指定されたIPアドレスから実行する(Source Addressを指定する) |
-w | タイムアウト時間を指定する。単位は秒 |
IPv4およびv6用
traceroute [-46dFITnreAUDV] [-f 初期TTL値] [-g ゲートウェイ・リスト] [-i インタフェース] [-m 最大TTL値] [-N 並列数] [-p ポート番号] [-P プロトコル番号] [-t TOS] [-l フローラベル] [-w タイムアウト時間] [-q 試行回数] [-s 送信元アドレス] [-z 間隔時間] [--sport=送信元ポート番号] [ --fwmark=num] [-UL] [-M プロトコル] [-O mod_options] [--mtu] [--back] 対象ホスト(ホスト名またはIPアドレス) [パケットサイズ]
IPv6用
traceroute6 [-dnrvV] [-m 最大TTL値] [-p ポート番号] [-q 試行回数] [-s 送信元アドレス] [-t TOS] [-w タイムアウト時間] 対象ホスト(ホスト名またはIPアドレス) [パケットサイズ]
-4 | IPv4の使用を強制する |
---|---|
-6 | IPv6の使用を強制する |
-d | デバッグモードで動作する |
-F | IPパケットの分割(フラグメント)を禁止する |
-I | ICMP Echo Requestを用いる |
-T | TCP SYNパケットを用いる。デフォルトのポート番号は80 |
-n | 出力をIPアドレスのみに抑制する(DNS逆引きを行わない) |
-r | ルーティングテーブルを無視して直接パケットを指定したホストに転送するように指示する。すなわち、同一の物理ネットワーク上に目的のホストがない場合はエラーになる |
-e | ICMPの拡張を表示する |
-A | BGPのAS番号を表示する |
-U | UDPパケットを用いる。デフォルトのポート番号は53 |
-D | DCCP(Datagram Congestion Control Protocol/RFC 4340)を用いる。デフォルトのポート番号は33434 |
-V | バージョン情報を表示する |
-f | 使用するTTLの初期値を指定する |
-g | 経由すべきゲートウェイ(ルーター)のアドレスを最大8個まで指定できる。ただし指定されていないゲートウェイも経由できる(loose source routed) |
-i | 指定されたインタフェース(ネットワークカード名。バインドされたIPアドレスでも可)を用いて実行する |
-m | 使用するTTLの最大値を指定する。つまりこの最大値のホップ数のゲートウェイまでが表示される |
-N | 並列してパケットを送信する数。デフォルトは16。大きな値を指定することは推奨されない |
-p | 使用するUDP/TCPパケットのポート番号を指定する(UDP/TCPパケットを使用する場合)。またICMPパケットの場合は初期シーケンス番号を指定する |
-P | RAWパケットを使用するためのプロトコル番号を指定する。デフォルトは253 |
-t | パケットのTOS(Type Of Service)を指定された値に設定する。IPv6の場合はトラフィックコントロール値を指定する |
-I | IPv6のフローラベルを指定する |
-w | タイムアウト時間を指定する。単位は秒。デフォルトは5秒 |
-q | 1つのゲートウェイに対する試行回数を指定する。デフォルトは3回 |
-s | 指定されたIPアドレスから実行する(Source Addressを指定する) |
-z | 送信パケットの間隔時間(秒)。デフォルトは0秒 |
--sport | 送信元ポート番号を指定する |
--fwmark | パケットへファイアウォールマーク(SO_MARK)を設定する |
-UL | UDPLITE(RFC 3828)パケットを使用する |
-M | 用いるプロトコルを指定する。デフォルトは“default”(UDP)である。また“icmp”または“tcp”が指定できる。-U、-Iまたは-Tオプションと同じ |
-O | 用いるプロトコルごとの拡張オプションを指定する |
--mtu | MTUを決定するために指定する。このオプションを指定すると現在のMTU値も表示する。-Fオプションと組み合わせることで各経路でのMTUを調査できる |
--back | 復路のホップ数を表示する |
traceroute(Windowsではtracert)の最も簡単な使用方法は、引数として経路を調査したいホストを指定する方法である。ホスト名かIPアドレスが指定できる。
C:\>tracert www.example.net www.example.net [93.184.216.119] へのルートをトレースしています <---(1) 経由するホップ数は最大 30 です: <---(2) 1 <1 ms <1 ms <1 ms xxxxx [192.168.1.1] 2 8 ms 6 ms 6 ms tokyoxx-xxx.flets.2iij.net [210.149.xx.xx] 3 5 ms 6 ms 5 ms TOKYOxx-NTTxxxx.flets.2iij.net [210.149.xx.xx] 4 6 ms 5 ms 5 ms tky001lip30.iij.net [203.180.20.97] 5 5 ms 5 ms 5 ms tky001bb10.IIJ.Net [210.138.115.209] <---(3) 6 6 ms 6 ms 6 ms tky009bf01.IIJ.Net [58.138.80.21] 7 90 ms 92 ms 89 ms sea001bf00.IIJ.net [206.132.169.121] 8 110 ms 109 ms 109 ms xe-0-5-0-11.r05.sttlwa01.us.bb.gin.ntt.net [129.250.198.177] 9 110 ms 109 ms 152 ms xe-0-0-0-28.r05.sttlwa01.us.ce.gin.ntt.net [198.104.202.90] 10 104 ms 106 ms 105 ms 93.184.216.119 トレースを完了しました。
上の例では、www.example.netへの経路を表示している(経路情報は一部マスクしてある)。
(1)の部分は、以下の結果がこのホスト名とIPアドレスへの経路であることを示している。
(2)は、最大で30個の経路情報を表示することを示している。ルーターにより、あるサブネットから別のサブネットへパケットがルーティングされることを「ホップ:Hop」と呼び、「ルーターを1つ越える」単位を“1Hop”として数えることがある。つまり30 hopsは、最大30台のルーターまでをリストアップすることを意味する。また、このホップはTTL(後述)の最大値とも一致することになる。
(3)が経路情報の一覧となる。各行は順に、「順序番号」「各ルーター間のレスポンス時間(試行3回分のそれぞれの結果。単位はミリ秒)」「(DNSに登録されている場合)ホスト名」「IPアドレス」を意味している。10番目の結果は指定したホスト自身であるので、経路上には9台のルーターが配置されていることが分かる。
各ルーターからのレスポンス時間は、この例ではそれぞれ3回の試行結果が表示されている。これを基に、極端に時間がかかっているルーター間がボトルネックであると理解できる。この例ではどうやらルーター名から推測するに、日本―アメリカ間の接続網が最も全体のレスポンスに影響を与えているであろうことが分かる。なお、この試行回数はオプションで変更することもできる。
IPv6での例も示しておこう。
$ traceroute6 www.example.net traceroute to www.example.net (2606:2800:220:6d:26bf:1447:1097:aa7) from 2400:8900::xxxx:xxxx:xxxx:xxxx, 30 hops max, 16 byte packets 1 2400:8900:ffff:0:xxxx:xxxx:xxxx:xxxx (2400:8900:ffff:0:xxxx:xxxx:xxxx:xxxx) 1.848 ms 0.534 ms 0.565 ms 2 2001:268:f702:6c::1 (2001:268:f702:6c::1) 2.568 ms 0.924 ms 0.621 ms 3 6otejbb205.int-gw.kddi.ne.jp (2001:268:fb13:1::1) 1.76 ms 2.054 ms 1.799 ms 4 6pajbb001.int-gw.kddi.ne.jp (2001:268:fb02:53::2) 119.672 ms 107.226 ms 107.178 ms 5 6ix-pa4.int-gw.kddi.ne.jp (2001:268:fb81:27::2) 259.832 ms 316.889 ms 168.779 ms 6 2001:268:fc81:7::2 (2001:268:fc81:7::2) 118.001 ms 117.768 ms 120.898 ms 7 10ge11-6.core1.lax1.he.net (2001:470:0:34::2) 114.145 ms 107.853 ms 116.516 ms 8 ec-eqix1-lax-10g.edgecastcdn.net (2001:504:0:3:0:1:5133:1) 189.411 ms 220.958 ms 185.971 ms 9 2606:2800:220:6d:26bf:1447:1097:aa7 (2606:2800:220:6d:26bf:1447:1097:aa7) 192.614 ms 187.726 ms 183.261 ms
上のように基本的にはIPアドレスがIPv6形式で表示されるだけで、v4と変わらないと考えてよい。
traceroute(tracert)コマンドでは、こうした経路上に存在する各ルーターを割り出すために、IPパケットにおけるTTL(Time To Live)の仕組みをうまく利用している。TTLとはIPパケットヘッダに指定可能な「生存時間」という意味だ。ただし時間ではなく、「ホップ数」を意味している。つまり、そのパケットが「生存」できるホップ数を指定するのがTTLなのである。
もともとインターネットに代表されるIPネットワークはさまざまなネットワークの集合体なので、接続環境やルーティング設定についても、完全なものである保証は全くない。もしルーティング設定が間違っていれば、一度発生したパケットが延々ループに陥って、いつまでもインターネット上をさまよい続けるという事態も考えられないではない。そこでIPパケットの送出時には必ずTTLを設定することになっている。TTLは最大255まで設定可能で、ルーターをホップする度に必ず1ずつ減らされる。そして0に達したパケットは発見したルーターが破棄することになっている。
どの程度のTTLなら十分なのかは、目的ホストまでにたどり着くまでにどれだけのルーターやゲートウェイを越える可能性があるかによる。つまり、これはインターネットの「広さ」と密接に関連している。通常は30程度までとされているが、一般的なアプリケーションでは255や128など、十分な大きさを指定する場合が多いようだ。
パケットが単に破棄されたままでは送信元ホストは正しく相手のホストにパケットが届いたかどうか分からない。そこで、(ルーターの設定にもよるのだが)破棄したルーターはICMPのTime Exceededエラー(Type=11)を送信元ホストへ報告することになっている。この通知を受け取ることで、送信元ホストはルーティングなどに何らかの問題が発生していることを知ることができるわけだ。
tracerouteコマンドでは、このTTLを1から順に増やして試行を重ねて結果を得ている。
例えば、最初にTTLを1としてIPパケットを対象ホストへ送出すると、1番目のルーター(1ホップ目)が受け取った時点でTTLを減算した結果0となってしまうので、ルーターはICMP Time Exceededエラーを返答する。これが1台目のルーターの結果となる。次にTTLを2にして送出すれば、2台目のルーターの結果が得られる。
このように、目的のホストに到達するまでTTLを増加させつつ次々にパケットを送出することで、tracerouteの結果を得ることができるというわけだ。
LinuxやmacOSでは、tracerouteコマンドのためにICMPではなくUDPパケットを使用することもできる(Linuxでは逆にデフォルトがUDPとなっている)。
tracerouteなどのネットワーク経路の調査にはICMPの機能を利用すると理解している人からすると違和感があるかもしれないが、上記のようなtracerouteの動作原理が分かればそれほど不思議でもなくなるはずだ。
つまり、「調査の根拠となるのは往路ではなく復路のICMPパケットだ」ということである。例えば、tracerouteではICMP Time Exceededエラーを返答してくれればよいので、往路のパケットはICMPでもUDPでも関係がなく、IPパケットであればよい。これは、ICMPがIPネットワークにおけるエラーを通知するためのプロトコルであるからだ。「主役は復路のICMPパケットである」というICMPの特性をうまく活用したコマンドである。
なお、調査するホストによっては次のような結果が得られることもある。
: 2 40 ms 40 ms 40 ms tokyo-gate.isp.xx.jp [203.xxx.xxx.xxx] 3 * * * 4 40 ms 40 ms 30 ms xxx.xxx.isp.xx.jp [203.xxx.xxx.xxx] :
これは、このルーターがICMP Time Exceededに対応していないために起こる。
前述のように、tracerouteはICMP Time Exceededエラーの結果を受け取らなければ結果を表示できない。この例では、3番目のルーターからエラーが返らず、tracerouteコマンドがタイムアウトをしてこのような表示になっていると考えられる。
また、単に対応していないというだけでなく、ルーターによってはセキュリティ上の要件からICMPパケットをフィルタしている場合もある。主にISPの管理するルーターではそうしたケースが多いようだ。
【2017/01/10】最新の状況に合わせて内容を精査の上、更新しました
【2001/08/30】初版公開
Copyright © ITmedia, Inc. All Rights Reserved.