TCP — протокол транспортного уровня, как UDP, но с важными гарантиями:
* надёжная доставка
* контроль потока
* контроль перегрузки
Надёжность даёт **номер последовательности** (seq).
Соединение начинается с **трёхэтапного рукопожатия** (three-way handshake):Клиент → SYN (seq x)Сервер → SYN + ACK (seq y, ack = x+1)Клиент → ACK (ack = y+1)
После этого каждый пакет считается доставленным только после ACK.
Смотрим вживую:
```bash
tcpdump -S -i any port 80 # в одном терминале
curl www.linkedin.com # в другом
```

Разбор:
* Клиент: [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 секунд (чтобы не путаться со старыми пакетами).
### Где 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 разобран.