PING(8)

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

書式
[-dfnoqrvDPQRL] [-c count] [-g gateway] [-i interval] [-I ifaddr] [-l preload] [-p pattern] [-s packetsize] [-t tos] [-T ttl] [-w maxwait] host

解説
ping は、 ICMP プロトコルの ECHO_REQUEST データグラムを用いて、指定したホストやゲートウェイからの ICMP ECHO_RESPONSE を引き出します。 ECHO_REQUEST データグラム (``ping'') は、1 つの IP および ICMP ヘッダを持ち、その後に 1 つの “struct timeval” と、パケットの残りの部分を埋める ``pad'' を 任意のバイト数だけ持っています。オプションは以下のものがあります:

-c count
    ECHO_RESPONSE パケットを count で指定した回数だけ送り出した後 (かつ、受信するまで指定したディレイだけ 待った後) で停止します。

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

-D  IP ヘッダ内の Don't Fragment ビットを設定します。これは、そのパスの MTU を限定するのに利用できます。

-f  垂れ流し ping です。出力パケットは、 パケットが帰ってきてすぐか、1 秒間に 100 回のいずれか多い方の回数だけ 出力されます。 ECHO_REQUEST パケットを送るたびに ``.'' キャラクタが表示され、いっぽう、 ECHO_REPLY パケットを受信するたびにバックスペースが出力されます。 これによりどれだけのパケットが欠落したのかが素早く表示されます。 このオプションを使うことができるのはスーパユーザだけです。 これを使用するとネットワークに大きな負荷がかかるので、注意して 使う必要があります。

-g gateway
    Loose Source Routing を用いて、 gateway を通して ECHO_REQUEST パケットを送ります。

-i interval
    interval で指定した秒数だけ パケットの送出間隔 が空けられます。デフォルトでは各パケット間で 1 秒だけ待つことになっていますが、 -f オプション指定時は例外で、パケット間隔が 0.01 秒になります。

-I ifaddr
    ホスト名または IP アドレスで指定したネットワークインタフェースへ マルチキャストデータグラムを送信します。

-h host
    最後の引数でターゲットホストを指定する方法に対する代替法です。

-l preload
    通常の動作モードに入る前に、指定した preload 値だけできるだけ早くパケットを送信します。スーパユーザだけがこのオプションを 使うことができます。

-L  送出先がマルチキャストのインタフェースの場合にループバックを無効にして、 転送する側のホストがその ICMP リクエストを受信できないようにします。

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

-o  応答パケットを 1 つ受信すると、正常終了します。

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

-P  データ部分はデフォルトでは 8 ビットの整数をインクリメントしたシーケンスを 用いますが、その代りにデータ部分に疑似的なランダムなシーケンスを用います。 これは、PPP やその他のリンクでの圧縮を無効にする場合に有効です。

-q  出力を抑制します。スタートアップ時と終了時に出力される手短な内容の数行の 出力以外はなにも表示されません。

-Q  送った ECHO_REQUEST に対する Network Unreachable などの ICMP message の応答は 表示しません。

-R  経路を記録します。 ECHO_REQUEST パケット内に RECORD_ROUTE オプションを含め、返ってきたパケットの経路バッファを表示します。 IP ヘッダの大きさは、経路が 8 個までしか入らない程度のものであることに 注意してください 多くのホストが、このオプションを無視したり捨てたりします。

-r  通常のルーティングテーブルをバイパスし、接続されているネットワーク上の ホストに直接パケットを送ります。指定したホストが 直接接続されたネットワーク上にない場合には、エラーが返されます。 あるインタフェースを通る経路情報がなく、そのインタフェースを通して あるローカルホストに ping する場合 (たとえばインターフェースが routed(8) によって除かれた後) にこのオプションを用いるとよいでしょう。

-s packetsize
    送出するデータのバイト数を指定します。デフォルトは 56 バイトで、 ICMP ヘッダデータの 8 バイトと合わせたときには 64 バイトの ICMP データにして転送します。最大値は 65468 バイトです。

-T ttl
    指定した生存時間 (time-to-live) を用います。

-t tos
    16 進数で指定したサービスの種類 (type of service) を使います。

-v  バーボーズモードを有効にします。受信した ICMP パケットのうち ECHO_RESPONSE 以外のものも表示されるようになります。

-w maxwait
    次のパケットを送出する前の、パケットの応答待ちの時間を秒数で指定します。 デフォルトは 10.0 です。

ping を故障箇所の特定に用いる場合は、ローカルなネットワークインターフェースが up されておりかつきちんと動作しているかを確認するために、 まずローカルホスト上で実行する必要があります。 それから、ホストやもっともっと向うのゲートウェイへ ``ping'' すべきです。

round-trip time とパケットロスの統計が計算されます。 重複してパケットが受信された場合には、それはパケットロスの計算には 含められませんが、そのパケットの round-trip time は最小/平均/最大の round-trip time の計算に使われます。

指定した数のパケットを送信 (または受信) したとき、またはプログラムが SIGINT で終了すると、結果の簡単な要約が表示されます。 ping の実行中に、その ping プロセスに対して SIGINFO を送ることでもこの情報を表示させることができます (詳細は、 stty(1) の “status” 引数を参照してください)。

ping は、1 秒おきに 1 個のデータグラムを継続して送り、 ECHO_RESPONSE が戻ってくるたびに 1 行出力します。 IP Security Options つきの信用されたシステムでは、ネットワークの idiom が MONO でない場合は、 ping は 2 行目に ECHO_RESPONSE 内の IP security option の 16 進表現を含んだ 行が表示されます。もし -c オプションが指定された場合は、要求された数だけ送信されます。 応答がない場合は出力はありません。 round-trip times と パケットロスの統計が計算されます。 2 重にパケットを受け取った場合は、これらはパケットロスの計算には含められ ませんが、このパケットの round trip time は 最小/平均/最大 round-trip time の計算には使われます。 指定した数のパケットを送信した (かつ受信した) かまたはプログラムが 割り込み (SIGINT) を受けたために終了する場合には、 結果の概要が表示されます。 -f (flood) オプションを使っていない場合、最初の割り込み (通常は control-C や DEL で送られる) は、 ping は未解決のリクエストが返ってくるのを待つ状態となります。 ここでは、それ以前に成功した ping の最長 round trip time より 長い時間は待ちません。 2 番目の割り込みでは、すぐに ping が停止します。

このプログラムは主にネットワークのテスト、計測、管理に用いられます。 ping はそれ自体ネットワークに負荷をかけるので、通常業務の間に用いたり、 自動スクリプトで用いるのは浅はかな行為です。

ICMP パケットの詳細
オプションなしの IP ヘッダは 20 バイトです。 ICMP ECHO_REQUEST パケットには、追加の 8 バイトの ICMP ヘッダと、その後に続く任意の大きさのデータが含まれます。 packetsize が与えられたときは、これはデータの余分な部分のサイズ (デフォルトは 56) を示して います。こうして ICMP ECHO_REPLY 型の IP パケットの中に受信されたデータ量は、要求したデータ領域 (ICMP ヘッダ) よりも常に 8 バイト大きくなります。

もしデータ領域が少なくとも 8 バイトあるならば、 ping はこの最初の 8 バイトの領域に、round trip time の計算に使うための タイムスタンプを入れます。もしパッド部分が 8 バイトより少なく指定されたならば、 round trip time は得られません。

重複および損傷したパケット
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 にセットされています。これが、 telnet(1) や ftp(1) では入れないホストを ``ping'' することができる理由です。

普通の操作では、ping は受けたパケットの ttl 値を出力します。リモートシステムが ping パケットを受け取ったときは、その応答パケット内の TTL フィールドに対して以下の 3 つのうちの 1 つが行われます:

•   変更しない。これは、 4.3BSD tahoe リリース以前のバークレイ UNIX システムが行っていたことです。この場合、 受け取ったパケット中の TTL 値は 255 から round-trip 経路内でのルータの数を引いた数になります。

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

•   他の値にセットする。 TCP パケットで用いている値、たとえば 30 あるいは 60 などと同じ値を ICMP パケットにも用いているマシンがあります。 この他に、全くでたらめな値を用いているものもあるかもしれません。

終了ステータス
ping は、成功時 (ホストが生きている) には 0 を、引数が正しくない場合や ホストから応答がない場合には 0 でない値を返します。

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

最大 IP ヘッダ長は、 RECORD_ROUTE オプションのようなオプションには小さ過ぎます。しかし、これについて 対処できることはあまりありません。

ping を垂れ流しにするのは、一般的に勧められません。加えて、 ブロードキャストアドレスに対して ping を垂れ流しにするのは、 十分に制限された状況下でのみ行うべきです。

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

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