意外と深いpingコマンドの結果
情シスならいろんな場面でお世話になるWindowsのpingコマンドですが、なんとなく”通信先のIPアドレスが起動しているかどうかチェックしている”ぐらいの感覚の方も多いんじゃないでしょうか?
そこで今回は意外と深いpingコマンドの結果について解説してみます。
そもそもpingコマンドとは
すこしそれっぽい表現をするなら、”ICMPエコー要求を指定したIPアドレス宛に送信して、その結果を表示するコマンド”になります。
ICMPとは、OSI参照でいうところのIPレベルの通信に関するプロトコルの一種です。
そしてICMPエコーとは、そのプロトコルの中のコマンドの一種みたいなもので、送信先IPアドレスに対して”このコマンドが届いたら応答してね”と呼びかけるようなイメージです。
”その結果”には多くの種類がありますが、情シスの運用としては下記の3つによく遭遇します。
- 送信先から応答があったパターン
- 送信先以外から応答があったパターン
- タイムアウトしたパターン
今回はこの3点について、その結果がどういう状況を示しているのかを考えてみましょう。
送信先から応答があったパターン
つまりこういうパターンです。
この結果は、”192.168.50.151というIPアドレス宛に送信したICMPエコー要求に対して、192.168.50.151のホスト自身が応答してくれた”というものになります。
いわゆる送受信に成功しているパターンで、IPレベルでの疎通がとれていることになります。
大抵はこのあとにリモートアクセスがつながるか、とかWEBブラウザでログイン画面が出てくるか、とかアプリ層への確認作業に移行していきます。
このパターンは特に難しいこともなく、感覚的にも理解しやすいパターンだと思います。
送信先以外から応答があったパターン
いわゆるこんなパターンです。
このパターンが発生すると、”応答がない”とか”通信できない”という表現をよく聞きますが、応答自体はあります。
これは”送信先(192.168.50.152)とは違うホスト(192.168.50.151)が『宛先に到達できませんでした』と応答した”というのが正しい表現になります。
文章では分かりづらいので、こういう時はネットワークを思い浮かべてみます。
簡単にするために、192.168.50.0/24のネットワークには192.168.50.151と.1の2つのホストしかいないとします。
このとき、.152という存在しないホストのIPアドレス宛にICMPエコー要求を送信しようとすると、まず最初に”.152はいますかー?”という信号をネットワーク内に送信します。
それっぽく表現すると、”ARPというプロトコルで、192.168.50.152というIPアドレスに対応するMACアドレスが存在すれば、そのMACアドレスを教えてくれ”という感じです。
しかし、.152というIPアドレスを持つホスト(=対応するMACアドレス)はいませんので、送信元のPC(.151)は.152のMACアドレスが得られません。
その結果、.151が代わりに”.152というホストには到達できませんでした”と報告してきたのが先ほどのコマンドプロンプトの状態です。
つまり、”想定していた宛先には到達できなかったことを、違うホストが応答した”ということになります。
ここまでではそんなに正確に表現することの必要性が見えてこないかもしれませんが、次のタイムアウトしたパターンを考える上では重要になってきます。
タイムアウトしたパターン
いわゆるこんなパターンです。
これこそは正しい意味での”ICMPエコー要求に対してどこからも応答が無かった”パターンです。
このパターンを深堀するにあたって、さらに2つのパターンに分けて考える必要があります。
- IPアドレスに対応するMACアドレスは見つかったけれど、ICMPエコー要求への応答が無い
- ICMPエコー要求自体が何らかの理由で通信経路のどこかで破棄された
それぞれどういうことか考えてみましょう。
IPアドレスに対応するMACアドレスは見つかったけれど、ICMPエコー要求への応答が無い
まず大前提として、”ICMPエコー要求”と、その前段階の”○○さんいますかー?”という処理は別物と考えてください。
”○○さんいますかー?”という処理の応答があった と ICMPエコー要求の応答があった は別物です。
さて、先ほどの例で.152というIPアドレスを持つホストがあったとします。
そのため、今回は”○○さんいますかー?”という問い合わせに対して.152は自分自身のMACアドレスを応答します。
ここでICMPエコー要求の前段階である”○○さんいますかー?”の処理に成功したので、続いてICMPエコー要求を送信します。
ところが、このICMPエコー要求には応答しないパターンがあります。そんな天邪鬼な・・・と思うかもしれませんが、実際にもよくあります。
この場合、どれだけ待ってもICMPエコー要求に対して応答してくれないので、その結果としてタイムアウト(応答待ちの時間切れ)となります。
じゃあこんなことがどんなときに起きるのかというと、よくあるのがホストにインストールしているパーソナルファイアウォール(Windows Defenderとか)の動作です。
ファイアウォールで受信したICMP要求を破棄するようなルールが設定されていると、上記のような無視現象が起きます。
つまり、pingコマンドの結果としてタイムアウトしたからといって、送信先IPアドレスを誰も使っていないとは限らないので注意してください。
(pingコマンドがタイムアウトしたから相手のIPアドレスは空いていると思ってIPアドレス設定したら重複した、というミスが起きることがあります)
ICMPエコー要求自体が何らかの理由で通信経路のどこかで破棄された
原理的には上記の無視パターンと同じなのですが、ICMPエコー要求が通信経路のどこかで破棄される場合もあります。
要求が破棄されると、その要求はどこにも届かず誰も応答しないため、同じくタイムアウトとして画面上には表示されます。
余談ですが、破棄のされ方によっては”破棄したよー”と下記のように応答してくれることもあります。
まとめ
- pingコマンドはICMPエコー要求を指定した宛先IPアドレスに送信するコマンドです
- ”宛先ホストに到達できません”は正確には”応答なし”ではない
- タイムアウトしたからといってIPアドレスを使っていないとは限らない