TCPの3ウェイハンドシェイクとは? SYN、ACKパケットとは?
TCPはOSIモデルに基づくトランスポート層プロトコルの実装例の1つであることがわかっています。 これは、リモートの相手にデータを送信する前に、TCPクライアントがパケットベースの基礎的なIPネットワーク上で仮想接続を設定することを意味しています。 三者間ハンドシェイクは、接続設定を行うためのプロトコル手順です。 ここでは、tcpの接続設定手順を詳しく説明します。 まず最初の疑問は、TCP接続の開始は誰が行うのかということです。 プロトコル層自身が起動時に行うのか、それとも他の外部のエンティティが層に接続を指示するのか? 答えは、TCPユーザーがTCPの三者間ハンドシェイクを開始する責任があるということです。 例えば、HTTP(ウェブブラウザはHTTPを使用します)は、TCPのユーザーの1つです。 HTTPユーザは、リモートサーバにWebリクエストを送信する必要があります。 ユーザーデータを送信する前に、HTTPはリモートサーバーとの接続を行うようにTCPに要求します。 TCP層が接続要求を受け取ると、TCPの3ウェイハンドシェイクを開始します。 他のプロトコルと同様に、3ウェイハンドシェイクの手順では、クライアントとサーバーの間でパケットやメッセージを交換する必要があります。
以下は三者間ハンドシェイクのメッセージフローです。
HTTPのユーザーは、TCP層に接続要求を出します。 TCP層はtcpクライアントとして動作し、初期シーケンス番号を持つtcpシンを送信します。 シーケンス番号は、メッセージの順序付けを維持するためのものです。 SYNを受信すると、サーバーは新しいSYNと受信したSYNのACKをクライアントに送信し、次にクライアントはサーバーから受信したSYNに対するACKをサーバーに送信します。 これで接続設定は完了です。
これは、クライアントからサーバーへの最初のパケットです。
これはクライアントからサーバーへの最初のパケットです。TCPメッセージではSYNフラグが1に設定されているため、TCPメッセージはSYNパケットとなります。
TCP SYN ACK packet:
SYNパケットを受信した後、サーバーはクライアントにSYN ACKパケットを送信します。 synのシーケンス番号は、サーバーが接続を受け入れる際の初期シーケンス番号です。 ackの部分は、クライアントのシーケンス番号に1を加えたものです。
TCP ACK packet:
接続設定の最後のパケットはtcp ackです。 クライアントは、サーバーからのtcp syn ackを受信すると、tcp ackパケットを送信します。
TCP user indication after three way handshake :
最初に、接続要求を開始するのはユーザーであることを説明しました。 しかし、ユーザーはどのようにして接続が完了したことを知るのでしょうか? また、ユーザーはその接続を使用してリモート サーバーにデータを送信できますか? ユーザーは、TCPレイヤーから接続セットアップの結果についての指示を受け取ります。 ハンドシェイクが成功した場合は、接続識別子を取得します。 そうでない場合はエラーとなります。 接続識別子は、サーバーとの間でデータを送受信するためのハンドラーとして働きます。 TCPクライアント/サーバーの正確な実装については、別の記事で紹介します。そうすれば、接続ハンドラのより明確なイメージを得ることができます。