TCPの3ウェイハンドシェイク

技術の仕組み | ネットワークの基礎

← 技術の仕組み

TCPは、データを送り始める前に3手の握手(SYN → SYN/ACK → ACK)で「お互い送受信できる状態か」を確認してから通信を始めます。この一手間があるから、順序の保証や欠けたデータの再送ができます。握手で作られた「つながっている状態」を理解すると、接続状態の判定・半開き・ファイアウォールの許可方向まで一本で追えます。

先に押さえる

TCPはコネクション型。いきなり本文を送らず、まず双方向に通信できることを確認します。「開けたい」の合図がSYN、「受け取った」の合図がACK。この2つを行き帰りでやり取りするので、握手は3手になります。

3手で「つながった」を作る

1SYN → SYN/ACK → ACK で確立
クライアント
① SYN:接続を開きたい(クライアント→サーバ)
② SYN/ACK:いいよ+こちらも開きたい(サーバ→クライアント)
③ ACK:確認。ここから通信開始/確立(クライアント→サーバ)
サーバ

3手が終わると接続は確立(ESTABLISHED)状態になり、以降はデータをやり取りします。終わるときはFINで後片付けします。「開ける手順」と「開いた状態」があるのがTCPの特徴です。

動きで見る

番号順に追うと、SYN → SYN/ACK → ACKの3手で「お互い送受信できる」を確認し、つながった状態(ESTABLISHED)を作る流れが見えます。(図は横スクロールできます)

SC向け:番号の仕組みで「順序保証と再送」を見る

確立の3手は、じつはお互いの開始番号(シーケンス番号)を教え合う手順でもあります。番号順に追うと、確認応答番号=「次に期待する番号」欠け・順序を検知して再送する仕組みが見えます。(番号は説明用の例。実際のISNは毎回ランダム。図は横スクロールできます)

ポイントは①〜③で番号を合わせ、④⑤以降は「送ったバイト数」で番号が進むこと。確認応答番号(ack)=相手に次に送ってほしい番号なので、抜けた所の番号が返り続ければ再送が起きます。SCでは「シーケンス番号/確認応答番号が何を表すか」「再送・順序保証の根拠」がそのまま問われます。

切断も手順がある(FIN・4手のクローズ)

閉じるときは両方向で「もう送らない(FIN)」を1回ずつ宣言します。だから確立は3手・切断は4手。片方だけ閉じて反対方向は送り続けられるハーフクローズも見えます。(図は横スクロールできます)

覚えどころは「開けるSYNは相乗り(SYN+ACKで2手ぶんを1つに)できるが、閉じるFINは各方向で独立」=だから確立3手・切断4手。TIME-WAITで終端がすぐ消えないこと、片方向だけ閉じるハーフクローズがあることも状態の理解につながります。

SYNフラッド:半開きを大量に作る攻撃

確立の途中(②SYN/ACKを送って③ACKを待つ間)の状態が半開き(ハーフオープン)です。サーバはこの間、接続情報を待ち行列(バックログ)に確保して待ちます。

何が起きるか

  • 送信元を詐称したSYNだけを大量に送りつける
  • ③ACKを返さないので半開きがどんどん溜まる
  • 待ち行列が埋まり、正規の接続を受け付けられない=サービス妨害(DoS)

効く手当て

  • ③ACKが来るまで接続情報を保持しないSYNクッキー
  • 待ち行列の拡大、確立途中の接続を短い時間で破棄
  • 上流での大量SYNの検知・遮断

核は「確立を"完了させない"ことで資源を枯らす」攻撃だという点。半開き=確立の前後を分けて考えると、なぜSYNだけで成立するのか、なぜSYNクッキーが効くのかが読めます。

見抜きどころ

核は「送る前に双方の準備を確認してつながった状態を作る」。設問では「なぜ握手が要るか(=順序保証・再送の前提)」「接続が確立済みか(状態の判定)」「SYNだけ大量に送られる攻撃(SYNフラッド)」が問われます。状態を持つ通信だと掴むと、状態を悪用する攻撃や状態で許可する制御が読めます。

つまずきやすい

UDPには握手も状態もありません(送りっぱなし)。TCPは状態を持つので、ファイアウォールは「内から始めた通信の戻りか」を状態で見て許可できます(ステートフル)。また、握手の途中で放置される半開き(ハーフオープン)を大量に作るのがSYNフラッド。「確立の前後」を分けて考えるのが急所です。

この仕組みを使う設問