Зачем TCP третий шаг при установлении соединения

При обычном установлении TCP-соединения стороны обмениваются сегментами SYN, SYN-ACK и ACK. Каждая сторона выбирает свой начальный номер последовательности, а другая подтверждает его получение.

Клиент → сервер: SYN, seq=x Сервер → клиент: SYN, seq=y, ACK=x+1 Клиент → сервер: ACK=y+1

Второй сегмент совмещает два действия: подтверждает SYN клиента и сообщает начальный номер сервера. Третий подтверждает серверный SYN. После корректного ACK сервер может перейти из SYN-RECEIVED в ESTABLISHED.

Это также помогает отличать новое соединение от старых дубликатов сегментов: одного сообщения с запросом недостаточно, чтобы считать обмен согласованным.

Если третий ACK потерялся, сервер может повторить SYN-ACK, а клиент — снова подтвердить его. Подтверждение может прийти и с первым сегментом данных клиента. Детали повторов и таймаутов зависят от реализации.

Ресурсы могут выделяться уже до третьего шага. Именно накопление незавершённых соединений используется в SYN flood; SYN cookies позволяют уменьшить необходимость хранить это состояние. Поэтому объяснение «три шага нужны, чтобы вообще не тратить память до проверки клиента» неверно.

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки