AT's Blog

趣味のプログラミングに関する技術メモがメインです。

tcpdumpでpingパケットの中身を覗いてみる

私は飽きっぽい性格で、 ディープラーニングアルゴリズムとデータ構造、Webフレームワークと、 ITっぽいモノを素人なりにいろいろ噛っているのですが、最近はTCP/IPに興味が移ってきました。

というわけで、今日はtcpdumpコマンドでpingパケットの中身を覗いてみました。

ping - Wikipedia

Internet Control Message Protocol - Wikipedia

tcpdump - Wikipedia

ターミナルを立ち上げてtcpdumpを実行し、ICMPパケットを対象にキャプチャします。

>sudo tcpdump -X icmp
Password:
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Packet Tap), capture size 65535 bytes

別ターミナルを立ち上げて、ルータに向けてpingを1発打ってみます。

>ping -c 1 192.168.100.1      
PING 192.168.100.1 (192.168.100.1): 56 data bytes
64 bytes from 192.168.100.1: icmp_seq=0 ttl=255 time=1.514 ms

--- 192.168.100.1 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.514/1.514/1.514/0.000 ms

無事にtcpdumppingパケットをキャプチャできました。

20:30:09.153269 IP 192.168.100.22 > setup.netvolante.jp: ICMP echo request, id 17904, seq 0, length 64
    0x0000:  00a0 de7e fe22 a45e 60c6 cce3 0800 4500  ...~.".^`.....E.
    0x0010:  0054 bea1 0000 4001 729f c0a8 6416 c0a8  .T....@.r...d...
    0x0020:  6401 0800 3391 45f0 0000 5937 e3c1 0002  d...3.E...Y7....
    0x0030:  5680 0809 0a0b 0c0d 0e0f 1011 1213 1415  V...............
    0x0040:  1617 1819 1a1b 1c1d 1e1f 2021 2223 2425  ...........!"#$%
    0x0050:  2627 2829 2a2b 2c2d 2e2f 3031 3233 3435  &'()*+,-./012345
    0x0060:  3637                                     67
20:30:09.154718 IP setup.netvolante.jp > 192.168.100.22: ICMP echo reply, id 17904, seq 0, length 64
    0x0000:  a45e 60c6 cce3 00a0 de7e fe22 0800 4500  .^`......~."..E.
    0x0010:  0054 f5bf 0000 ff01 7c80 c0a8 6401 c0a8  .T......|...d...
    0x0020:  6416 0000 3b91 45f0 0000 5937 e3c1 0002  d...;.E...Y7....
    0x0030:  5680 0809 0a0b 0c0d 0e0f 1011 1213 1415  V...............
    0x0040:  1617 1819 1a1b 1c1d 1e1f 2021 2223 2425  ...........!"#$%
    0x0050:  2627 2829 2a2b 2c2d 2e2f 3031 3233 3435  &'()*+,-./012345
    0x0060:  3637                                     67

パケットの先頭14byteはイーサネットヘッダで、送信元と送信先MACアドレスが書かれているはずです。 というわけで、ifconfigコマンドで自分のMACアドレスを調べてみると、

>ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether a4:5e:60:c6:cc:e3 
    inet6 fe80::a65e:60ff:fec6:cce3%en0 prefixlen 64 scopeid 0x4 
    inet 192.168.100.22 netmask 0xffffff00 broadcast 192.168.100.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    status: active

MACアドレスa4:5e:60:c6:cc:e3が書かれてることが確認できました。

イーサネットヘッダの次は、IPヘッダ20byteが、その後にICMPメッセージ64byteが配置されます。 RequestとReplyのパケットを見てみると、先頭から35byte目に、 ICMPのタイプコード 8'h08(echo request)と8'h00(echo reply)がそれぞれ配置されているのがわかります。

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

以前メルカリで買ったまま積読していた「マスタリングTCP/IP入門編」を読み始めました。 ちょっと手を広げすぎた感がありますが、ゆっくり消化していこうと思います。