Ping

enはIPネットワークにおいて、ネットワーク上で特定のIPアドレスを持つ機器から応答があるかを調べるためのプログラム。

「到達性」を確認するために使え、さまざまな用途があり、たとえばホストシステムがインターネットとの基本的な接続を確立しているかテストするため、また自ホストが属するノードが特定のノードと繋がっているかをテストするため、などに使われている。

IPネットワークにおける基本的なツールの一つであり、IPネットワーク機能が実装されているオペレーティングシステムや組み込みネットワーク管理ソフトウェアのほとんどで、何らかの形で用意されている。

1. 概要
-----

pingは、発信元のホストから宛先のコンピュータにメッセージを送信し、宛先がそれに対して返した応答が戻って来るまでのラウンドトリップタイムを測定する。「ping」という名前は、アクティブソナーの用語に由来している。

pingはICMPの"echo request"パケットを対象ホストに送信し、対象ホストから"echo reply"が返って来ることで「到達性」を確認する。プログラムは、エラー、パケットロス率、結果の統計的要約を報告する。

逆に、相手システムから応答がなかった場合は、「制限時間内に応答がなかった」「指定されたアドレスやネットワークは到達可能ではない」「経路が長すぎて到達できない」など、応答がなかった理由を表示する。

1.1. 用途
-------

pingを使用してIPネットワークに関するさまざまな情報を得ることができる。たとえばホストシステムの基本的なネットワーク設定がうまくできているか、ホストシステムはそもそも物理的な回線と繋がっているか、DNSは正常に機能しているか、自分側のノードと相手ノードの経路上に何らかの不具合が生じたり過負荷が生じたりしていないか、などである。

pingで宛先から応答があったと表示される状態を日本では俗語では「pingが通る」というが、「pingが通る」ということは、「少なくとも、双方向にパケットの送受信ができる」「自システムから送信したパケットは指定IPの機器に届き、なおかつ、指定したIPの機器が送信したパケットも自システムに届く、という状態にはある」ということを示す。ドメイン名をノード名としてパケットを送信して正常に応答された場合は、DNSの障害もない、と判る。

pingはたとえば前日までアクセス可能だったウェブサイトが突然アクセス不能・困難になった際にも、その原因や状況を調べるために使える。ウェブサーバのドメイン名でpingを「打ち」、正常に応答があれば、IPネットワークもDNSも正常と判断されるので、より高レベルのレイヤーに属するソフトウェアつまりOSI参照モデルでより高い層を荷うソフトウェアで問題が起きているのだろうと推察できる。もしpingで指定IPアドレスから応答があるのにそのIPアドレスのウェブサイトを閲覧できないならば、たとえばhttpレベルの通信が自身か相手のファイアウォールでブロックされているかもしれないし、相手のWWWサーバソフトウェアに障害が起きているのかも知れない、と推察できるのである。

1.2. 種類、仕様の違い、特殊な用途
-------------------

pingユーティリティのコマンドラインオプションとその出力は、実装によって異なる。ペイロードのサイズ、試行回数、パケットを通過させるネットワークホップ数の制限、試行間隔などをオプションとして指定できる。多くのシステムでは、IPv6ネットワークで同様のテストをするための、ICMPv6を実装したユーティリティ"ping6"を提供している。

一部のオンラインソフトEditMTU等。}}にもping機能を持つものがある。

オンラインゲームなどにおいて、サーバーとプレイヤー間の通信タイムラグをpingとして表示するものもある。また、短時間で切断されるような特殊なセッションを定期的なpingによって強制的に保持するという使い方もある。

2. 歴史
-----

pingは、1983年12月に、当時アメリカ陸軍弾道研究所に勤務していたマイク・ムースが、自身の管理するIPネットワークでのトラブルシュート用に作成した。これは、後にNTPを開発したデイヴィッド・L・ミルズの、IPネットワークの診断と測定にICMPエコーパケットを使用することについての発言に触発されたものである。ムースは、その挙動が潜水艦などで使われるアクティブソナーの発する音波の挙動と似ていることから、このプログラムをpingと名づけた。この事からpingを実行する事を「pingを打つ」と呼ぶ場合が多い。ムースはpingが何かの略語であることを否定しているが、ミルズにより"packet internet groper"、別の人より"packet internet gopher"ここでのgopherはIT用語でのgopherではなく、[[ネズミ目というバクロニムを授かっている。

最初にリリースされたバージョンはパブリックドメインだったが、後にBSDライセンスの下でライセンスされるようになった。pingは4.3BSDに最初から含まれていた。

1122}} では、どのホストもICMP echo requestを処理し、echo replyを返送する必要があると規定している。しかし、セキュリティ上の理由から、これはしばしば無効になっている。

インターネットの接続性の問題の“診断”にも有用なpingであったが、2003年末、Welchiaのようなpingをネットワークにフラッドし標的を探すタイプのコンピュータウイルスが出現したり、悪意を持ったユーザが攻撃目標の調査やネットワークに負荷をかけるなどの目的でpingの悪用を行ったため、一部のISPでICMP Type 8パケットがフィルタリングされるようになった。

3. pingの出力例
-----------

下線は利用者が入力する部分

3.1. Linux
----------

以下の出力例はLinux端末からwww.google.comへ、iputilsバージョンのpingからpingを打った結果である。

$ ping www.google.com PING www.l.google.com  56 bytes of data. 64 bytes from 64.233.183.103: icmp_seq=1 ttl=246 time=22.2 ms 64 bytes from 64.233.183.103: icmp_seq=2 ttl=245 time=25.3 ms 64 bytes from 64.233.183.103: icmp_seq=3 ttl=245 time=22.7 ms 64 bytes from 64.233.183.103: icmp_seq=4 ttl=246 time=25.6 ms 64 bytes from 64.233.183.103: icmp_seq=5 ttl=246 time=25.3 ms 64 bytes from 64.233.183.103: icmp_seq=6 ttl=245 time=25.4 ms 64 bytes from 64.233.183.103: icmp_seq=7 ttl=245 time=25.4 ms 64 bytes from 64.233.183.103: icmp_seq=8 ttl=245 time=21.8 ms 64 bytes from 64.233.183.103: icmp_seq=9 ttl=245 time=25.7 ms 64 bytes from 64.233.183.103: icmp_seq=10 ttl=246 time=21.9 ms

--- www.l.google.com ping statistics ---10 packets transmitted, 10 received, 0% packet loss, time 9008ms rtt min/avg/max/mdev = 21.896/24.187/25.718/1.619 ms

出力例からわかることは、まずwww.google.comというホスト名がDNSのCNAMEレコードによりwww.l.google.comへ誘導され、64.233.183.103というIPアドレスにリゾルブされている。そして64.233.183.103に向けて10回pingが打たれており、出力の最後にpingの結果が出ている。

結果からわかることは以下の通りである。

パケットは10回送信され、10回とも受信された。パケットロスは0%である。
ラウンドトリップタイムは最短21.896ミリ秒、平均24.187ミリ秒、最長25.718ミリ秒、平均偏差は1.619ミリ秒である。

3.2. macOS
----------

以下の出力例はmacOS端末からwww.google.comへ、ターミナルのコマンドpingからpingを打った結果である。 ただし、computernameはコンピューター名、usernameはユーザー名である。

computername:~ username$ ping www.google.com PING www.l.google.com : 56 data bytes 64 bytes from 66.249.89.104: icmp_seq=1 ttl=238 time=30.556 ms 64 bytes from 66.249.89.104: icmp_seq=2 ttl=238 time=30.412 ms 64 bytes from 66.249.89.104: icmp_seq=3 ttl=238 time=31.272 ms 64 bytes from 66.249.89.104: icmp_seq=4 ttl=238 time=30.121 ms 64 bytes from 66.249.89.104: icmp_seq=5 ttl=238 time=30.942 ms 64 bytes from 66.249.89.104: icmp_seq=6 ttl=238 time=32.132 ms 64 bytes from 66.249.89.104: icmp_seq=7 ttl=238 time=30.680 ms 64 bytes from 66.249.89.104: icmp_seq=8 ttl=238 time=32.614 ms 64 bytes from 66.249.89.104: icmp_seq=9 ttl=238 time=29.405 ms 64 bytes from 66.249.89.104: icmp_seq=10 ttl=238 time=41.360 ms 64 bytes from 66.249.89.104: icmp_seq=11 ttl=238 time=32.176 ms 64 bytes from 66.249.89.104: icmp_seq=12 ttl=238 time=32.321 ms ^C

--- www.l.google.com ping statistics ---13 packets transmitted, 12 packets received, 7% packet loss round-trip min/avg/max/stddev = 29.405/31.999/41.360/2.978 ms

macOSはUNIXであるため、Linuxとほぼ変わらない表示である。 今回は-cオプションで回数設定していないため、割込み文字で止めない限り永遠に続く。見方はLinuxの出力例を参考。

logから分かる事は、

13回パケットを送信し、12回受信してロスは、7%である。
RTTは最短29.405ミリ秒、平均31.999ミリ秒、最長41.360ミリ秒、標準偏差は2.978ミリ秒である。

3.3. Windows
------------

以下の出力例はMicrosoft Windows XP端末からwww.google.comへ、コマンドプロンプト標準のpingを使用してpingを打った結果である。

C:\>ping www.google.com

Pinging www.l.google.com [64.233.183.103] with 32 bytes of data:

Reply from 64.233.183.103: bytes=32 time=25ms TTL=245 Reply from 64.233.183.103: bytes=32 time=22ms TTL=245 Reply from 64.233.183.103: bytes=32 time=25ms TTL=246 Reply from 64.233.183.103: bytes=32 time=22ms TTL=246

Ping statistics for 64.233.183.103: Packets: Sent = 4, Received = 4, Lost = 0 , Approximate round trip times in milli-seconds: Minimum = 22ms, Maximum = 25ms, Average = 23ms

出力例からわかることは、まずwww.google.comというホスト名がDNSのCNAMEレコードによりwww.l.google.comへ誘導され、64.233.183.103というIPアドレスにリゾルブされている。そして64.233.183.103に向けて4回pingが打たれており、出力の最後にpingの結果が出ている。

結果からわかることは以下の通りである。

パケットは4回送信され、4回とも受信された。パケットロスは0%である。
ラウンドトリップタイムは最短22ミリ秒、最長25ミリ秒、平均23ミリ秒である。また、次の出力例は日本版Microsoft Windows 10端末からwww.google.comへ、2018年10月29日にコマンドプロンプト標準のpingを使用してpingを打った結果である。 C:\Users\>ping www.google.com

www.google.com [2404:6800:400a:808::2004]に ping を送信しています 32 バイトのデータ: 2404:6800:400a:808::2004 からの応答: 時間 =13ms 2404:6800:400a:808::2004 からの応答: 時間 =14ms 2404:6800:400a:808::2004 からの応答: 時間 =14ms 2404:6800:400a:808::2004 からの応答: 時間 =14ms

2404:6800:400a:808::2004 の ping 統計: パケット数: 送信 = 4、受信 = 4、損失 = 0 、 ラウンド トリップの概算時間 : 最小 = 13ms、最大 = 14ms、平均 = 13ms

基本的な部分は上の例と同一だが、www.google.comからリゾルブされたIPアドレスが、IPv6の表示となっている。

4. Ping ipv6
------------

現在主流のipv4のPingとは違って、ipv6の場合はInternet Control Message Protocol for IPv6 を使用し、IPv4で使われていたICMPのエラー通知などの機能に加えて、ARPに相当するアドレス解決の機能もあわせ持つようになった。

5. エラー表示
--------

宛先のホストからの応答がない場合、ほとんどの実装では単にタイムアウトを表示するだけだが、一部の実装では、タイムアウトに関する以下のようなエラー通知を定期的に出力する。

H}} ホストにアクセスできない
!N}} ネットワークにアクセスできない
!P}} プロトコルにアクセスできない
S}} 送信元ルートが失敗した
F}} フラグメントが必要
U}} 宛先ネットワークが不明
!W}} 宛先ホストが不明
I}} 送信元ホストが孤立している
A}} 宛先ネットワークとの通信が管理上禁止されている
Z}} 宛先ホストとの通信が管理上禁止されている
Q}} このToSでは、宛先ネットワークに到達できない
T}} このToSでは、宛先ホストに到達できない
X}} 通信が管理上禁止されている
V}} ホスト優先順位違反
C}} 優先順位カットオフが有効エラーが発生した場合、宛先ホストや中間ルータは、"host unreachable"や"TTL exceeded in transit"などのICMPエラーメッセージを返信する。このメッセージには、元のメッセージの最初の8バイトが含まれているため、pingユーティリティは応答を発信元のクエリーと照合できる。

6. メッセージのフォーマット
---------------

6.1. ICMPパケット
-------------

 ICMPパケットの一般的な構成:

IPv4ヘッダ: プロトコルは1、サービスタイプは0が設定される。
IPv6ヘッダ: 次のヘッダは58が設定される。
ICMPヘッダ:
ICMPメッセージの種類
コード
チェックサム。パケットのICMP部分で計算される。Typeフィールドで始まるICMPメッセージの1の補数和の16ビットの1の補数である。
ヘッダデータ。echo request, replyでは、識別子とシーケンス番号で構成される。
ICMPペイロード：様々な種類の回答のペイロード。実装の詳細により任意の長さにすることができる。ただし、IPヘッダとICMPヘッダを含むパケットは、ネットワークのmaximum transmission unitより小さくなければならない。MTUより大きくなると、フラグメントされる危険性がある。

6.2. ECHO-REQUEST}} echo request
--------------------------------

//echo request//は、ICMP/ICMP6のメッセージである。

クライアントは、識別子とシーケンス番号を使用して、応答を要求と一致させることができる。実際には、ほとんどのLinuxシステムはpingプロセスごとに異なる識別子を使用しており、シーケンス番号はそのプロセス内で増加する番号である。Windowsは、Windowsのバージョンによって異なる固定識別子と、起動時にのみリセットされるシーケンス番号を使用する。

6.3. ECHO-REPLY}} echo reply
----------------------------

//echo reply//は、echo requestの応答として生成されるICMPメッセージである。規定では、エコー要求を受信した場合は必ずエコー応答を返信しなければならず、エコー応答にはエコー要求に含まれるペイロードをそのまま含まなければならない。

識別子とシーケンス番号は、エコー要求と応答を関連付けるためにクライアントで使用される。

6.4. ペイロード
----------

パケットのペイロードは一般にASCII文字で埋められている。以下に、ICMP echo requestの最後の32バイトのtcpdumpユーティリティによる出力の例を示す。 ペイロードには、送信の時間を示すタイムスタンプやシーケンス番号を含むことができる。これにより、pingは各パケットの送信時刻を記録することなく、ステートレスな方法でラウンドトリップタイムを計算できる。

7. セキュリティ上の考慮事項
---------------

多くのpingの実装には"flood"オプションが存在する。これは、高負荷条件下でのネットワークの応答を判断するために、できるだけ速くリクエストを送信するものである。このオプションは管理者特権を持つユーザに制限されているが、標的の元に大量のICM echo requestが届くようにするDoS攻撃の一種のping floodに使用される可能性がある。

pingは、単にホストの存在を知らせることによって潜在的なターゲットとして確認されるため、セキュリティ上のリスクと見なされている。解決策として、多くのシステムにおいて、 1122}} においてホストは常に返信を返さなければならないという規定を無視して、返信を無効にする手段を提供している。さらに、pingによって計算されたラウンドトリップ時間は、完全性チェックに欠けていることが多く、そのため、過酷な環境では信頼できない。攻撃者は、ほとんどのping実装で計算された遅延を延長または短縮する可能性がある 。

8. 関連項目
-------

キープアライブ
UNIXユーティリティの一覧
Traceroute
Ping of death
Smurf攻撃

9. 脚注
-----

9.1. 注釈
-------

9.2. 出典
-------

10. 外部リンク
---------

[1] pingの作者であるマイク・ムースの解説
[2] man page
[3] man page
[4]
[5] Ping and other online tools and services オンラインネットワークサービス
[6] 　Windows 95・98・Me・2000・XPで利用可能なユーティリティ
Windows 95で使う場合はWinsock2.0とダイヤルアップネットワーク1.3が必要
[7]