Кратко

  • Одновременное открытие происходит, когда оба конца активно открывают соединение и получают SYN без подтверждения, находясь в SYN-SENT.
  • Оба проходят SYN-RECEIVED, подтверждают пространство нумерации другого конца и приходят в ESTABLISHED. Возникает одно соединение, а не два.
  • RFC 9293 требует поддерживать этот путь и помнить, возникло ли SYN-RECEIVED после активного или пассивного OPEN.

Рукопожатие до ролей

TCP часто объясняют как разговор клиента с сервером. Однако RFC 793 прежде всего описывает синхронизацию соединения. Обычно один узел инициирует, а другой отвечает, но два TCP могут начать одновременно. Клиент и сервер — прикладная и эксплуатационная условность, а не обязательное свойство транспорта.

Когда SYN пересекаются

Оба конца выполняют active OPEN, выбирают начальные номера последовательности и посылают SYN. Пакеты пересекаются, пока оба узла находятся в SYN-SENT. Каждый получает SYN без подтверждения, запоминает номер другого конца, переходит в SYN-RECEIVED и отправляет SYN+ACK. Получив допустимое подтверждение собственного SYN, оба переходят в ESTABLISHED. Два запуска сходятся в одно соединение.

SYN занимает один номер последовательности, поэтому подтверждение сдвигается на единицу.

Симметрия требует памяти

RFC 9293 требует поддержки одновременного открытия и сохранения информации о том, был ли SYN-RECEIVED результатом active или passive OPEN. Эта история влияет на последующую обработку сбросов и ошибок. Состояния симметричны, но локальный путь к ним различается.

Старый SYN, похожий на стук

Старый дубликат SYN может выглядеть как одновременное начало. Поэтому проверка номеров и обработка сбросов остаются необходимыми; любой SYN в SYN-SENT не следует автоматически считать законным.

Чего стандарт не обещает

Спецификация описывает переходы, если пакеты дошли до обоих TCP. Она не гарантирует маршрутизацию, правила межсетевых экранов, отображения NAT, поддержку API сокетов или нынешних приложений.

Источники