メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. IPv4記事一覧/

ICMP Echo Request/Reply(ping)

目次

ICMP Echo Request/Replyとは

ICMP Echo Request/Replyは、通称「ping」として知られる、2点間のIP到達性を確認するための最も基本的なICMPメッセージです。送信元がEcho Request(Type 8)を送信し、宛先がそれを受信できればEcho Reply(Type 0)を返送します。応答が返ってくれば、両者の間でIPパケットが正常に往復できることが確認できます。

RFC 792で定義されており、Echo Request/ReplyはICMPの「問い合わせメッセージ(Query Message)」に分類されます。エラーメッセージとは異なり、正常な通信の確認そのものを目的としている点が特徴です。

パケットフォーマット

Echo Request/Replyの「Rest of Header」には、要求と応答を対応付けるためのIdentifierとSequence Numberが格納されます。

フィールド名サイズ説明
Type1 バイトEcho Requestは8、Echo Replyは0
Code1 バイト常に0
Checksum2 バイトICMPメッセージ全体(Type〜Data)を対象とした誤り検出用の値。
Identifier2 バイト一連のEcho Request/Replyを識別するための値。複数のプロセスやセッションが同時にpingを実行していても混同しないよう、実装依存の値(プロセスIDなど)が使われることが多い。
Sequence Number2 バイト同一Identifier内で送信するたびに増加する連番。パケットロスや順序の入れ替わりを検出するために使われる。
Data可変長任意のパディングデータ。送信側が設定した内容がそのままEcho Replyでもエコーバックされる。

Echo Replyは、受信したEcho RequestのIdentifier・Sequence Number・Dataをそのまま踏襲して返送します。送信側はこの3つの値を突き合わせることで、どのRequestに対する応答かを識別します。

動作

R1(192.168.0.1)からR2(192.168.0.2)に対して ping を実行した場合の基本的な流れです。

sequenceDiagram
    participant R1 as R1
192.168.0.1 participant R2 as R2
192.168.0.2 R1->>R2: ICMP Echo Request
Type: 8, Code: 0
Identifier: 0x0001, Seq: 1 R2->>R1: ICMP Echo Reply
Type: 0, Code: 0
Identifier: 0x0001, Seq: 1 R1->>R2: ICMP Echo Request
Identifier: 0x0001, Seq: 2 R2->>R1: ICMP Echo Reply
Identifier: 0x0001, Seq: 2 Note over R1: Sequence Numberの連続性から
パケットロスの有無を判定
  1. R1は宛先IPアドレスをR2としたEcho Request(Type 8)を送信する。IdentifierとSequence Numberは送信元プロセスが管理する。
  2. R2はEcho Requestを受信すると、送信元と宛先のIPアドレスを入れ替え、受信したIdentifier・Sequence Number・DataをそのままEcho Reply(Type 0)として返送する。
  3. R1はEcho Replyを受信し、送信したRequestとSequence Numberが一致することを確認して往復時間(RTT)を計測する。
  4. 一定時間内に応答が返らなかった場合、そのSequence Numberに対応するパケットはロストしたと判断される。

実機での検証

R1・R2(Cisco IOS XE、GigabitEthernet1同士を直接接続)を実際に用意し、R1からping 192.168.0.2を実行してICMP Echo Request/Replyの動作をパケットキャプチャとshow ip trafficのICMPカウンタで確認しました。

pingコマンドの実行結果

R1 ping 192.168.0.2
R1#ping 192.168.0.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.0.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 2/2/3 ms
R1#

5回とも応答が返り(!が5つ)、成功率100%、往復時間(RTT)は最小2ms・平均2ms・最大3msでした。

パケットキャプチャ(Echo Request / Echo Reply)

1往復目(Sequence Number 0)のキャプチャです。

ICMP Echo Request(R1→R2)
Ethernet II, Src: 52:54:00:83:54:c2, Dst: 52:54:00:c2:81:b1
    Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 192.168.0.1, Dst: 192.168.0.2
    Total Length: 100
    Time to Live: 255
    Protocol: ICMP (1)
Internet Control Message Protocol
    Type: 8 (Echo (ping) request)
    Code: 0
    Checksum: 0xf26b
    Identifier: 0x0001 (1)
    Sequence Number: 0x0000 (0)
    Data (72 bytes)
ICMP Echo Reply(R2→R1)
Ethernet II, Src: 52:54:00:c2:81:b1, Dst: 52:54:00:83:54:c2
    Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 192.168.0.2, Dst: 192.168.0.1
    Total Length: 100
    Time to Live: 255
    Protocol: ICMP (1)
Internet Control Message Protocol
    Type: 0 (Echo (ping) reply)
    Code: 0
    Checksum: 0xfa6b
    Identifier: 0x0001 (1)
    Sequence Number: 0x0000 (0)
    Data (72 bytes)

送信元MACアドレス52:54:00:83:54:c2がR1、52:54:00:c2:81:b1がR2のGigabitEthernet1です。Echo ReplyではEthernetヘッダーの宛先/送信元MACアドレスとIPヘッダーの宛先/送信元IPアドレスが入れ替わる一方、ICMPのIdentifier(0x0001)とSequence Number(0x0000)はEcho Requestと同じ値のまま返送されており、前述のとおり送信元がこの2つの値で応答を対応付けられることが確認できます。

IP Total Lengthが100バイトなのに対し、ICMPメッセージ自体は8バイトのヘッダーと72バイトのデータで合計80バイトです(100 = 20バイトのIPヘッダー + 80バイトのICMPメッセージ)。Cisco IOS XEはデフォルトのping送信データに0xABCDの繰り返しパターンを使用します。

show ip trafficによるICMP統計の確認

R1 show ip traffic
R1#show ip traffic
<snip>
ICMP statistics:
  Rcvd: 0 format errors, 0 checksum errors, 0 redirects, 0 unreachable
        0 echo, 5 echo reply, 0 mask requests, 0 mask replies, 0 quench
        0 parameter, 0 timestamp, 0 timestamp replies, 0 info request, 0 other
        0 irdp solicitations, 0 irdp advertisements
        0 time exceeded, 0 info replies
  Sent: 0 redirects, 0 unreachable, 5 echo, 0 echo reply
        0 mask requests, 0 mask replies, 0 quench, 0 timestamp, 0 timestamp replies
        0 info reply, 0 time exceeded, 0 parameter problem
        0 irdp solicitations, 0 irdp advertisements
<snip>
R1#
R2 show ip traffic
R2#show ip traffic
<snip>
ICMP statistics:
  Rcvd: 0 format errors, 0 checksum errors, 0 redirects, 0 unreachable
        5 echo, 0 echo reply, 0 mask requests, 0 mask replies, 0 quench
        0 parameter, 0 timestamp, 0 timestamp replies, 0 info request, 0 other
        0 irdp solicitations, 0 irdp advertisements
        0 time exceeded, 0 info replies
  Sent: 0 redirects, 0 unreachable, 0 echo, 5 echo reply
        0 mask requests, 0 mask replies, 0 quench, 0 timestamp, 0 timestamp replies
        0 info reply, 0 time exceeded, 0 parameter problem
        0 irdp solicitations, 0 irdp advertisements
<snip>
R2#

R1側は「Sent: 5 echo」「Rcvd: 5 echo reply」、R2側はその逆に「Rcvd: 5 echo」「Sent: 5 echo reply」となっており、5回分のping(Echo Request送信・Echo Reply受信)がそれぞれの機器のICMP統計に正しく反映されていることが確認できます。

icmp_echo_request_reply.pcap をダウンロード

R1 config(r1_icmp_echo_request_reply.cfg) をダウンロード

R2 config(r2_icmp_echo_request_reply.cfg) をダウンロード

pingコマンドの主なオプション

pingコマンドの基本的な動作はOS間で共通していますが、デフォルトの送信間隔・パケットサイズ・送信回数などはOSによって異なります。

OS/機器コマンド例備考
Linuxping -c 4 192.168.0.2既定では終了するまで送信し続ける。-cで回数指定。
Windowsping 192.168.0.2既定で4回送信して終了する。
macOSping -c 4 192.168.0.2Linuxと同様、既定では送信し続ける。
Cisco IOS XEping 192.168.0.2既定で5回送信し、応答を!(成功)や.(タイムアウト)で表示する。
LinuxやmacOSのpingは既定のEcho Requestデータサイズが56バイト(ICMPヘッダーを含めると64バイト)であるのに対し、Windowsのpingは既定で32バイトです。異なるOS間でパケットキャプチャを比較する際は、このデフォルトサイズの違いに注意が必要です。

参考

関連記事