pingコマンドに-rオプションをつけると、途中で経過するルータの情報を記録して表示できる。その効果はtracertと似ているが、仕組みは異なる。ただし最大で9つまでしか記録できないし、ルータやファイアウォールの設定によっては途中でパケットが拒否されることもある。
対象OS:Windows 2000 / Windows XP / Windows Vista / Windows 7 / Windows Server 2003 / Windows Server 2008 / Windows Server 2008 R2
TIPS「pingのタイムスタンプ・オプションで進行状況を確認する」では、pingコマンドにタイム・スタンプを記録するオプション「-s」を付けて実行する例を紹介した。タイム・スタンプ・オプションを付けると、パケットがルータを通過するたびにその時点での時刻情報が記録され、パケットの送受信にどの程度の時間がかかっているかなどを確認できる。
だが-sオプションで記録できるタイム・スタンプ情報は最大で4つまでという制限があった。タイム・スタンプ情報はIPヘッダ中に記録されるが、(IPv4の場合は)IPヘッダの最大長が60bytesに制限されているため、4つまでしか保存できないからだ。
これと似たオプションとして、pingコマンドには「-r」というオプションもある。これもやはり途中で経過したルータ情報を記録するオプションであるが、IPアドレス情報しか保存しないため、最大で9つまで記録できる。この機能を利用すれば、通過しているルータの情報を簡単に調べることができ、例えばルーティング・テーブルの設定が間違っていないかどうかなどを確認できる。本TIPSではこの機能について解説する。
pingコマンドの使い方は次の通りである。
※以下はWindows XPのpingコマンドの例。Vista/Windows Server 2008以降のpingではメッセージが日本語化されている。
C:\>ping
Usage: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
[-r count] [-s count] [[-j host-list] | [-k host-list]]
[-w timeout] target_name
Options:
-t Ping the specified host until stopped.
To see statistics and continue - type Control-Break;
To stop - type Control-C.
-a Resolve addresses to hostnames.
-n count Number of echo requests to send.
-l size Send buffer size.
-f Set Don't Fragment flag in packet.
-i TTL Time To Live.
-v TOS Type Of Service.
-r count Record route for count hops. ……ルーティング情報の記録オプション
-s count Timestamp for count hops.
-j host-list Loose source route along host-list.
-k host-list Strict source route along host-list.
-w timeout Timeout in milliseconds to wait for each reply.
パケットが通過したルータの情報を記録/表示させるには、「-r <1〜9の数字>」オプションを指定する。最大で9つまでルート情報が記録され、それが表示される。それ以上のルータを通過しても、それは記録されない。ルートの最初の9つの情報だけが記録される。
なお、-sオプションと併用する場合は、-rオプションの上限が制限される(どちらのオプションも同じIPヘッダ領域を使うため)。具体的には-sオプションで1、2、3、4を指定すると、-rの上限はぞれそれ6、4、2、0(-rは指定できないということ)となる。
先のTIPSでも述べているが、ルータや相手先ノードの設定やファイアウォールの状態などによっては、この情報を残さない場合もあるし、そのようなオプション付きのパケットはすべて無視してしまうこともある。そのため、必ずしもルート情報が得られるとは限らない。
またtracertやpathpingなどとは手法が異なるので(tracertなどでは、パケットのTTL値を変化させてどこまで到達できるかを調べている。TIPS「tracertでネットワークの経路を調査する」参照)、得られる結果が一致しないこともある。
以上のコマンドを同じ相手に対して何度か実行すると、表示されるたびに結果(ルート)の一部の情報が変化していることがある。負荷に応じてパケットのルーティングを分散させているような機構が途中に存在する場合、このような結果になることがある。インターネットのルーティングではよく見られるが、これによって、ダイナミックなルーティング機能が働いていることが確認できる。
場合によってはイントラネットでもこのような現象が観測されることがある。
C:\>ping -n 3 -r 8 10.30.2.12 ……3回実行してみる
Pinging 10.30.2.12 with 32 bytes of data:
Reply from 10.30.2.12: bytes=32 time=18ms TTL=127
Route: 192.168.1.56 -> ……1回目には存在するルート((1))
10.30.2.1 ->
10.30.2.12 ->
192.168.1.3
Reply from 10.30.2.12: bytes=32 time=25ms TTL=127
Route: 10.30.2.1 -> ……2回目は192.168.1.56がない
10.30.2.12 ->
192.168.1.3
Reply from 10.30.2.12: bytes=32 time=24ms TTL=127
Route: 10.30.2.1 -> ……3回目にも192.168.1.56がない
10.30.2.12 ->
192.168.1.3
Ping statistics for 10.30.2.12:
Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 18ms, Maximum = 25ms, Average = 22ms
C:\>
この結果を見ると、1回目の応答には「192.168.1.56」というルートを通過したという情報が表示されているが(リスト中の(1))、2回目と3回目には存在せず、いきなり「10.30.2.1 -> 10.30.2.12」というルート情報が返されている。なぜだろうか?
結論を言うと、1回目のルートはこのPCのデフォルト・ルートである「192.168.1.56」というルータへパケットが送信されたが、その後ルータから「ICMP Direct」メッセージが返され、ルート情報が更新されたためである(動的ルート情報が追加された。route printコマンドで確認可能。TIPS「ICMPリダイレクト使用時のファイアウォール設定に注意」も参照)。2回目以降は新しいルート情報を経由しているので、直接10.30.2.1というルータへパケットが送られたのである。
tracertでは何度もパケットを送信するので、このような結果を直接観測することは難しい。だが、pingの-rオプションを使えばこのように、パケットのルーティングの状態などを別の視点から観察できる。状況に応じて使い分けるとよいだろう(もっとも、このような状況はネットワーク・モニタを使えば簡単に確認できるが)。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.