2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

pingの正体!

pingには俺自身もかなりお世話になった。多分これからもお世話になるだろう。 お世話になってる割には、pingの仕組みとか中身の事って解ってないのが常である。仕組みなんか知らなくてもいいよ。と言ってしまえばそれまでであるが(笑)。 pingは、エコー要求及びエコー応答で相手との接続性を確認するためのコマンドタイプの モジュールである。pingは、ICMPと言うプロトコルで動いている。 ここでは、pingの中身を探ってみることにする。


1.pingのプロトコルICMPとは?

ICMP(Internet Control Message Protocol)コネクションレスプロトコルであるIPをサポ ートする役割がある。仮に、IPパケットがネットワーク上で失われた場合、ICMPでそのエラ ーレポートを抽出できる。


2.ICMPのパケット構成

ICMPのパケット構成は、以下のようになっている。

図1 ICMPフレーム構成

ICMPは、IPパケットにカプセル化されている。ICMPヘッダ部はICMP可変長メッセージを抜か した8バイト部分である。その8バイトのなかで、4バイトの共通ヘッダと各メッセージ固有の ヘッダ部分に別れている。その後に固有のICMP可変長メッセージが続く。 共通ヘッダ部は、1バイトのタイプ部分、1バイトのコード部分、2バイトのチェックサム部分 で構成されている。メッセージには、エコー要求、エコー応答、到達不能等様々なメッセージ があるが、タイプ部(大分類)とコード部(小分類)でどんなICMPメッセージなのかを判断す ることが出来る。

 

タイプコード機能
0/80エコー応答( 0 )/エコー要求( 8 )
30-12到達不能メッセージ
40送信元抑制メッセージ
50-3リダイレクトメッセージ
110-1時間超過メッセージ
120パラメータ異常
13/140タイムスタンプ要求/応答
17/180サブネットマスク要求/応答

表1 タイプ&コード一覧表

上の表はタイプとコードの一覧である。
2バイトのチェックサムでエラーチェックが出来る。


3.エコー要求&エコー応答(ping)

表1でタイプ0のエコー応答とタイプ8のエコー要求でpingが構成されている。

図2 pingの構造

みなさんご存じのように、pingはネットワークのトラブルを発見するさらには原因を特定するために必須なコマンドである。
pingの仕組みは、簡単でとてもシンプルである。ネットワーク上の192.168.0.1というコンピュータとの通信を確認したい場合は、

DOSのコマンドプロンプトもしくはUnixのコンソールから、

ping オプション 宛先

例: ping 192.168.0.1

オプション意 味
-c 回エコー要求パケットを送信する数を指定する。デフォルトは、無限大。
-d使用されるソケットにSO_DEBUGオプションを設定する
-fFlood ping:
1秒に100回と非常に速くパケットを出力する。 表示されていて、エコー応答がいつまでもエコーバックしている時に、バックスペースキーを押して印字位置を一字分戻る。
「あらゆるECHO_に関して、REQUESTはa期間を送った」、表示される。 これはいくつのパケットが落とされたかに関する素早い表示を提供する。 スーパーユーザだけがこのオプションを使用することができる。
これは、ネットワークで使うには非常に困難である場合があり、慎重に使用されるべきである。
-i 秒各パケットを送る間の、この待時間(秒)だけ待つ。 デフォルトは1秒各パケットの間待つ。 このオプションは-fオプションと併用は出来ない。
-l プリロードプリロードが指定されたら、状態が通常モードになる前に、pingはできるだけ速くできるだけ多くのパケットを送る。
スーパーユーザだけがこのオプションを使用する。
-n数値出力専用。これはホストアドレスについての試みなのにルックアップしても英字名にしない。
-p パターンあなたが送るパケットに書き込むために、最高16「パッド」バイトのデータを指定出来る。これは、ネットワークのデータ依存性の問題を診断するのに有益である。例えば、「-p ff」は、送られたパケットが全て1で満たす。
-q静かなアウトプット。
始動時、終えるという場合にスタートアップ時間と要約ラインを除いて何も表示されない。
-Rルートを記録する。
RECORD_ROUTEオプションをECHO_REQUESTパケットに含めてルートバッファを、戻されたパケットに表示する。9つのそのようなルートのためにIPヘッダーが十分に大きいことにだけ注意すること。多くのホストはこのオプションを無視するか、または破棄する。
-r正常なルーティングテーブルを迂回し、セグメントに接続されているホストに直接送る。もしホストが、直接接続しているネットワークにいないならば、エラーが返される。近傍のホストを確認するのにこのオプションを使用することができる。

と入力して実行する。これを実行すると、ICMPタイプ8のエコー要求が192.168.0.1に対して送信される(図2参照)。
エコー要求とは、”これから送るデータをそのまま返信してくれよ!”と言うことである。
受け取った192.168.0.1のIPアドレスのコンピュータは、通信が可能状態なら返事を変えることが出来る。 返信として、”言われたので、データをそのまま返すよ”みたいに、ICMPタイプ0のエコー応答が送信元に返信される。これで成功すると以下のように画面に表示される。

[root@yh /root]# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 送信元 192.168.0.2 : 56(84) bytes of data.
64 バイト応答 送信元 192.168.0.1: icmp_seq=0 ttl=255 時間=739 マイクロ秒
64 バイト応答 送信元 192.168.0.1: icmp_seq=1 ttl=255 時間=352 マイクロ秒
64 バイト応答 送信元 192.168.0.1: icmp_seq=2 ttl=255 時間=348 マイクロ秒
64 バイト応答 送信元 192.168.0.1: icmp_seq=3 ttl=255 時間=350 マイクロ秒
64 バイト応答 送信元 192.168.0.1: icmp_seq=4 ttl=255 時間=345 マイクロ秒

--- 192.168.0.1 ping 統計 --- 送信パケット数 5, 受信パケット数 5, パケット損失 0%
Round-Trip 最小/平均/最大/mdev = 0.345/0.426/0.739/0.158ミリ秒

これは、VineLinuxのコンソールでpingをぶちかました結果である。送信元のコンピュータでpingが成功して返事を受け取ったことが解る。
つまり、ping成功である。

しかし、次のようなメッセージが出たときは、相手が応答しなかったときである。

Request time out-

WindowsでもUnixでもpingコマンドを入力すると、結果の表示は多少異なるがネットワーク上の特定のコンピュータを通信が出来る状態かどうかを確かめるコマンドであることは同じである。しっかりと押さえて欲しい。


4.ping到達不能メッセージ

ICMPのタイプ3は到達不能メッセージである。これは、何らかの理由で送信先にパケットが遅れない状態になったときに、エラーとして原因を通知する。したがって、これを解析することによりネットワーク障害のある意味で切り分けが出来ることになる。
以下に到達不能メッセージコード表を示す。

 コード 種類 意味
0Network Unreachableネットワークに到達できない
1Host Unreachable特定のホストに到達できない
2Protocol Unreachableプロトコルを見つけられない
3Port Unreachableポートを使うことが出来ない
4Fragmentation Blockedフラグメントを行うことが出来ない
5Source Route Failedソースルート通りにルーティングできない
6Target Network Unknownネットワークが解らない
7Target HostUnknownホストが解らない
8Source Host Isolate送信元がインターネットと通信不能
9Target Network Prohibited送信先のネットワークが拒否
10Target Host Prohibited送信先のホストが拒否
11Network TOS Problem要求したTOS(Type of Service)で中継できない
12Host TOS Problem要求したTOS(Type of Service)で中継できない

以上のように沢山あるが、一応定義はされているが全然使ってない物もある。さらに、ネットワーク機器のメーカによって同じ状況でも違うコードを使ってる場合もあるのでアバウトに考えて方が良いかもしれない。つまり、”宛先に送ることが出来なかったことを知らせるためのコード”程度に覚えておいた方が迷わないですみそうだ!

以上

コメント