2011年(5)
分类: LINUX
2011-09-12 14:34:04
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/8 0エコー応答( 0 )/エコー要求( 8 ) 3 0-12到達不能メッセージ 4 0送信元抑制メッセージ 5 0-3リダイレクトメッセージ 11 0-1時間超過メッセージ 12 0パラメータ異常 13/14 0タイムスタンプ要求/応答 17/18 0サブネットマスク要求/応答
表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オプションを設定する |
-f |
Flood ping: |
-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)で中継できない
以上のように沢山あるが、一応定義はされているが全然使ってない物もある。さらに、ネットワーク機器のメーカによって同じ状況でも違うコードを使ってる場合もあるのでアバウトに考えて方が良いかもしれない。つまり、”宛先に送ることが出来なかったことを知らせるためのコード”程度に覚えておいた方が迷わないですみそうだ!