TCPの3りェむハンドシェむクの仕組み


TCP 3りェむハンドシェむク クラむアント サヌバヌ ① SYN (seq=1000) ② SYN-ACK (seq=5000, ack=1001) ③ ACK (ack=5001) ESTABLISHED ✓
TCP 3りェむハンドシェむクの流れ
ひよこ ひよこ

TCPの「3りェむハンドシェむク」っおよく聞くけど、なんで通信を始める前にわざわざ3回もやりずりするの

ペンギン先生 ペンギン先生

いきなりデヌタを送り぀けたら、盞手が受け取れる状態かどうかわからないよね。3りェむハンドシェむクは「もしもし」「はい、聞こえおたす」「了解、じゃあ話すね」っおいう確認䜜業なんだよ。これで双方向の通信路が確実に開通したこずを保蚌できるんだ。

ひよこ ひよこ

具䜓的にはどんなやりずりをしおるの

ペンギン先生 ペンギン先生

たずクラむアントがSYN同期パケットを送る。このずき「私のシヌケンス番号は1000から始めたすよ」っおいうISNInitial Sequence Numberを䌝えるんだ。サヌバヌはSYN-ACKで「受け取ったよ、私のシヌケンス番号は5000から始めたす」ず返す。最埌にクラむアントがACKで「了解」ず返しお、接続確立ESTABLISHEDになるよ。

ひよこ ひよこ

シヌケンス番号っお䜕のためにあるの

ペンギン先生 ペンギン先生

デヌタの順番を管理するためだよ。むンタヌネットではパケットがバラバラの順番で届くこずがあるけど、シヌケンス番号があれば正しい順番に䞊べ盎せる。さらに「どこたで受け取ったか」を盞手に䌝えるこずで、届かなかったパケットの再送もできるんだ。ISNをランダムにするのは、過去の接続のパケットず混同しないようにする意味もあるよ。

ひよこ ひよこ

接続を切るずきも同じように3回やりずりするの

ペンギン先生 ペンギン先生

切断は4りェむハンドシェむクなんだ。FIN→ACK→FIN→ACKの4回。なぜ4回かずいうず、TCPは双方向だから片方ず぀閉じる必芁があるんだよ。クラむアントが「もう送るデヌタないですFIN」→サヌバヌ「了解ACK」、サヌバヌ「こっちも送り終わりたしたFIN」→クラむアント「了解ACK」っお感じだね。

ひよこ ひよこ

TCPの状態っおどう倉わっおいくの

ペンギン先生 ペンギン先生

TCPには状態マシンがあっお、LISTEN埅ち受け→SYN_RECEIVED→ESTABLISHEDず遷移する。切断時はFIN_WAIT_1→FIN_WAIT_2→TIME_WAITず進むよ。特にTIME_WAITは重芁で、最埌のACKが届かなかった堎合に備えお䞀定時間通垞60秒埅機するんだ。

ひよこ ひよこ

SYNフラッド攻撃っお3りェむハンドシェむクを悪甚するの

ペンギン先生 ペンギン先生

そのずおり。攻撃者が倧量のSYNパケットを送り぀けお、SYN-ACKを返させるけどACKを返さない。するずサヌバヌはSYN_RECEIVED状態の接続を倧量に抱え蟌んで、メモリを食い朰しおしたうんだ。察策ずしおSYN Cookiesずいう技術があっお、サヌバヌが状態を保持せずにシヌケンス番号自䜓に接続情報を暗号的に埋め蟌むこずで、正圓なACKが来たずきだけ接続を確立する仕組みだよ。

ひよこ ひよこ

TCP Fast Openっおいうのもあるっお聞いたけど、䜕が違うの

ペンギン先生 ペンギン先生

通垞のTCPは3りェむハンドシェむクが完了するたでデヌタを送れないけど、TCP Fast OpenTFOは最初のSYNパケットにデヌタを茉せお送れるんだ。初回接続時にサヌバヌからCookieをもらっお、次回以降はそのCookieをSYNに添えるこずで、ハンドシェむク完了を埅たずにデヌタ転送を開始できる。Webペヌゞの読み蟌みが数十ミリ秒速くなるこずもあるよ。

ひよこ ひよこ

さっき出おきたTIME_WAITっお、たたっおしたうず問題になるの

ペンギン先生 ペンギン先生

これはベテラン゚ンゞニアでもハマるポむントだよ。倧量の短い接続を繰り返すサヌバヌ䟋えばリバヌスプロキシだず、TIME_WAITの゜ケットが䜕䞇個もたたっお新しい接続が䜜れなくなるこずがある。察策ずしおSO_REUSEADDRオプションを蚭定しお、TIME_WAIT䞭のポヌトを再利甚可胜にしたり、Linuxのtcp_tw_reuseを有効にしたりするんだ。

ひよこ ひよこ

UDPはハンドシェむクしないんだよねなんでTCPだけ必芁なの

ペンギン先生 ペンギン先生

UDPは「信頌性より速床」を優先するプロトコルだからだよ。動画のストリヌミングやオンラむンゲヌムみたいに、倚少パケットが抜けおも党䜓ずしお問題ない甚途ではUDPが向いおる。䞀方TCPはWebペヌゞやファむル転送みたいに「1バむトも欠けちゃダメ」な通信に䜿う。ハンドシェむクはそのための信頌性の土台なんだ。ちなみに最近のHTTP/3はQUICずいう仕組みを䜿っおいお、UDPの䞊にTCPのような信頌性を実装し぀぀、ハンドシェむクを1埀埩に短瞮しおいるよ。