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を別々のパケットで送信する場合もよくあります。
コメント
とても分かりやすかったです、ありがとうございます。
一点、TCPコネクション終了時 の冒頭で
“閉じたい方から”
とありますが、Server 側から能動的に閉じることも可能なのでしょうか。
その場合は、Server -FIN> Client ➡ Client -ACK> Server で完結、でしょうか。
大変お忙しい中お手数で誠に恐縮ながら、教えて頂けますと幸いです。
よろしくお願い申し上げます。