Зачем 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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки