2017/3/6

Wiresharkで3ウェイハンドシェイクを見てみよう!


はじめに

クライアント:mac(192.168.10.2) サーバ:mio.yokohama(202.181.99.77) クライアントからサーバへのコネクション確立をクラアントのWiresharkでキャプチャしたパケットから確認します。

3ウェイハンドシェイク

TCPでは通信をするために、コネクションを確立するコネクション型通信をします。 コネクション確立するために行うのが、3ウェイハンドシェイクです。 これは、コネクション確立要求パケットとそれに対する応答確認パケットのやり取りを3回行うことから名付けられた方法です。 コネクション確立要求パケットをSYN(Synchronize)、確認応答パケットをACK(Acknowledge)といいます。 コネクションが確立すると、クライアントとサーバの間にVC(virtual circuit)が作られ、お互いは下位層通信プロトコルを意識せずに、VCにデータを投入するだけで通信ができます。

パケット

Wiresharkでは関係のない通信のパケットもキャプチャして見辛いので、今回はサーバのアドレス(202.181.99.777)との通信のみを表示するように、表示フィルタにip.addr == 202.181.99.77 を設定しています。 これがキャプチャしたパケットです。 3ウェイハンドシェイクは冒頭の3パケットで行われています。 3ウェイハンドシェイクの部分です。 No1,2,3がそれぞれSYN,ACK/SYN.ACKです。 それぞれのパケットのTCP制御フラグを見ていきます。

①接続要求

SYNフラグのみ有効になっています。 サーバはこのパケットを受け取ると、コネクション確立のために、メモリなどのリソースを確保します。 コネクション確立の準備ができたら、クライアントへの応答と、サーバからの接続要求をまとめた②SYN/ACKパケットを送ります。 ちなみに、悪意ある攻撃者がわざとSYNパケットを大量に送ってACKパケットを返さずにサーバのリソースを無駄に消費させる攻撃がSYN Flood Atackです。

② ①に対する応答/接続要求

SYNパケットを受け取ったサーバは、クライアントにその応答と、サーバからクライアントへの接続要求を送ります。これがSYN/ACKパケットです。

③ ②に対する応答

最後にサーバからSYN/ACKパケットを受け取ったクライアントが応答のACKパケットを返して、コネクションが確立されます。 コネクションが確立された後は通信が開始され、通信が終了したら、再び3ウェイハンドシェイクを行いコネクションを切断します。

参考

toshihirock|Wiresharkを使ってHTTPリクエストを見てみた ネットワークエンジニアとして|TCP/IP - TCP Window Control / Flow Control