【入門編】 pingコマンドの基本仕様とICMP Echo Request/Replyパケットの構造 – トラブルシューティング&ネットワーク運用監視実践ガイド

はい、承知いたしました。データセンターの障害対応で鍛え上げられたNOCシニアエンジニアの視点から、インフラやネットワークの世界に足を踏み入れたばかりのエンジニアの皆さんに、pingコマンドの基本とICMPパケットの仕組みを、身近な例えを用いて分かりやすく解説するブログ記事を執筆します。教科書的な堅苦しい説明は避け、現場のリアルな感覚を交えながら、親しみやすく丁寧なトーンで進めていきましょう。

—

pingコマンド:ネットワークの「元気?」を確かめる魔法の呪文

皆さん、こんにちは!インフラの世界へようこそ。新しい技術に触れるのって、ワクワクしますよね。でも、いきなり専門用語の羅列や、ビットだのバイトだの…って、ちょっと立ち止まってしまうこともあるかもしれません。大丈夫!その気持ち、痛いほど分かります。私も最初はそうでしたから。

今日は、そんな皆さんのために、ネットワークの世界で「元気?」を確かめるのに欠かせない、とっても便利なコマンド、「ping」について、その裏側にある仕組みまで、ゆっくり、じっくり紐解いていきたいと思います。

「ping」って聞くと、「あ、なんかIPアドレス打ってエンター押すやつでしょ?」くらいに思っている方もいるかもしれませんね。そうなんです、その通り!でも、その「ping」が、裏でどんなやり取りをして、どうやって「元気?」を確かめているのか、知っていますか?

pingコマンドとは? ~ネットワークの「もしもし」~

まず、pingコマンドの基本的な役割からおさらいしましょう。

pingコマンドは、簡単に言うと、「指定した相手(IPアドレスやホスト名)がネットワーク上でちゃんと応答してくれるか?」を確認するためのコマンドです。ネットワークの入り口に立って、「もしもし、聞こえますかー?」と呼びかけるようなイメージですね。

例えば、会社のサーバーにアクセスしようとしたときに、なかなか繋がらない…。そんな時、まず疑うのは「サーバー自体が落ちているんじゃないか?」「ネットワークが繋がらないんじゃないか?」ですよね。そんな時に、pingコマンドを使って、その「相手」に呼びかけてみるんです。

もし、相手から「はい、聞こえていますよ!」という元気な返事が返ってくれば、少なくともその相手まではネットワークが繋がっていて、相手もちゃんと動いている、ということが分かります。逆に、何も返ってこなかったり、「応答がありません」というメッセージが出たりしたら、どこかに問題がある可能性が高い、ということが推測できるわけです。

pingコマンドの基本的な使い方

早速、pingコマンドを使ってみましょう。コマンドプロンプトやターミナルを開いて、こんな風に入力してみてください。

ping google.com

または、IPアドレスで直接指定することもできます。

ping 8.8.8.8

google.com はGoogleのウェブサイトのホスト名、8.8.8.8 はGoogleが提供しているDNSサーバーのIPアドレスです。

実行すると、以下のような出力が得られるはずです(環境によって多少表示は異なります)。

Pinging google.com [172.217.175.196] with 32 bytes of data:
Reply from 172.217.175.196: bytes=32 time=15ms TTL=118
Reply from 172.217.175.196: bytes=32 time=16ms TTL=118
Reply from 172.217.175.196: bytes=32 time=14ms TTL=118
Reply from 172.217.175.196: bytes=32 time=17ms TTL=118

Ping statistics for 172.217.175.196:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 14ms, Maximum = 17ms, Average = 15ms

この出力から、いくつか重要な情報が読み取れます。

  • Pinging google.com [172.217.175.196] with 32 bytes of data::

google.com というホスト名に、IPアドレス 172.217.175.196 として、32 バイトのデータをつけて、pingを送っていますよ、という情報です。

  • Reply from 172.217.175.196: bytes=32 time=15ms TTL=118:

これが、相手からの「返信(Reply)」です。

  • bytes=32: 送ったデータと同じ 32 バイトで返ってきました。
  • time=15ms: 返信が返ってくるまでの時間(往復時間、Round Trip Time: RTT)が 15 ミリ秒でした。この時間が短いほど、ネットワークの応答が良いと言えます。
  • TTL=118: TTL(Time To Live)というのは、パケットがネットワーク上をどれだけ長く旅できるかの「賞味期限」のようなものです。ルーターを1つ通過するごとに値が減っていき、0になるとパケットは破棄されます。この値が大きいほど、目的地まで多くのルーターを経由している、あるいは、途中で失われていない、という目安になります。
  • Ping statistics:

最後に、送信したパケット数、受信したパケット数、そして損失率(Lost)が表示されます。損失率が 0% なら、全てのパケットがちゃんと届いて返ってきた、ということですね!

pingの裏側:ICMPという「通信のルール」

さて、ここまで「pingコマンド」という道具と、その使い方を見てきました。でも、この「ping」は、一体どんな「手紙」を相手に送っているのでしょうか?そして、相手からの「返信」は、どんな「手紙」なのでしょうか?

ここで登場するのが、ICMP (Internet Control Message Protocol) という、ネットワークの「通信のルール」の一つです。pingコマンドは、このICMPというルールを使って、相手に「元気?」と問いかけ、返信を受け取っているんです。

ICMPは、TCPやUDPのように、アプリケーションが直接使うというよりは、ネットワークの「調子」を管理したり、エラーを通知したりするために使われる、ちょっと特別なプロトコルなんです。pingはそのICMPの機能を使った、代表的な例なんですね。

ICMPには、色々な「メッセージの種類」があるのですが、pingが使うのは主に二つのメッセージです。

1. ICMP Echo Request (タイプ8):相手に「元気?」と問いかけるためのメッセージ
2. ICMP Echo Reply (タイプ0):問いかけに対して「元気だよ!」と返信するメッセージ

この二つが、pingコマンドの心臓部と言えるでしょう。

ICMP Echo Request(問いかけ)パケットの構造

では、この「元気?」と問いかけるICMP Echo Requestパケットは、一体どんな構造になっているのでしょうか?

小難しいビット列やヘッダー名を見ていく前に、まずは身近な「郵便配達」に例えてみましょう。

あなたが、友達に「元気?」と手紙を書きたいとします。その手紙は、封筒に入っていて、宛先と差出人の情報が書かれていますよね。

ICMP Echo Requestパケットも、これと似たような構造をしています。

  • IPヘッダー: これは、郵便配達で言うところの「封筒」や「郵便番号・住所」に相当します。パケットをどこからどこへ送るのか、という情報(送信元IPアドレス、宛先IPアドレスなど)が書かれています。pingコマンドは、このIPヘッダーに「このIPアドレス(宛先)に送って!」という指示を書いて、ネットワークに送り出します。
  • ICMPヘッダー: これが、手紙の「本文」を包む「中身」のようなものです。
  • Type (タイプ): ここに 8 と書かれていれば、「これはEcho Request(問いかけ)ですよ」ということが分かります。
  • Code (コード): Echo Requestの場合は、通常 0 です。「問いかけのコード0」という感じです。
  • Checksum (チェックサム): 手紙に「封をする」ようなものです。パケットが途中で改ざんされていないかを確認するための「お守り」みたいなものです。
  • Identifier (識別子): 複数のpingを同時に送った場合に、どの「問いかけ」に対する「返信」なのかを区別するための目印です。
  • Sequence Number (シーケンス番号): これも、Identifierと同じように、どの「問いかけ」に対する「返信」かを区別するための目印です。郵便配達で言うと、手紙に「1通目」「2通目」と番号を振るようなイメージですね。
  • Data (データ): ここに、実際にpingコマンドが用意したデータが入ります。通常は32バイトのランダムなデータですが、このデータは「元気?」という問いかけの証拠のようなもので、返信でもそのまま返ってきます。

つまり、pingコマンドがICMP Echo Requestパケットを送るときは、
「このIPアドレス(宛先IP)の、この「元気?(Type=8)」というメッセージを、この「識別子」と「シーケンス番号」で送るので、ちゃんと届いたら教えてね!」
という意図で、IPヘッダーとICMPヘッダー、そしてデータをつけて、ネットワークに送り出している、というわけです。

ICMP Echo Reply(返信)パケットの構造

では、相手が「元気だよ!」と返信してくるICMP Echo Replyパケットはどうでしょうか?

これは、あなたが友達から「元気だよ!」という返事を受け取った手紙に似ています。

  • IPヘッダー: こちらも、郵便配達で言うところの「封筒」や「住所」です。今度は、あなたが送ったIPアドレス(送信元IP)が宛先になり、相手のIPアドレス(宛先IP)が送信元IPになります。
  • ICMPヘッダー:
  • Type (タイプ): ここに 0 と書かれていれば、「これはEcho Reply(返信)ですよ」ということが分かります。
  • Code (コード): Echo Replyの場合も、通常 0 です。「返信のコード0」という感じです。
  • Checksum (チェックサム): こちらも、パケットの改ざんチェック用です。
  • Identifier (識別子): 送られてきたEcho Requestと同じIdentifierが入っています。
  • Sequence Number (シーケンス番号): 送られてきたEcho Requestと同じSequence Numberが入っています。
  • Data (データ): ここには、あなたが最初に送ったEcho RequestのDataが、そのまま返ってきます。

つまり、相手からのICMP Echo Replyパケットは、
「あなたが送ってきた「元気?(Type=8)」というメッセージ(同じIdentifierとSequence Number、そしてData)を受け取りましたよ!ちゃんと届きました!」
ということを、あなたに知らせてくれている、ということです。

これで、pingコマンドがどのようにして相手の「元気」を確認しているのか、その裏側の仕組みが見えてきたのではないでしょうか?

pingコマンドの応用:困った時の「お助けコマンド」

pingコマンドは、単に疎通確認だけでなく、ネットワークのトラブルシューティングで非常に役立ちます。いくつか例を挙げてみましょう。

1. ネットワーク機器(ルーターなど)の疎通確認

PCからインターネットへ出るためには、必ずルーターなどのネットワーク機器を経由します。そのルーターにpingが通るか確認することで、PCからそのルーターまでの経路に問題がないかを確認できます。

# 例:自宅のルーターのIPアドレスが 192.168.1.1 の場合
ping 192.168.1.1

2. DNSの名前解決ができているかの確認

ホスト名(例: www.example.com)をIPアドレスに変換する仕組みをDNS(Domain Name System)と言います。pingコマンドでホスト名がIPアドレスに変換されているかを確認できますが、DNSサーバー自体に問題がないかを確認する際にもpingが役立ちます。

# 例:GoogleのDNSサーバー (8.8.8.8) にpingしてみる
ping 8.8.8.8

もし、ping google.com は通るのに、ping 8.8.8.8 は通らない、といった場合は、DNSサーバーへの経路に問題があるか、DNSサーバー自体に問題がある可能性が考えられます。

3. パケットロス(パケットが途中で失われているか)の確認

先ほどのpingの出力でも確認しましたが、パケットロスの有無はネットワークの安定性を測る上で非常に重要です。pingを長時間実行したり、パケットサイズを大きくしたりして、パケットロスが発生しないかを確認することがあります。

LinuxやmacOSでは、ping コマンドにオプションをつけて、より詳細な情報を得たり、継続的にpingを実行したりできます。

# Linux/macOS: 1秒間隔で5回pingを実行
ping -c 5 -i 1 google.com

# Linux/macOS: サイズを大きくしてpingを実行 (1000バイト)
ping -s 1000 google.com

Windowsでも、同様にサイズを指定するオプションがあります。

REM Windows: サイズを大きくしてpingを実行 (1000バイト)
ping -l 1000 google.com

この「パケットサイズを大きくする」というのは、小さなパケットは問題なく通るのに、大きなパケットになると途端に遅くなったり、失われたりする場合がある、といった、ネットワークの「帯域」や「MTU(Maximum Transmission Unit)」といった、少し高度な問題の切り分けに役立つことがあります。

まとめ:pingはネットワークの「健康診断」

今日は、pingコマンドの基本的な使い方から、その裏側で使われているICMP Echo Request/Replyパケットの仕組みまで、郵便配達に例えながら、じっくりと見てきました。

  • pingコマンドは、ICMPというプロトコルを使って、相手の「元気?」を確認する。
  • ICMP Echo Request (Type=8) が「問いかけ」、ICMP Echo Reply (Type=0) が「返信」。
  • これらのパケットには、IPヘッダーとICMPヘッダーがあり、それぞれ宛先、送信元、メッセージの種類、そして「誰からの誰へのメッセージか」を区別するための情報が含まれている。
  • pingの応答時間(RTT)やパケットロス率は、ネットワークの品質を示す重要な指標。

pingコマンドは、インフラエンジニアやネットワークエンジニアにとって、まさに「健康診断」のようなものです。このコマンドを使いこなせるようになるだけで、ネットワークのトラブルシューティングの幅がぐっと広がります。

最初は難しく感じるかもしれませんが、一つ一つの概念を、身近なものに例えながら理解していくことで、きっと「なるほど!」と思える瞬間が訪れるはずです。

これからも、皆さんのインフラ・ネットワーク学習の旅を、精一杯サポートしていきますね!次回のブログもお楽しみに!

—

コメント

タイトルとURLをコピーしました