#tcp-three-way-handshake
Опиши TCP three-way handshake. Что лежит в каждом пакете?
Что отвечать
Клиент шлёт SYN с своим ISN (initial sequence number). Сервер отвечает SYN-ACK: подтверждает клиентский ISN+1 и шлёт свой ISN. Клиент отвечает ACK на серверный ISN+1. После трёх пакетов оба знают начальные seq-номера друг друга, соединение в Established.
Что хотят услышать
Senior должен сказать: - ISN выбирается случайно (не нулём), чтобы избежать предсказуемости и hijacking-атак - в SYN-пакете клиент анонсирует свои опции: MSS, window scale, SACK permitted, timestamp - SYN-ACK от сервера тоже несёт его опции; финальный выбор - пересечение - после handshake начинается slow start: cwnd растёт от initial congestion window (10 сегментов на современном Linux) экспоненциально до ssthresh - при потере SYN - экспоненциальный backoff retry (1s, 2s, 4s...), управляется `net.ipv4.tcp_syn_retries`
Подводные камни
- ✗ Сказать что handshake это 3 RTT - нет, это 1 RTT (3 пакета, но клиент может слать данные с третьим ACK через TCP Fast Open)
- ✗ Забыть про опции в SYN - это важно для понимания tuning'а
- ✗ Перепутать SYN-flood защиту с SYN cookies - SYN cookies генерируют серверный ISN из хеша 4-tuple+secret, чтобы не держать half-open state
Follow-up
- ? Что такое TCP Fast Open и почему он не получил массового распространения?
- ? Как работают SYN cookies? Почему их включают только при атаке, а не дефолтом?
- ? Какие данные несёт SYN-ACK кроме подтверждения ISN?
Глубина в базе знаний