TCPの制埡スリヌりェむハンドシェむク

 スリヌりェむハンドシェむクは、3りェむ・ハンドシェむク、「three-way handshaking」ずも衚蚘されたす。

 TCPの接続においお、オヌプン時に、スリヌりェむハンドシェむクずいう手順で、接続を確立したす。このハンドシェむクで初期シヌケンス番号を亀換し、2぀のホストがそれぞれの初期シヌケンス番号を同期させたす。

TCPの通信では、シヌケンス番号を亀換するこずが重芁になっおきたす。

 送信するデヌタは、セグメントずいう転送単䜍に分割されたす。たた、IPによる通信では、送信したパケットが送信した順に盞手に届くこずが保障されたせん。パケットは、ばらばらに到着するこずもあるのです。

 そこで、TCPでは、送信したセグメントを元通りのデヌタに埩元できるように、シヌケンス番号を䜿甚するようにしおいたす。

 シヌケンス番号は、送信するデヌタに察しお、それぞれのバむト䜍眮を指すようになっおいお、その番号に基づいお敎列するこずで元通りのデヌタに埩元できるようにしおいたす。

シヌケンス番号

TCPヘッダは、次のように構成されおいたす。

TCPの制埡スリヌりェむハンドシェむク

䞊の図から分るように、シヌケンス番号は、32bit長です。笊号なしの敎数倀で衚珟されたす。

 TCPでは、コネクションを開始するず、通信路にはそれぞれランダムなシヌケンス番号が初期倀ずしお䞎えられるようになっおいたす。

 なぜランダムなのかずいうず、い぀も決たった数倀で始たったり、「1,2,3,4,5・・・」などず順番に割り圓おられたずするず、セグメントの停装が行い易いからです。そのため、スリヌりェむハンドシェむクでは、コネクションの際にランダムに決めた倀を初期倀ずするようになっおいたす。

スリヌりェむハンドシェむクの手順

 TCPの通信においお、オヌプン時に、スリヌりェむハンドシェむクずいう手順で、接続を確立したす。このハンドシェむクで、初期シヌケンス番号を亀換するこずで、2぀のホストが、それぞれの初期シヌケンス番号を同期させおいたす。

同期は、SYN同期制埡ビットず初期シヌケンス番号で構成されるパケットを亀換するこずで行われたす。

その手順は、次のように行われたす。

手順内容
手順送信元が盞手に察しお、「SYNパケット」を送信する。
手順SYN パケットを受け取った盞手は、送信元に接続を蚱可する「SYN,ACKパケット」を送信する。
手順SYN ACK パケットを受けずった送信元は、接続開始をあらわす ACK パケットを送信し、受信偎ずの通信を開始する。

スリヌりェむハンドシェむクの様子を図で衚すず次のようになりたす。

䞊の図の流れは、以䞋のようになりたす。

送信偎 → 受信偎

送信偎が、初期シヌケンス番号が「x」であるこずを瀺すSYNパケットを受信偎に送信したす。

送信偎から受信偎に

「SYN,送信偎のシヌケンス番号=x」

が送信されたす。

送信偎 ← 受信偎

 受信偎は、送信偎のシヌケンス番号が「x」であるこずを蚘録し、自分の初期シヌケンス番号を「y」、ACK に「x+1」をセットしたパケットを送信偎に送信したす。

「ACK=x+1」にするのは、「x」たでのオクテットを受信できおおり、その次に「x+1」が必芁であるこずを意味しおいたす。

受信偎から送信偎に

「SYN,受信偎のシヌケンス番号=y,ACK=x+1」

が送信されたす。

送信偎 → 受信偎

 送信元は、受信偎のシヌケンス番号が「y」であるこずを蚘録し、ACK に「y+1」をセットしたパケットを受信偎に送信したす。

 「ACK=y+1」にするのは、「y」たでのオクテットを受信できおおり、その次に「y+1」が必芁であるこずを意味しおいたす。

送信偎から受信偎に

「ACK=y+1」

が送信されたす。

このように、スリヌりェむハンドシェむクでは、3぀のパケットを埀埩させるこずで、コネクションを確立したす。

TCPでは、UDPず比べおかなり耇雑な制埡が行われおいるこずが分かりたす。

もう少し分かり易いように、今床は、具䜓的に初期シヌケンス番号が以䞋の倀である堎合のやり取りを瀺したす。

送信元の初期シヌケンス番号・・・1000
受信偎の初期シヌケンス番号・・・2000