前々回、うさちゃんへPingしてお返事をもらいました。今回はうさちゃんからPingしてみます。通信相手はRaspberry Pi 3 model B+です。うさちゃんからのPingにラズパイからお返事をしながら、その様子を「みんな大好き」Wiresharkで観察してみたいと思います。うさちゃんに書き込むコードはサンプルコードほぼそのままです。
※「うさちゃんと一緒」投稿順indexはこちら
前々回に使用したサンプルコードは、PingMe.cという分かり易いお名前でした。今回のは、PingYou.cです。これまたそのものズバリの御名前。ファイルは以下にあります。
~DCのインストールディレクトリ~\Samples\tcpip\icmp\PINGYOU.C
自分のIPアドレスの設定と、Ping先のアドレスの設定のため、上記ファイルに以下のマクロを追記する必要があります(IPアドレスはご自分の環境のものにしてくだされ。)
#define TCPCONFIG 1 #define _PRIMARY_STATIC_IP "192.168.xxx.xxx" #define _PRIMARY_NETMASK "255.255.255.0" #define MY_GATEWAY "192.168.xxx.xxx" #define MY_NAMESERVER "192.168.xxx.xxx" #define PINGWHO "192.168.xxx.xxx"
ファイル名は PINGYOUなのに、マクロ名はPINGWHOなのね、コマケー話だけれども。
実機動作の確認
コンパイルしてRabbit4000ボードにオブジェクトを書き込んで走らせれば、直ぐに10回のPingを発します。結果はRabbitの標準出力に書き出されてきます。こんな感じ。
Ping 100%成功しましたっと、うさちゃんより報告。しかし、うさちゃんからの報告を疑うわけではないのですが、いろいろ調べていくにはお道具も必要と。
まずはラズパイWireshark
最初は、定番中の定番、みんな大好きWiresharkですね。勿論、今回通信相手のRaspberry Pi 3(Raspberry Pi OS 32bit)にもインストールしてあります。
蛇足ですが、Wiresharkのスローガン?”Go Deep”、深く潜れ!という感じですかね。素人なのであまり深くは潜れる気もしないですが、うさちゃんと一緒にダイブして行きたいと思います。
うさちゃんからのPing期間に取得したキャプチャにまずは「表示フィルタ」かけているところがこちら。勿論、うさちゃんのEthernet MACアドレスを知っておかねばなりません。
上をみると、黄色っぽい行がアドレス解決のためのARPの通信。ピンク色っぽい行がPingの問いかけとお返事のICMPの通信です。
これまた定形的な処理ですが、うさちゃんとラズパイの間のやりとりをステップ・バイ・ステップにて見て行きたいと思います。
ARPその1
まずはPingする相手先のMACアドレスを知るために、うさちゃんがEthernetのブロードキャストアドレスに向かってARPパケット(request)を投げています。TargetのMACアドレスは不明なのでオールゼロです。
ARPその2
すると、ラズパイが、うさちゃんに向かってARP(reply)を返しています。Sender MACアドレスにラズパイのMACアドレスが書いてあるので、うさちゃんはMACアドレスを知ることができたはず。
ICMPその1
相手のMACアドレスを知ったうさちゃんは、今度はICMPのEcho(ping) requestを載せたパケットを、ラズパイのMACアドレスにむけて送出してます。
ICMPその2
うさちゃんのEcho(request)を受け取ったラズパイが、今度はEcho(reply)をうさちゃんに向けて返送してます。
目出度し、ということでPing成功(最初の1回しか見てないケド。)
Wiresharkがあればやりとりの観察はOK。あたりまえか。
次回以降、うさちゃん側にプロトコルを載せては、ラズパイ側からそのプロトコルを使うパケットを投げて様子を見たいと思います。そのためには、好き勝手にパケットを作るためのお道具も必要ですな。それはまた次回。