PING(8)

名称
ping - ICMP ECHO_REQUEST パケットをネットワーク上のホストへ送る

書式
ping [-QRadfnqrv] [-c count] [-i wait] [-l preload] [-p pattern] [-s packetsize] [ host | [-L] [-I interface] [-T ttl] mcast-group]

解説
ping は、 ICMP の ECHO_REQUEST データグラムを用いて、指定したホストやゲートウェイ からの ICMP ECHO_RESPONSE を引き出します。 ECHO_REQUEST データグラム ( (“ping”) ) には IP および ICMP ヘッダ、 “struct timeval” 、パケットの残りを埋める適当な数の “pad” バイトが順にあります。 オプションは以下の通りです:

-a  聴覚モード。パケットを受け取った時に、出力にベル (ASCII 0x07) 文字を 含みます。このオプションは、別形式のオプションがある場合は無視されます。

-c count
    ECHO_RESPONSE パケットを count 回送出 (そして受信) してから終了します。 本オプションが指定されない場合、 ping は割り込まれるまで動作を継続します。

-d  使用する socket に SO_DEBUG オプションを設定します。

-f  ECHO_REQUEST ping を垂れ流します。 パケットが返って来るとすぐ、もしくは 100 分の 1 秒に 1 回のいずれか多い回数だけ パケットを出力します。 ECHO_REQUEST パケットを送るたびに “”. が表示され、 ECHO_REPLY パケットを受信するたびにバックスペースが表示されます。 root のみこのオプションを指定できます。 これによりどれだけのパケットが欠落したのかをすばやく表示することができます。 スーパユーザのみ使用可能です このオプションはネットワークに非常に負荷をかけるので、注意して使用する 必要があります。

-i wait
    wait で指定した秒数だけパケットの送出間隔を空けます。 デフォルトでは送出間隔は 1 秒です。 より小さい値を指定できますが、1 より小さい値を指定できるのは root だけです。 このオプションは -f オプションとは同時に指定できません。

-I interface
    与えられたインタフェースアドレスに対して、マルチキャストパケットを 送ります。このフラグは、 ping の宛先アドレスがマルチキャストアドレスの 場合だけに適用できます。

-l preload
    指定した preload 値だけ ECHO_REQUEST パケットを出来るだけ速く送信し、通常の動作に戻ります。 スーパユーザのみがこのオプションを使用できます。

-L  マルチキャストパケットのループバックを抑制します。 このフラグは、宛先アドレスがマルチキャストアドレスの場合だけ 適用できます。

-n  数値のみ出力します。ホストアドレスに対する名前を調べるようなことは しません。

-p pattern
    送出するパケットを埋める “pad” バイトを指定します。 “pad” バイトは 16 バイトを上限とします。 これはネットワーク上でデータ依存の問題を診断するときに有効です。たとえば “-p ff” は全て 1 の送出パケットを生成します。

-Q  いくらか静かな出力にします。 自己が行なった問い合わせに対しての応答に含まれる ICMP エラーメッセージは表示されません。 もともとは、 -v オプションがそのようなエラーを表示するために必要でしたが、 -v オプションは全ての ICMP エラーメッセージを表示します。忙しい機械上では、 この出力は更に負荷になるでしょう。 -Q オプションを指定しないと、 ping は、 自己の ECHO_REQUEST メッセージに起因する ICMP エラーメッセージを表示します。

-q  出力を抑制します。開始時と終了時の要約行しか表示しません。

-R  指定ホストまでの到達経路を記録します。 ECHO_REQUEST パケット中に RECORD_ROUTE オプションをつけ、返送パケット上の経路バッファを表示します。IP ヘッダには 経路を 9 個収める大きさしかないことに注意してください; 特定の宛先に対してパケットを経路づけるには、通常 traceroute(8) コマンドを使う方が良いでしょう。 不正に偽ったパケットによるなどして しかるべき経路数よりも大くの経路が帰って来た場合、 ping は経路リストを表示し、正しい位置にまで縮めます。 多くのホストは RECORD_ROUTE オプションを無視するか捨てます。

-r  通常のルーティングテーブルを無視し、 直接接続されているネットワーク上のホストに対して送信します。 指定接続されたネットワーク上にホストが存在しない場合には、エラーが返されます。 このオプションは経路情報を持たないインタフェースを経由してローカル ホストに ping をかけるのに用いられます ( たとえばインタフェースが routed(8) によってドロップされた後) 。

-s packetsize
    送出するデータのバイト数を指定します。 デフォルトでは 56 バイトです。 これは ICMP ヘッダデータの 8 バイトと合せて 64 ICMP バイトになります。 root のみこのオプションを指定できます。

-T ttl
    マルチキャストパケットの IP 寿命時間 (Time To Live) を設定します。 このオプションは、宛先アドレスがマルチキャストアドレスの場合だけ 適用できます。

-v  冗長出力を有効にします。 ECHO_RESPONSE 以外の受信 ICMP パケットも表示されます。

問題の切り分けのために ping を用いるにはローカルインタフェースが up かつ running であることを 確認するため、まずローカルホスト上で実行します。 その後により遠くのホストやゲートウェイに “ping” します。 経路周回時間 (round trip time) と消失パケットの統計が計算されます。 重複したパケットが受信された場合、そのパケットは消失パケットの計算には 含まれませんが、経路周回時間の統計の計算には 使われます。 指定されたパケットの数が送信され (受信され) たとき、もしくはプログラムが SIGINT で終了した場合、簡単な要約が表示されます。 要約は、送出したパケット数、受信したパケット数、そして 経路周回時間の最小/最大/平均/分散です。

このプログラムは主にネットワークのテスト、計測、管理に用いられことを 想定しています。 ping はそれ自体ネットワークに負荷をかけるので、トラブルのないときや自動スクリ プトで用いることは勧められません。

ICMP パケットの詳細
オプションなしの IP ヘッダは 20 バイトです。 ICMP ECHO_REQUEST パケットはさらなる 8 バイトの ICMP ヘッダとそれに続く任意の大きさのデータからなっています。 この大きさは packetsize によって指定されます (デフォルトでは 56 バイトです) 。 このように受信した IP パケット内の ICMP ECHO_REPLY データ量は常に指定されたデータ (ICMP ヘッダ) の大きさよりも 8 バイト大きくなります。

データ領域が少なくとも 8 バイトあるとき、 ping は最初の 8 バイトを経路周回時間の計算に用いるタイムスタンプを書くために 用います。指定された pad の大きさが 8 バイトより小さい場合経路周回時間は 得られません。

重複パケットと障害パケット
ping は重複パケットと障害パケットを報告します。重複パケットは ユニキャストアドレスに対しては起こるはずのないものですが、 リンク層での不適切な再送信によって引き起こされるようです。 重複は様々な状況で起こる可能性があります。低いレベルの重複の存在は 必ずしも警告にならないかもしれませんが、よい兆候ではありません。 ブロードキャストもしくは マルチキャストアドレスに ping する時には、重複が起こることが期待されます。 実際に重複するのではなく、 異ったホストから同じ要求に対して応答が行われからです。

障害を受けたパケットは明らかに重大な警告です。多くの場合、 ping パケットの経路のどこか(ネットワーク内かホスト内)のハードウェアの故障が 考えられます。

異なったデータパターンの試行
(インター)ネットワーク層はデータ部分に含まれるデータによってパケットの扱い を変えません。不幸にもデータ依存性の問題がネットワークに侵入し長い間検知さ れないままとなる可能性が知られています。多くの場合、問題を引き起こす特殊 なパターンはたとえば全部 1 や全部 0 のようなもの、あるいは右端以外が 0 であるような十分な “遷移” を持たないものです。コマンドラインで(たとえば) 全部 0 のデータパターンを指定するだけでは不十分かもしれません。なぜな ら問題のパターンはデータリンク層にあり、コマンドラインで指定したものと コントローラが送信するものとの間の関係は複雑だからです。

このことはデータ依存性が問題となるとき、それを見付けるために多くのテストをし なければならないということを意味します。運がよければ、あるネットワーク を通して送れない、あるいは同じような長さのファイルよりもずっと長時間かか るファイルを見付けることができるかもしれません。この場合、そのファイル を調べ繰り返し現われるパターンを ping の -p オプションを使ってテストできます。

TTL の詳細
IP パケットの TTL 値はパケットが捨てられずに通過できる IP ルータの最大数を表わ します。今のところインターネット上の各ルータは TTL フィールドをちょうど 1 だけ減らすと期待できます。

TCP/IP の仕様では TCP パケットの TTL フィールドを 60 にすべきだとなっていますが、多くのシステムは もっと小さい値を用いています ( 4.3BSD では 30、 4.2BSD では 15 を用いています) 。

このフィールドに許される最大値は 255 です。 そして多くの UNIX システムでは ICMP ECHO_REQUEST パケットの TTL フィールドを 255 にしています。これが (ping) は出来るのに telnet(1) や ftp(1) で入れないホストが発生する理由です。

通常 ping は受け取ったパケットの ttl 値を出力します。リモートシステム が ping パケットを受け取るとき、その応答における TTL フィールドに関し以下の 3 つのうちの 1 つを行なうことができます。

•   変更しない;これは 4.3BSD tahoe リリース前の BSD システムが行なっていたことです。 この場合、受け取ったパケット中の TTL 値は 255 から周回経路におけるルータの数を引いた数です。

•   255 にセットする; これは現在の BSD システムが行なっている ことです。この場合、受け取ったパケット中の TTL 値は 255 から、リモートシステム から ping している ホスト まで の経路におけるルータの数を引いた数となります。

•   ある他の値にセットする。マシンによっては 30 あるいは 60 のような TCP パケットで用いるのと同じ値を ICMP パケットに使います。また全く異なる値を用いるマシンもあるかもしれません。

戻り値
ping コマンドは、指定した host から少なくとも 1 回の応答を受信した場合、終了値 0 を返します; 送出は成功したものの応答を受信できない場合は 2 を返します; エラーが発生した場合は、他の値 (<sysexits.h>) が返されます。

関連項目
netstat(1), ifconfig(8), routed(8), traceroute(8)

歴史
ping コマンドは 4.3BSD から登場しました。

作者
オリジナルの ping コマンドは、 Mike Muuss が US Army Ballistics Research Laboratory にて記述しました。

バグ
多くのホストやゲートウェイは、 RECORD_ROUTE オプションを無視します。

最大IPヘッダ長は、 RECORD_ROUTE オプションを付加するには小さ過ぎます。しかしながら、これについては出来 ることは多くありません。

ping を垂れ流しにするのは、一般に勧められません。特に ブロードキャストアドレスに対して ping の垂れ流しを行なうのは、 きちんと条件を整えた場合においてのみにとどめるべきです。