TCP通信の基本として、データを送受信する前に、コネクション確立と終了のシーケンスを確認します。
TCPコネクション開始時
TCPの場合、データを送受信する前に、コネクションを確立します。これには3回のやりとりがあるので、スリーウェイハンドシェイク(3-Way-Handshake)と呼ばれます。
まず、通信を開始したい方(クライアント)が、SYNビットを立てて、送信します。
![](https://hirotanoblog.com/wp-content/uploads/2020/07/4ABC3E47-23C3-4BD0-8A3E-54AB2610EBCC.png)
これに対して、サーバはクライアントからのSYNを受け入れる場合は、Acknowledgement(ACK)のビットを立てて返します。また、サーバもTCP通信を開始したいので、端末へSYNビットを立てる必要があります。これをSYN+ACKという形で、1パケット内で返します。
![](https://hirotanoblog.com/wp-content/uploads/2020/07/DA24DA07-59ED-48FE-BE5F-BBE424181B27.png)
端末は、サーバからのSYNを受け入れる場合は、ACKのビットを立てて返します。この3回のやりとりで、データ通信前のコネクションが確立されます。
![](https://hirotanoblog.com/wp-content/uploads/2020/07/9F9EA3A5-BC7E-4310-A941-1FF84ADD3192.png)
TCPコネクション終了時
コネクションを閉じる時は、閉じたい方からFINビットを立てて送信します。
![](https://hirotanoblog.com/wp-content/uploads/2020/07/9679BDB0-5464-4787-8D6C-637486A0DA25.png)
サーバからもコネクションを切断する必要があるので、端末へのAckと合わせてサーバからのFINも立てて送信します
![](https://hirotanoblog.com/wp-content/uploads/2020/07/DE295AEA-0D60-4BDC-AD0F-E20B7E866B0B.png)
サーバからのFINに対してAckを立てて返します。
![](https://hirotanoblog.com/wp-content/uploads/2020/07/D6180150-89D8-49EE-A919-467CA20DC90C.png)
これで、完全にコネクションが終了します。 コネクション終了の動作は、アプリによっては、FIN+ACKではなく、FINとACKを別々のパケットで送信する場合もよくあります。
コメント