TCP — протокол транспортного уровня, как UDP, но с важными гарантиями: * надёжная доставка * контроль потока * контроль перегрузки Надёжность даёт **номер последовательности** (seq). Соединение начинается с **трёхэтапного рукопожатия** (three-way handshake):Клиент → SYN (seq x)Сервер → SYN + ACK (seq y, ack = x+1)Клиент → ACK (ack = y+1) После этого каждый пакет считается доставленным только после ACK. established.png Смотрим вживую: ```bash tcpdump -S -i any port 80 # в одном терминале curl www.linkedin.com # в другом ``` ![pcap.png](/files/875d9639bcf74d5a8763bddf41a6f9ef.png) Разбор: * Клиент: [S] seq 1522264672 * Сервер: [S.] seq 1063230400, ack 1522264673 * Клиент: [.] ack 1063230401 Соединение готово. Дальше идёт HTTP-запрос (76 байт), ответ (170 байт) и закрытие. В HTTP/1.1 это же соединение можно переиспользовать — не нужно новое рукопожатие каждый раз. Если пакет потерян — ACK не приходит → клиент автоматически перешлёт. **Контроль потока** — поле WIN (окно): сколько байт приёмник готов принять. WIN=0 → отправитель ждёт. **Контроль перегрузки** — сколько пакетов можно отправить без ACK (настраивается в Linux). ### Закрытие соединения Клиент вызывает close → отправляет FINСервер отвечает ACKСервер вызывает close → отправляет FINКлиент отвечает ACK и ждёт в **TIME\_WAIT** 120 секунд (чтобы не путаться со старыми пакетами). closed.png ### Где SRE использует TCP 1. Load balancer: L4/L7, Direct Server Return, offload HTTPS. 2. Настраивать `rmem`/`wmem` — как в UDP. 3. `tcp_max_syn_backlog` + `somaxconn` — сколько соединений может ждать `accept()`. 4. Много коротких соединений → TIME\_WAIT жрёт дескрипторы. Помогают `tcp_tw_reuse`, пул соединений. 5. Диагностика: * много CLOSE\_WAIT → проблема приложения * retransmissions → сеть или ОС Всё! TCP разобран.