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

シリアル番号seq
シリアル番号フィールドは32ビットを占める。TCPはバイトストリーム内のデータに番号を付け、セグメント内のシーケンス番号は通常、そのセグメントが運ぶデータの最初のバイト番号を表します。
接続が確立されると、通信の両当事者はそれぞれ初期シーケンス番号を選択します。SYNとFINは、アプリケーションデータを運ばなくても、それぞれシリアル番号を消費します。
確認番号ack
確認番号フィールドは32ビットであり、受信側が受信することを期待する次のバイト番号を示します。
例えば、相手番号100から199のデータを正しく受信した、番号は通常200となる。
ACKマーク
ACKは1位を占めている。ACKが1の場合、確認番号フィールドは有効である。コネクションが確立されると、ほとんどのTCPセグメントはこのフラグを設定します。
区別が必要:
- 小文字の
ackは、通常、確認番号フィールドの値を示します。 - 大文字の
ACKは、TCPヘッダの確認ビットを表します。
SYNマークアップ
SYNは、接続を確立し、双方の初期シーケンス番号を同期するために使用される。
SYN=1、ACK=0:通常は接続要求を表します。SYN=1、ACK=1:通常、接続を確立し、相手の要求を確認することに同意します。
FINマーク
FINは、送信者が送信するデータがないことを示し、現在の方向の接続を閉じるよう要求します。TCPは全二重プロトコルであるため、一方の方向がオフになっても、もう一方の方向はデータを送信し続けることができます。
3 回の握手

クライアントの初期シリアル番号を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つの波

次に、クライアントがアクティブに接続を閉じる例を示します。クライアントが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 | 接続は閉じた。 |
気に入ったならばコメントを残してくださいね~