3ウェイ・ハンドシェイクについて


3ウェイ・ハンドシェイク

TCP通信を行う際に接続を確立する為に用いられる手段

相手と自分の双方が通信が可能である事を認識するのがゴール

3ウェイ・ハンドシェイクの手順

  1. 通信要求者(クライアント)が相手(サーバ)に対して、通信を要求するSYNパケットを送信する
  2. SYNパケットを受け取ったサーバはクライアントに対して、通信を許可するSYN ACKパケットを送信する
  3. SYN ACKパケットを受け取ったクライアントはサーバに対して、接続開始をするACKパケットを送信する

TCPプロトコルの内部ステート

TCPではオープン/クローズ、通信が確立する状態を持っている。

TCPの状態や状態遷移は上記の記事の通りである。

Linuxでは、include/net/tcp_states.hにステートが定義されている

3ウェイ・ハンドシェイクとステート

  1. 初期状態
    • クライアント: CLOSED
    • サーバ: LISTEN
  2. 通信要求者(クライアント)が相手(サーバ)に対して、通信を要求するSYNパケットを送信する
    • クライアント: SYN_SENT
    • サーバ: LISTEN
  3. SYNパケットを受け取ったサーバはクライアントに対して、通信を許可するSYN ACKパケットを送信する
    • クライアント: SYN_SENT
    • サーバ: SYN_RECEIVED
  4. SYN ACKパケットを受け取ったクライアントはサーバに対して、接続開始をするACKパケットを送信しコネクションを確立する
    • クライアント: ESTABLISHED
    • サーバ: SYN_RECEIVED
  5. ACKパケットを受け取ったサーバは、コネクションを確立する
    • クライアント: ESTABLISHED
    • サーバ: ESTABLISHED

参考文献