ITの教科書検索
入門・発展ページ読了 約12分

ping・tracerouteの使い方と見方

pingの使い方と出力の読み方(time・ttl・packet loss)、tracerouteの仕組みと見方(TTL・* * *の意味)を、Windows/Mac・Linuxの実際の出力つきで解説します。

目次
  1. pingは応答の有無、tracerouteは経路を見る
  2. pingが確かめていること
  3. ping出力の読み方
  4. OS別:pingの使い方と出力
  5. 通らないときの読み方
  6. tracerouteの仕組み
  7. OS別:traceroute / tracertの出力
  8. traceroute出力の読み方
  9. 切り分けの順番
  10. 練習問題

pingは「相手から応答が返るか」、tracerouteは「宛先までどのルータを通るか」を確かめるコマンドです

pingは、相手から応答が返るかどうかと、往復にかかった時間を確かめるコマンドです。tracerouteは、宛先までに経由するルータを1台ずつ調べて、一覧表示するコマンドです。

pingは、ICMPという仕組みで相手に応答を求めます。Windowsでは、tracerouteの代わりに tracert というコマンドを使います。「Webページが開かない」ときに、相手まで届いているのか、途中のどこで止まっているのかを、手元のPCで確かめられます。

pingが確かめていること:ICMP Echo RequestとEcho Reply

pingは、宛先に「聞こえますか」という問い合わせを送ります。この問い合わせをEcho Requestと呼びます。相手が「聞こえます」という返事のEcho Replyを返せば、その相手まで通信できることが分かります。pingは、TCPのようなコネクションの確立やポート番号を使いません。

Echo RequestとEcho Replyは、ICMPというプロトコルのメッセージです。ICMPは、到達確認やエラー通知を運ぶプロトコルです。ICMPはIPパケットの中に入って運ばれますが、層の分類ではTCP・UDPと同じ第4層ではなく、IPと同じ第3層に属します。TCP/IPモデルでは、インターネット層にあたります。ICMPのほかのメッセージと、タイプ・コードの一覧はICMPの記事にまとめています。

基本の使い方は共通です。ターミナルで、次のように入力します。Windowsでは、コマンドプロンプトを使います。

ping基本の書式
$ ping [オプション] 宛先(IPアドレスまたはホスト名)

# 例:
$ ping 8.8.8.8
$ ping example.com

宛先には、IPアドレスだけでなくexample.comのようなドメイン名も指定できます。ドメイン名を指定した場合は、まず内部で名前解決(DNS)を行い、得られたIPアドレスにICMPを送ります。

ping出力の読み方:time・ttl・packet loss

次の例は、Mac・Linuxで8.8.8.8にpingを実行した結果です。8.8.8.8は、Googleが公開しているDNSサーバのIPアドレスです。IPアドレスから名前を調べる逆引きをすると、dns.googleという名前が表示されることもあります。行をクリックすると、その行の意味が開きます。

$ ping -c 4 8.8.8.8

行をクリックすると、その行の意味が開きます。

読むときに見る数字は、次の3つです。

  • time:往復時間です。短いほど速いことを示します。
  • ttl:応答パケットが経由したルータの数の目安です。詳しい読み方は次の節で説明します。
  • packet loss:何%の応答が返らなかったかを示します。0%なら、全部返ってきています。

time(往復時間)をRTT、packet lossをパケットロスと呼びます。これらの指標の意味と、帯域幅・スループットとの違いは性能指標の記事で説明しています。

OS別:pingの使い方と出力

WindowsとMac・Linuxでは、オプションの指定方法と出力の書式が違います。ICMPを送って応答を見る仕組みは同じです。

目的WindowsMac・Linux
送信回数を指定する-n 回数-c 回数
既定の回数(オプション省略時)4回で自動終了無限(Ctrl+Cで停止)
止まるまで送り続ける-t(Ctrl+Cで停止)既定の動作(回数省略時)
パケットサイズを指定する-l サイズ(バイト。既定32)-s サイズ(バイト。既定56)
応答を待つ時間を指定する-w ミリ秒-W ミリ秒(Mac・BSD系)/秒(Linuxのiputils)。同じ-Wでも単位がOSで違う
ping(Windows)コマンドプロンプトで実行
C:\>ping 8.8.8.8

8.8.8.8 に ping を送信しています 32 バイトのデータ:
8.8.8.8 からの応答: バイト数 =32 時間 =10ms TTL=124
8.8.8.8 からの応答: バイト数 =32 時間 =11ms TTL=124
8.8.8.8 からの応答: バイト数 =32 時間 =13ms TTL=124
8.8.8.8 からの応答: バイト数 =32 時間 =14ms TTL=124

8.8.8.8 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 10ms、最大 = 14ms、平均 = 12ms

# 既定は4回で自動的に止まります(-t を付けると止まるまで送り続けます)。
# 平均は4回の時間の単純平均です(10+11+13+14=48、48÷4=12ms)。
ping(Mac・Linux)ターミナルで実行
$ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=124 time=11.012 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=124 time=10.958 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=124 time=11.031 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=124 time=12.999 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 10.958/11.500/12.999/0.866 ms

# -c を付けないと、Ctrl+Cで止めるまで送り続けます。
# これはmacOSのping(icmp_seqが0から始まり、集計行がround-trip min/avg/max/stddev)の形式です。
# Linux(iputils)はicmp_seqが1から始まり、集計行もrtt min/avg/max/mdevとラベルが違うなど細部が異なります。
ttlの値について

ttlは、相手が送り出した時点のTTLの初期値から、経由したルータの数だけ減った値です。初期値はOSやルータの実装によって決まり、64や128が多く使われています。

ttl=124で初期値が128なら、4台のルータを経由したと推測できます。TTLがルータを通過するたびに1ずつ減る仕組みは、ルーティングの記事で説明しています。ただし、行きと帰りで経路が違うこともあるので、この値が後で説明するtracerouteのホップ数と一致するとは限りません。

pingが通らないときの読み方

pingが通らないとき、推測できる原因は表示されるメッセージによって変わります。次の3つを区別してください。

状況Windowsでの表示Mac・Linuxでの表示意味
応答が返らない要求がタイムアウトしました。Mac:応答が来なかった回ごとにRequest timeout for icmp_seq 1
Linux:何も表示されず、最後に100% packet loss(Macの100.0%と違い小数点以下なし)
既定の時間内にEcho Replyが届かなかったことだけを示します。相手が止まっている場合も、経路上で止まっている場合も、相手がICMPに応答しない設定の場合もあり、この結果だけでは区別できません。
明示的に到達不能と返ってくる192.168.10.25 からの応答: 宛先ホストに到達できません。Destination Host Unreachable宛先の手前の機器が「届けられない」と知らせてきたことを示します。宛先の手前とは、同じLAN内なら自分のPC自身、別のネットワーク宛なら経路上の最後のルータです。同じLAN内でよく出るのは、宛先のMACアドレスをARPで問い合わせても応答がないときです。経路そのものがない場合は、本来はNet Unreachable(RFC 792 の Type 3 Code 0)です。経路はあるが宛先の機器まで届けられない場合は、Host Unreachable(Code 1)です。無応答のタイムアウトと違い、到達不能の知らせそのものは届いています。
名前解決できないPing要求ではホスト ◯◯ が見つかりませんでした。ping: cannot resolve ◯◯: Unknown hostICMPを送る前の段階、つまりDNSによる名前解決で止まっています。IPアドレスを直接指定したpingが通るなら、原因はDNS側に絞り込めます。
応答が返らなくても、相手が止まっているとは限りません。

セキュリティ上の理由から、サーバや機器がEcho Requestに応答しない設定になっていることは珍しくありません。その場合、pingは通らなくても、HTTPなど他の通信は問題なく届きます。応答がないことが示すのは、その相手をICMPで確認できなかったという事実だけです。

tracerouteの仕組み:TTLを1ずつ増やして経路を突き止める

tracerouteは、宛先に向けて、TTLを1、2、3…と1ずつ増やしたパケットを順に送ります。TTLは、IPパケットが経由できるホップ数の上限です。DNSレコードのキャッシュの有効期間を指すTTLとは別のものです。

  1. 1

    TTL=1で送る

    最初のルータでTTLが0になります。最初のルータは、多くの場合、自宅のデフォルトゲートウェイです。パケットを破棄したルータは、送信元へICMP Time Exceededを返します。

  2. 2

    TTL=2で送る

    1台目のルータは通過できますが、2台目のルータでTTLが0になります。今度も、ICMP Time Exceededが返ります。

  3. 3

    TTLを1ずつ増やして繰り返す

    宛先に届くまで、TTLを1ずつ増やして送り続けます。返ってきたICMP Time Exceededには、送り主のIPアドレスが入っています。これを記録すれば、1ホップ目から順にルータが分かります。

  4. 4

    宛先まで届いたら終了

    パケットが宛先まで届くと、Time Exceededではなく別の応答が返り、経路の特定が完了します。tracerouteの動きはルーティングの記事でも説明しています。

    Mac・Linuxのtracerouteは、宛先の使われていないポート宛にUDPで送るので、ICMPポート到達不能が返ります。Windowsのtracertは、ICMPで送るので、ICMP Echo Replyが返ります。

自分のPC192.168.10.25ホップ1192.168.10.1ホップ2198.51.100.1宛先8.8.8.8TTL=1ICMP Time ExceededTTL=2ICMP Time ExceededTTL=3Port Unreachable / Echo Reply
TTLを1ずつ増やして送ると、TTLが0になったホップがパケットを捨てます。そのホップは、ICMP Time Exceededを返します。TTL=3で宛先まで届くと、tracerouteにはICMPポート到達不能が、tracertにはICMP Echo Replyが返ります。そこで、宛先までの経路が確定します。実際は、もっと多くのホップを経由することもあります。

「ポート到達不能」のポートは、HTTPSの443番と同じ、TCP・UDPのポート番号です。Mac・Linuxのtracerouteは、宛先のどのアプリも使っていない高い番号のポートを意図的に指定して送ります。

すると宛先は、「このポートは使われていません」という意味のICMPポート到達不能を返します。tracerouteは、この応答を「宛先まで届いた」合図として使っています。

OS別:traceroute / tracertの出力

目的WindowsMac・Linux
名前解決をしない(IPアドレスだけ表示)tracert -dtraceroute -n
ICMPで送る既定でICMPを使う(オプション不要)traceroute -I(既定はUDP。Linuxはsudoが必要)
traceroute(Mac・Linux)ターミナルで実行
$ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 64 hops max, 52 byte packets
 1  192.168.10.1 (192.168.10.1)  0.412 ms  0.398 ms  0.376 ms
 2  198.51.100.1 (198.51.100.1)  1.203 ms  1.156 ms  1.098 ms
 3  192.0.2.9 (192.0.2.9)  5.446 ms  5.201 ms  5.890 ms
 4  * * *
 5  8.8.8.8 (8.8.8.8)  14.001 ms  13.774 ms  14.220 ms

# 1ホップにつき3回ずつ送り、応答時間が3つ並びます。ここでは3回分の時間をすべてそのまま載せています。
# 4行目は3回とも応答が返らなかった状態です(後述)。
tracert(Windows)コマンドプロンプトで実行
C:\>tracert 8.8.8.8

8.8.8.8 へのルートをトレースしています
経由するホップ数は最大 30 です:

  1    <1 ms    <1 ms    <1 ms  192.168.10.1
  2     1 ms     1 ms     1 ms  198.51.100.1
  3     5 ms     5 ms     6 ms  192.0.2.9
  4     *        *        *     要求がタイムアウトしました。
  5    14 ms    14 ms    14 ms  8.8.8.8

トレースを完了しました。

# Windowsも1ホップにつき3回ずつ送ります。既定でICMPを使うため、tracerouteとは中身が違いますが、
# 見え方(1行=1ホップ)は同じです。

traceroute出力の読み方:「* * *」・途中の遅延・途中で止まる

  1. 1

    「* * *」が1行だけ挟まる

    上の例の4行目のように、1ホップだけ応答が返らないことがあります。よくある原因は、そのルータが自分宛のICMP応答を後回しにする設定になっていることです。次のホップ以降で応答が再開していれば、そこから先は正常に届いています。「* * *」の1行だけで、通信が切れていると断定することはできません。

  2. 2

    途中から急に応答時間が伸びる

    それまで数msだったのに、あるホップから急に時間が伸びることがあります。そのホップと1つ手前の間の区間が混雑しているか、海底ケーブルを通る国際回線のような長距離の回線に入ったことを示します。

    後ろのホップも同じように遅いままなら、混雑や長距離回線を疑ってください。1ホップだけ遅く、次のホップで時間が戻ることもあります。その場合は、そのルータが自分宛のICMPへの応答を後回しにしているだけで、通信そのものに問題はありません。

  3. 3

    あるホップから先、すべて「* * *」のまま終わる

    最後まで応答が戻らず、宛先に届かないまま終わることもあります。その場合は、そのホップより先で経路が切れているか、ファイアウォールで止められている可能性があります。1行だけ挟まる「* * *」とは分けて考えてください。

つながらないときの切り分けの順番:自分 → ゲートウェイ → 外 → 名前

「インターネットにつながらない」というトラブルは、手前から順にpingで確かめていくと原因を早く絞り込めます。この順番は、層の考え方で説明した「下の層から1つずつ疑う」やり方と同じです。

  1. 1

    ケーブル・Wi-Fiのランプを確認する

    LANケーブルが抜けていないか、Wi-Fiのアイコンに×が付いていないかを見ます。これは一番下の物理層の確認です。ここがつながっていなければ、この先は確認しても意味がありません。

  2. 2

    自分のIPアドレスを確認する

    IPアドレスが振られているかを見ます。Windowsではipconfigを、Mac・Linuxではifconfigやip addrを使います。169.254.で始まっていれば、DHCPに失敗しています。

  3. 3

    デフォルトゲートウェイにpingを打つ

    家庭用ルータの内側のアドレスに届くかを確認します。ここでの例では、192.168.10.1がこのアドレスです。ここで通らなければ、家庭内LANの配線やWi-Fi接続を疑います。

  4. 4

    外部のIPアドレスにpingを打つ

    8.8.8.8のような外部のIPアドレスに届くかを確認します。ゲートウェイまでは届くのにここで止まっていれば、回線やプロバイダの問題です。

  5. 5

    ドメイン名にpingを打つ・nslookupを試す

    8.8.8.8には届くのに、example.comでは「名前が見つからない」と表示される場合があります。そのときは、DNSによる名前解決だけが機能していません。tracerouteで途中のどのホップまで届いているかを見れば、外部までの経路のどこで止まっているかも絞り込めます。

この切り分けの流れは、ネットワークの全体像を一気に読むの、確認コマンドと切り分けの節にフローチャートでまとめています。ping・traceroute以外のコマンドを症状ごとに選ぶ早見表は、netstat・ss・digの記事にあります。

ここまでは、pingを手作業で実行する方法でした。多数の機器を継続的に監視したい場合は、別の仕組みを使います。機器の側から異常を知らせたり、定期的に自動で確認したりする仕組みで、SNMPの記事で説明しています。

原因が絞れないときは、Wiresharkでパケットを1つずつ見る方法があります。

練習問題(全5問)

Q1pingが疎通確認に使っているプロトコルはどれ?
Q2ping を5回送ったところ、パケットロス率が40%と表示された。応答が返ってきたのは何回?
Q3tracerouteの仕組みとして正しいものは?
Q4traceroute の出力で、あるホップの行が「* * *」だった。このことから確実に言えるのはどれ?
Q5「Request timed out.」(応答なし)と「Destination host unreachable.」(宛先到達不能)の違いとして正しいものは?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

おすすめの本 PR

この記事の内容を扱っている本です。

目的別の本の選び方を見る

ネットワークの記事を探す