今回は、通信を成立させるまでの、
通信フローを見ていく。
〇TCP 3Wayハンドシェーク
キャプチャデータをTCPの送信元ポート番号でフィルタ
(IPアドレスや宛先ポートで絞ると、
その相手との別の通信も表示される。
特定の通信の一連の流れを見たいときは、
送信元ポート番号で絞るのがいい。)
フィルタバーに”tcp.port==*****”と入力してEnter
・Syn
クライアント→サーバー
コネクションを張ろうというリクエスト
・Syn, Ack
サーバー→クライアント
コネクションを張ろうというリクエスト
&↑のリクエストに対する了解
・Ack
↑のリクエストに対する了解
この、3Wayハンドシェークによって、
サーバーのポート80番と、
クライアントのポート51901番で、
データをやり取りすることが決まった。
それから、GETリクエストが送られた後、
サーバーからデータを送っては、
クライアントから「Ack」を返すやり取りを何度かしていて、
最後に、”HTTP 200 OK”レスポンスが送られて、
通信が完了しています。
本当は通信が完了したら、 ハンドシェークを閉じる
fin-ackのやり取りがあるけど、
今回はそこまで取れなかったので割愛。
〇DNS
いわゆる名前解決。
URL(ホスト名)からIPアドレスを問い合わせるプロトコル。
フィルタバーに”dns”と入力してEnter
(dnsのパケットが多くてわかりにくいときは、
“dns.qry.name==(対象のホスト名)”と入力すると、
対象のホスト名の名前解決の通信だけに絞れる。)
●リクエスト
ひとまず押さえておきたいところはここだけ。
・query
DNSレコードの、ホスト名・タイプ・クラス。
今回は、Aレコードなので、
ホスト名に対するIPアドレスを要求。
DNSレコードについては↓を参照
https://qiita.com/naoki_mochizuki/items/d90c1fdd5b25c0136a69
●リプライ
問い合わせたホスト名の
IPアドレスが返答される。
※ちなみに、DNSは一度解決すると、一定時間キャッシュするので、
キャッシュが残っている場合は通信前に改めて実施する必要なし。
〇ARP
宛先/NextHopのIPアドレスを持つホスト(インターフェイス)の
MACアドレスを問い合わせるプロトコル。
●リクエスト
(重要なとこ、黒塗りですいません。念のため。)
対象IPアドレスに対応するMACアドレスを、
ブロードキャストで問い合わせる。
・Terget IP address
対象のIPアドレス
セグメント内の通信の場合は、
これからしたい通信の宛先IPアドレス。
外部セグメントに対する通信の場合は、
NextHopのIPアドレス。
●リプライ
・Sender MAC address
リクエストの対象IPアドレスを持つホストは、
自分のMACアドレスを入れて返す。
※ちなみに、ARPもキャッシュするので、
キャッシュが残っている場合は省略される。