Компьютерные сети
TCP: надёжная доставка
Цели урока
- Понимать модель TCP: connection-oriented, byte stream, надёжность поверх ненадёжного IP
- Прочитать заголовок TCP: SYN, ACK, FIN, RST, sequence/ack number, window
- Прорисовать three-way handshake: SYN, SYN-ACK, ACK и зачем нужны каждый шаг
- Объяснить как TCP детектит потери: cumulative ACK, retransmit on timeout, fast retransmit
- Различать sequence number, acknowledgement number, window size в реальном захвате
Каждый раз, когда вы скачиваете файл, и он приходит целым - это заслуга TCP. Каждая веб-страница, каждое письмо, каждая транзакция в банке - TCP молча следит, чтобы ни один байт не потерялся. Как он это делает на ненадёжных каналах связи?
- **Веб:** HTTP/1.1 и HTTP/2 работают поверх TCP - страницы загружаются полностью
- **Email:** SMTP, IMAP, POP3 - письма доходят без потери символов
- **Файлы:** FTP, SFTP, rsync - файлы передаются без повреждений
Предварительные знания
Transmission Control Protocol
**TCP** (Transmission Control Protocol) - надёжный, ориентированный на соединение протокол транспортного уровня. Гарантирует доставку данных в правильном порядке без потерь и дублей.
TCP создаёт **иллюзию потока байтов** между двумя приложениями. Приложение пишет данные в сокет - TCP сам режет их на сегменты, отправляет, следит за доставкой, собирает обратно.
**Stream vs Datagram:** TCP - потоковый протокол. Нет границ между сообщениями. Если отправить 100 байт, а потом 200 - получатель может получить 150 + 150. Приложение само определяет границы (например, \n в конце строки).
Какую главную гарантию даёт TCP?
Трёхстороннее рукопожатие
Перед передачей данных TCP устанавливает соединение через **three-way handshake** (трёхстороннее рукопожатие). Три пакета: SYN, SYN-ACK, ACK. После этого - соединение установлено.
**SYN flood атака:** Злоумышленник отправляет тысячи SYN без ACK. Сервер тратит память на полуоткрытые соединения. Защита: SYN cookies - сервер не хранит состояние до получения ACK.
Сколько пакетов нужно для установки TCP-соединения?
Sequence и Acknowledgment numbers
**Sequence Number (seq)** - номер первого байта в сегменте. **Acknowledgment Number (ack)** - номер следующего ожидаемого байта. Вместе они обеспечивают порядок и надёжность.
**ISN (Initial Sequence Number):** Начальный seq выбирается случайно, не с нуля. Защита от: 1) путаницы с пакетами от старых соединений, 2) TCP spoofing атак (сложнее угадать seq).
Что означает ACK с ack=5000?
Состояния TCP-соединения
TCP-соединение проходит через несколько состояний: от CLOSED через установку (SYN_SENT, ESTABLISHED) до закрытия (FIN_WAIT, TIME_WAIT, CLOSED). Эти состояния важны для отладки.
**TIME_WAIT (2*MSL):** После закрытия соединение остаётся в TIME_WAIT на 60-120 секунд. Зачем? Чтобы старые пакеты от этого соединения не попали в новое с теми же портами. MSL = Maximum Segment Lifetime.
TCP-соединение мгновенно закрывается после отправки данных
Закрытие требует 4 пакета (FIN/ACK в обе стороны) плюс TIME_WAIT на 60-120 секунд
TIME_WAIT гарантирует, что все пакеты от закрытого соединения исчезнут из сети до того, как эти порты будут использованы повторно. Иначе новое соединение могло бы получить старые пакеты.
Какое состояние означает «соединение активно, данные передаются»?
Ключевые идеи
- **TCP** - надёжный, connection-oriented, потоковый протокол
- **Three-way handshake:** SYN → SYN-ACK → ACK для установки
- **Seq/Ack:** нумерация байтов для порядка и подтверждения
- **Состояния:** LISTEN → ESTABLISHED → TIME_WAIT → CLOSED
Связанные темы
TCP - основа большинства интернет-протоколов:
- TCP Flow Control — Sliding window - не перегружать получателя
- TCP Congestion Control — Slow start, AIMD - не перегружать сеть
- TLS — Шифрование поверх TCP
Вопросы для размышления
- Почему handshake занимает 1.5 RTT, а не 1 RTT?
- Что произойдёт, если ACK потеряется?
- Почему TIME_WAIT длится так долго и можно ли его отключить?
Связанные уроки
- net-14-udp — TCP vs UDP - два полюса надёжность/скорость
- net-16-tcp-flow — Flow control - следующий уровень TCP
- net-17-tcp-congestion — Congestion control строится поверх базового TCP
- net-23-https-tls — TLS работает поверх TCP, добавляя шифрование
- net-47-container-networking — Docker networking строится на TCP/IP стеке
- alg-21-dp — Sliding window TCP - тот же принцип что DP sliding window
- bt-02-osi-tcp
- bt-24-connection-pooling