【初心者わかりやすく】TCP通信の確立と終了シーケンス

 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を別々のパケットで送信する場合もよくあります。

コメント

  1. LazyGrizzly より:

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