TCP通信の基本として、データを送受信する前に、コネクション確立と終了のシーケンスを確認します。
TCPコネクション開始時
TCPの場合、データを送受信する前に、コネクションを確立します。これには3回のやりとりがあるので、スリーウェイハンドシェイク(3-Way-Handshake)と呼ばれます。
まず、通信を開始したい方(クライアント)が、SYNビットを立てて、送信します。

これに対して、サーバはクライアントからのSYNを受け入れる場合は、Acknowledgement(ACK)のビットを立てて返します。また、サーバもTCP通信を開始したいので、端末へSYNビットを立てる必要があります。これをSYN+ACKという形で、1パケット内で返します。

端末は、サーバからのSYNを受け入れる場合は、ACKのビットを立てて返します。この3回のやりとりで、データ通信前のコネクションが確立されます。

TCPコネクション終了時
コネクションを閉じる時は、閉じたい方からFINビットを立てて送信します。

サーバからもコネクションを切断する必要があるので、端末へのAckと合わせてサーバからのFINも立てて送信します

サーバからのFINに対してAckを立てて返します。

これで、完全にコネクションが終了します。 コネクション終了の動作は、アプリによっては、FIN+ACKではなく、FINとACKを別々のパケットで送信する場合もよくあります。
コメント