3way ハンドシェイクとは

3way ハンドシェイクとはHTTPの下のレイヤーのプロトコルであるTCP/IPで用いられる通信開始前の情報交換です

名前の通り、クライアントとサーバーとの間で3回の通信が発生します

通信開始時

step1. クライアントからサーバーへ通信を開始することを伝える

まずはクライアントからサーバーへSYNというメッセージを送ります

SYNは今から通信を開始するということを伝えます

step2. サーバーからクライアントへ受信をすることと、サーバーからも通信することを伝える

クライアントからSYNというメッセージを受け取ったサーバーは、クライアントにSYNとACKというメッセージを送ります

ACKはクライアントから送られてきたSYNに対して、サーバー側で許可する (通信を受信をした)ことをクライアントに伝えます

SYNは先ほどと同様に今から通信を開始することを伝えます

今回はサーバー側からクライアントへも通信を開始するということをクライアントに伝えます

step3 クライアントからサーバーへ受信をすることを伝える

最後にクライアントからサーバーへACKを送り、サーバーからの通信を受信したことを伝えます

これでクライアントとサーバーでお互いにデータを送受信するための接続が確立されました

通信終了時

通信終了時は4回のやりとりが発生します

step1 クライアントからサーバーや通信を終了することを伝える

クライアントはサーバーからデータを受け取り、もう通信する必要はないなという状態になると

データを受信したことを伝えるACKと、通信を終了することを伝えるFINというメッセージを送ります

step2 サーバーが通信終了を確認したことを伝える

サーバーはFINメッセージを受け取ると、受信したことを伝えるためにACKメッセージを送ります

step3 サーバーからも通信を終了することを伝える

サーバからもFINメッセージをクライアントに送り、通信を終了することを伝えます

step4 クライアントが通信終了を確認したことを伝える

クライアントからACKメッセージをサーバーに送り、メッセージを受信したことを伝えます

Keep-Aliveについて

HTTP/1.1からはKeep-Aliveという機能がデフォルトになっています

Keep-Aliveを使うと連続したリクエストをする場合にすでにある接続を再利用することができます

Keep-Aliveなしの場合ではリクエストごとに通信が閉じるため、連続してリクエストを送る場合もその都度上で説明した3way ハンドシェイクを行いコネクションを貼る必要があります

そのため、毎度毎度3回のサーバーとクライアントで3回のやりとりをしてからデータの通信が始まります

Keep-Aliveありの場合では一度貼ったコネクションを連続して使えるため、今まで何回も行っていたハンドシェイクを行わなくてよくなり、その分通信速度が速くなります

感想

レイヤーが低くなっていくとどんどんわからないことが増えていく

下のサイトが図と一緒に説明してくれているのでわかりやすいです

参考

TCP 3-Way Handshake (SYN, SYN-ACK,ACK)

【TCP】コネクションの確立までの道のり - Qiita

TCP/IP - TCP 3ウェイハンドシェイク