TCP 3ウェイハンドシェイクと4ウェイハンドシェイク

公開日: 2026-07-30 20:19 更新日: 2026-07-30 20:19 1812文字 10 min read ... ページビュー

この記事では、TCPプロトコルの3ウェイハンドシェイクと4ウェイハンドシェイクの手順を詳しく説明します。3つのハンドシェイクは接続を確立するために使用され、双方の初期シーケンス番号を同期し、通信能力を確認することによって、接続の信頼性を確保します。4つのハンドシェイクは接続を閉じるために使用され、TCPは全二重プロトコルであるため、2方向の送信をそれぞれ閉じ、データの完全な送信と接続の適切な解放を確保する必要があります。このプロセスには、シーケンス番号、確認番号、フラグビットなどのキーフィールドが含まれ、アクティブクローズ当事者は、接続が完全に解放され、古い接続メッセージが新しい接続に干渉しないようにするために、TIME-WAITステータスを待つ必要があります。

TCP 3ウェイハンドシェイクと4ウェイハンドシェイク

TCPは、接続指向のトランスポート層プロトコルです。通信当事者はアプリケーションデータを送信する前に3つのハンドシェイクを介して接続を確立する必要があり、データ転送が終了すると、通常は4つのセグメントを介して双方向接続が解放される。

TCPヘッダの関連フィールド

image-001
image-001

シリアル番号seq

シリアル番号フィールドは32ビットを占める。TCPはバイトストリーム内のデータに番号を付け、セグメント内のシーケンス番号は通常、そのセグメントが運ぶデータの最初のバイト番号を表します。

接続が確立されると、通信の両当事者はそれぞれ初期シーケンス番号を選択します。SYNFINは、アプリケーションデータを運ばなくても、それぞれシリアル番号を消費します。

確認番号ack

確認番号フィールドは32ビットであり、受信側が受信することを期待する次のバイト番号を示します。

例えば、相手番号100から199のデータを正しく受信した、番号は通常200となる。

ACKマーク

ACK1位を占めている。ACK1の場合、確認番号フィールドは有効である。コネクションが確立されると、ほとんどのTCPセグメントはこのフラグを設定します。

区別が必要:

  • 小文字のackは、通常、確認番号フィールドの値を示します。
  • 大文字のACKは、TCPヘッダの確認ビットを表します。

SYNマークアップ

SYNは、接続を確立し、双方の初期シーケンス番号を同期するために使用される。

  • SYN=1ACK=0:通常は接続要求を表します。
  • SYN=1ACK=1:通常、接続を確立し、相手の要求を確認することに同意します。

FINマーク

FINは、送信者が送信するデータがないことを示し、現在の方向の接続を閉じるよう要求します。TCPは全二重プロトコルであるため、一方の方向がオフになっても、もう一方の方向はデータを送信し続けることができます。

3 回の握手

image-002
image-002

クライアントの初期シリアル番号をx、サーバの初期シリアル番号をyとする。

最初のハンドシェイク:クライアントはSYNを送信します

クライアントがサーバに接続要求を送信するには:

SYN=1, seq=x

送信後、クライアントはCLOSEDからSYN-SENT状態に入る。

2 回目のハンドシェイクサーバがSYN+ACKを送信

サーバはクライアントからの要求を受信した後、クライアントのシーケンス番号を確認し、独自の初期シーケンス番号を送信します。

SYN=1, ACK=1, seq=y, ack=x+1

送信后,サーバはLISTENからSYN-RECEIVEDに入る.

3 回目のハンドシェイククライアントがACKを送信

クライアントはサーバーからの応答を受信した後、確認メッセージを送信します。

ACK=1, seq=x+1, ack=y+1

サーバがこの確認を受信すると、双方はESTABLISHED状態に入り、アプリケーションデータを転送できる。

3 番目のハンドシェイクの純粋なACKメッセージは、データを運ばない場合、追加のシリアル番号を消費しません。

なぜ3 回握手するのか

3つの握手は主に以下のことを成し遂げます。

  • 双方の送信能力と受信能力がほぼ正常であることをする。
  • 双方のそれぞれの初期シーケンス番号を同期する.
  • 古い接続要求の無効化を回避してください。
  • 最大セグメント長やウィンドウ拡大係数などのTCPオプションをネゴシエーションします。

2 回のやりとりしか行われない場合、サーバはクライアントがサーバから最初のシーケンス番号と接続確認を受信したことを確認できないため、3 回目の確認が必要になります。

4つの波

image-003
image-003

次に、クライアントがアクティブに接続を閉じる例を示します。クライアントがFINを送信したときのシリアル番号をuとし、サーバの現在のシリアル番号をvとします。

最初の波:クライアントがFINを送信

クライアントは、送信するデータがないことを示します。

FIN=1, ACK=1, seq=u

クライアントはFIN-WAIT-1に入ります。FINはシリアル番号を消費する。

2 回目の手振り:サーバはクライアントのFINをする

サーバはFINを受信した后、を送信します。

ACK=1, seq=v, ack=u+1

サーバはCLOSE-WAIT状態に入り、クライアントは確認を受けてFIN-WAIT-2状態に入ります。

この時点で、クライアントからサーバへの方向はシャットダウンされていますが、サーバからクライアントへの送信はまだ完了していないデータの転送を続けることができます。この状態は半シャットダウンと呼ばれます。

3 回目の手:サーバはFINを送信

サーバは残りのデータの送信を完了すると、自分の送信方向を閉じるように要求する。この時点で、サーバのシリアル番号がwであると仮定します。

FIN=1, ACK=1, seq=w, ack=u+1

サーバはLAST-ACKに入り、クライアントのを待つ。

4 回目の波:クライアントがサーバのFINを確認

クライアントはサーバのFINを受信した後、確認を送信します。

ACK=1, seq=u+1, ack=w+1

クライアントがTIME-WAITになる。サーバはこのを受け取るとCLOになる.

なぜ通常 4 回必要なのか

TCPの2つの転送方向は別々に閉じる必要がある。アクティブクローズ側がFINを送信した後,パッシブクローズ側はまだ送信するデータがある可能性があるため,通常は相手側のFINを個別に確認し,残りのデータが送信された後に自分のFINを送信する.

パッシブクロージャが送信するデータがないFINを受信した場合、ACKを自身のFINと同じセグメントにマージすることもできます。この時点で、ネットワーク上で見られるセグメントの数は4つ未満かもしれませんが、接続解放ロジックには両方の方向のクローズと確認が含まれます。

TIME-WAITの状態

アクティブシャットダウン側は通常、TIME-WAIT状態で2MSLを待機します。MSLは、ネットワーク内のセグメントの最大生存時間を示します。

待機する主な理由は2つあります。

  • 最後のACKが失われた場合、パッシブクロージャはFINを再送信し、アクティブクロージャは再確認できます。
  • 現在の接続によって生成された遅延メッセージをネットワークから消え、同じクワッドを使用して作成される新しい接続に影響を与えません。

TIME-WAITはTCPが信頼性の高いシャットダウンを保証するための重要なメカニズムであり、プログラム例外とは同等ではない。

共通状態の概要

状態意味
LISTENサーバ接続要求のリスニング{{さーばせつぞくりすと}}
SYN-SENTクライアントが接続要求を送信しました
SYN-RECEIVEDサーバは要求を受信し、最終確認を待っています
ESTABLISHED接続が確立。
FIN-WAIT-1アクティブクローズ側はFINを送信しました。確認待ちです。
FIN-WAIT-2アクティブクローズ側は確認を受けて、相手のFINを待つ
CLOSE-WAIT受動的閉鎖側は相手のFINを確認し、適用を待って接続を閉じる
LAST-ACKパッシブクローズ側は自分のFINを送信し、最終確認を待つ
TIME-WAITアクティブシャットダウン側待機2MSL
CLOSED接続は閉じた。

気に入ったならばコメントを残してくださいね~

... ページビュー
© 2026 跨越星轨的客 @Hoshiumi
Powered by theme astro-koharu · Inspired by Shoka