[Wireshark / CCNA 実技] Ping の正体見たり

2024/08/04に公開

はじめに

コンピュータやサーバなどの端末の疎通確認に使用される ping コマンドをターミナルで実行すると、下記のように応答が返ってきます。

fika:~ shuma$ ping 192.168.11.1
PING 192.168.11.1 (192.168.11.1): 56 data bytes
64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=3.453 ms
64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=3.013 ms
64 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=3.091 ms
^C
--- 192.168.11.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 3.013/3.186/3.453/0.192 ms

当たり前のように応答が返ってきていますが、ping コマンドは実際に何をして、どうやって宛先まで通信がたどり着いているのでしょうか?

この記事では、下記のことがわかります。

  • ping するとどんなパケットが流れるのか
  • 1回目の ping がタイムアウトするのはなぜ?

構成

今回作成した実機の環境は、下図の通りです。PC が繋がっているスイッチの Fa0/2 ポートに流れるパケットを Fa0/24 にコピーして、この先に繋がっている別 PC で Wireshark を動かして待機しています。

スイッチに設定している SPAN の詳細は下記の通りです。

Alice-SW01#show monitor session 1
Session 1
---------
Type                   : Local Session
Source Ports           : 
    Both               : Fa0/2
Destination Ports      : Fa0/24
    Encapsulation      : Native
          Ingress      : Disabled

ICMP は OSI 参照モデルのネットワーク層で動作するプロトコルです (正確には IP プロトコルの上位に位置するらしい)。

Ping 打ってみた

PC から Switch に ping を打ってみた時のパケットが以下の通りです。

ping の ICMP パケットの前に、ARP パケットが出ていることがわかります。ping パケットには、下層であるイーサネットヘッダが付くので宛先の MAC アドレスが必要になります。つまり、ping パケットを送付する端末は、まず宛先の MAC アドレスを取得する必要があります。ICMP パケットのフォーマット概略は以下の通りです。

そのため、ICMP パケットの前に ARP を実行して宛先である 172.16.1.1 の IP アドレスを持つ端末の MAC アドレスを取得します。

これで宛先の MAC アドレスがわかったので改めて ICMP パケットを送信しています。

しかし、よく見ると最初のパケットはタイムアウトしています (画像で言うと No.3 のパケット)。これは、ARP による MAC アドレス解決 (Switch が PC の MAC アドレスを解決する) によって時間がかかってしまうことが原因で起きています。このように、1回目の ping はタイムアウトになってしまうこともあります。2回目以降は、ARP が発生しないのでタイムアウトせずにやりとりができます。

おわりに

今回は ping コマンドの裏側でどんなパケットが発生しているのかを紹介しました。テキストなんかでは、ping は ICMP の一種だと書いてあるので、ICMP パケットが発生するんだろうとなんとなくわかります。しかし、実際には宛先の MAC アドレスを知っておく必要があるので ARP が実行されています。事前に ARP が発生するのは ping に限った話ではなく、宛先の MAC アドレスが必要な全ての通信において必要になります。また、各機器が持っている ARP テーブルのキャッシュ時間にはバラ付きがあると思いますが、キャッシュが残っているうちは、再度 ARP せずにパケットを作ることができます。

Discussion