要約

  • 同時オープンは、両端がアクティブに開始し、双方が SYN-SENT 中に確認応答のない SYN を受け取る場合に起きる。
  • 両端は SYN-RECEIVED を経て相手のシーケンス空間を確認し、ESTABLISHED となる。一つの接続であり、二つではない。
  • RFC 9293 はこの経路への対応と、SYN-RECEIVED がアクティブまたはパッシブな OPEN のどちらに由来するかの記録を要求する。

役割より先にあるハンドシェイク

TCP はクライアントとサーバーの会話として説明されがちだ。しかし RFC 793 が中心に置くのは接続の同期である。一方が開始し他方が応答する形は通常だが、二つの TCP が同時に開始することも想定されている。クライアントとサーバーは、トランスポートの必須条件ではない。

SYN が交差するとき

両端はアクティブ OPEN を行い、それぞれ初期シーケンス番号を選んで SYN を送る。二つのセグメントが交差する間、双方は SYN-SENT にいる。各端点は確認応答のない相手の SYN を受け、相手の番号を記録し、SYN-RECEIVED に移って SYN+ACK を返す。その後、自分の SYN への有効な確認を受けると ESTABLISHED に入る。

SYN はシーケンス番号を一つ消費するため、確認値は一つ進む。

対称性にも記憶が要る

RFC 9293 は TCP 実装に同時オープンの試行を処理できることを求め、SYN-RECEIVED に至った OPEN の種別も保持するよう求める。その履歴は後のリセットやエラー処理を左右する。状態遷移は対称でも、ローカルな経路は同じではない。

古い SYN という紛らわしいノック

古い重複 SYN は同時開始に見えることがある。シーケンス検証とリセット処理は依然として必要であり、SYN-SENT で受けた SYN がすべて正当とは限らない。

標準が保証しないこと

規格が示すのは、パケットが両端の TCP に届いた場合の状態機械である。経路、ファイアウォール、NAT、ソケット API、アプリケーションが実際に交換を許すとは限らない。

出典