3ウェイ・
ハンドシェイク(スリーウェイ
ハンドシェイク, three-way handshaking)は、TCP(
Transmission Control Protocol)などのプロトコルで用いられる、通信における接続(コネクション)を確立するための重要な手順です。この手順によって、データの送受信を行う前に、双方向の通信準備が整えられます。
概要
3ウェイ・
ハンドシェイクは、以下の3つのステップで構成されます。
1.
SYNパケットの送信: 通信を開始したいクライアント(要求者)は、まずサーバー(通信相手)に対してSYN(Synchronize)パケットを送信します。このSYNパケットには、ランダムな値であるシーケンス番号(順序番号)が含まれています。
2.
SYN-ACKパケットの送信: SYNパケットを受信したサーバーは、クライアントからの接続要求を受け入れる準備をします。サーバーは、クライアントに対してSYN-ACK(Synchronize Acknowledge)パケットを送信します。このパケットには、クライアントから受信したシーケンス番号に1を加えた確認応答番号(ACK番号)と、サーバー側で生成したランダムなシーケンス番号が含まれています。また、サーバーは接続を維持するための情報を保持する領域を確保します。
3.
ACKパケットの送信: SYN-ACKパケットを受信したクライアントは、接続の確立を完了するために、サーバーに対してACK(Acknowledge)パケットを送信します。このパケットには、サーバーから受信したシーケンス番号に1を加えた確認応答番号(ACK番号)が含まれており、これによってサーバーは接続が確立されたことを確認します。このステップで、クライアントとサーバーの間での通信が開始可能となります。
TCPは、信頼性の高い通信を実現するために、この3ウェイ・
ハンドシェイクを必ず行います。そのため、TCPを利用するアプリケーションは、明示的に3ウェイ・
ハンドシェイクを実装する必要はありません。TCP層が自動的にこの処理を行います。
一方、UDP(User Datagram Protocol)は、コネクションレス型のプロトコルであり、3ウェイ・
ハンドシェイクのような接続確立の手順は標準では行いません。しかし、UDPをベースとした上位プロトコル、例えばSIP(
Session Initiation Protocol)では、通信の信頼性を高めるために、3ウェイ・
ハンドシェイクと同様のメカニズムが用いられることがあります。SIPでは、INVITEメッセージがSYNパケットに、200 OKメッセージがSYN-ACKパケットに、ACKメッセージがACKパケットに相当します。
用語解説
SYN (Synchronize): 接続を要求するパケット。通信を開始するための同期信号。
ACK (Acknowledge): 確認応答パケット。受信側が正常にデータを受信したことを送信側に通知する。
関連事項
TCP (Transmission Control Protocol): 信頼性の高いコネクション型通信を提供するプロトコル。
SIP (Session Initiation Protocol): VoIP(Voice over IP)などで利用されるセッション制御プロトコル。
SYN flood: SYNパケットを大量に送信するDoS攻撃。3ウェイ・ハンドシェイクの仕組みを悪用した攻撃手法。
ハンドシェイク: 通信における接続確立や認証などの手順。
ラウンドトリップタイム: データが送信されてから応答が返ってくるまでの時間。
肯定応答 (ACK): データの正常な受信を知らせる信号。
ウィンドウサイズ: 送信側が一度に送信できるデータ量。フロー制御に使用される。
スライディングウィンドウ: 送信ウィンドウを動的に制御する方式。効率的なデータ転送を実現する。
*
フロー制御: データの送受信速度を調整し、受信側の処理能力を超えないようにするメカニズム。