6.1 TCP
Что такое TCP?
TCP (Transmission Control Protocol) — протокол транспортного уровня, который обеспечивает надежную, упорядоченную доставку данных между приложениями. Работает поверх ненадежного IP.
Аналогия: Если IP — это "почтовая служба без гарантий", то TCP — это "заказная почта с подтверждением получения". TCP гарантирует, что данные дойдут и в правильном порядке.
Основные характеристики TCP
Ключевые особенности:
- Надежность: Гарантирует доставку данных (если пакет потерян, он будет переотправлен)
- Упорядочивание: Данные приходят в правильном порядке
- Установление соединения: Перед передачей данных устанавливается соединение (connection-oriented)
- Контроль потока: Управляет скоростью передачи, чтобы не перегрузить получателя
- Управление перегрузкой: Адаптируется к загрузке сети
Установление соединения: трехстороннее рукопожатие
Перед передачей данных TCP устанавливает соединение через процесс, называемый "трехстороннее рукопожатие":
Процесс установления соединения:
- SYN — клиент отправляет запрос на установление соединения с начальным номером последовательности
- SYN-ACK — сервер подтверждает запрос и отправляет свой начальный номер последовательности
- ACK — клиент подтверждает получение SYN-ACK, соединение установлено
Порты: TCP использует порты для идентификации приложений. Например, порт 80 для HTTP, порт 443 для HTTPS, порт 22 для SSH.
Надежность: подтверждения и повторные передачи
Как TCP обеспечивает надежность:
- Нумерация байтов: Каждый байт имеет номер последовательности
- Подтверждения (ACK): Получатель подтверждает получение данных
- Таймауты: Если подтверждение не пришло в течение определенного времени, данные переотправляются
- Проверка целостности: Контрольная сумма проверяет, не повреждены ли данные
Контроль потока: окно получателя
Окно получателя (rwnd) — это размер буфера получателя, который показывает, сколько данных он может принять. Отправитель не может отправить больше данных, чем позволяет окно получателя.
Как работает контроль потока:
- Получатель сообщает размер доступного буфера в поле "Window Size"
- Отправитель не отправляет больше данных, чем позволяет окно
- Когда получатель обработал данные, он увеличивает окно
- Это предотвращает переполнение буфера получателя
Управление перегрузкой
TCP автоматически адаптируется к загрузке сети, чтобы не перегружать каналы:
Механизмы управления перегрузкой:
- Медленный старт: Начинает с малой скорости и постепенно увеличивает
- Избегание перегрузок: При обнаружении потерь уменьшает скорость
- Fast Retransmit: Быстрая переотправка при получении дублирующихся ACK
- Congestion Window (cwnd): Окно перегрузки ограничивает количество неотправленных данных
Завершение соединения: четырехшаговое закрытие
Процесс закрытия соединения:
- FIN — одна сторона отправляет запрос на закрытие
- ACK — другая сторона подтверждает получение FIN
- FIN — вторая сторона также отправляет FIN (может отправить данные перед этим)
- ACK — первая сторона подтверждает, соединение закрыто
TIME_WAIT: После закрытия соединения сторона, которая инициировала закрытие, ждет 2×MSL (Maximum Segment Lifetime) перед освобождением ресурсов. Это нужно, чтобы убедиться, что все пакеты дошли.
Состояния TCP-соединения
Основные состояния:
- CLOSED — соединение закрыто
- LISTEN — сервер ждет входящих соединений
- SYN-SENT — клиент отправил SYN, ждет ответа
- SYN-RECEIVED — сервер получил SYN, отправил SYN-ACK
- ESTABLISHED — соединение установлено, идет передача данных
- FIN-WAIT — ожидание подтверждения закрытия
- CLOSE-WAIT — ожидание закрытия от приложения
- TIME-WAIT — ожидание перед полным закрытием
Резюме
Ключевые моменты:
- TCP — надежный протокол транспортного уровня с установлением соединения
- Трехстороннее рукопожатие: SYN → SYN-ACK → ACK для установления соединения
- Надежность: Подтверждения, нумерация, повторные передачи
- Контроль потока: Окно получателя ограничивает скорость передачи
- Управление перегрузкой: Автоматическая адаптация к загрузке сети
- Четырехшаговое закрытие: FIN → ACK → FIN → ACK
Цель: Обеспечить надежную, упорядоченную доставку данных между приложениями поверх ненадежной сети IP.
6.2 UDP
UDP — простой дейтаграммный протокол без установления соединения и подтверждений. Минимальные накладные расходы и отсутствие механизма восстановления потерь делают его подходящим для приложений, где критичны задержки и допускаются потери: голос/видео в реальном времени, DNS, игры.
Особенности UDP
- Заголовок 8 байт: порты источника/назначения, длина, контрольная сумма (обязательна в IPv6).
- Отсутствие порядка/доставки: логика повторов и упорядочивания реализуется приложением при необходимости.
- Use‑cases: QUIC/HTTP/3 (на базе UDP), DNS, RTP/SRTP.
6.3 Порты
Порты (0–65535) определяют конечную точку взаимодействия на хосте и совместно с IP‑адресом образуют сокет. Диапазоны: известные (0–1023), зарегистрированные (1024–49151), динамические/частные (49152–65535).
Практические аспекты
- Сокеты: {srcIP:srcPort → dstIP:dstPort} уникально идентифицируют соединение TCP.
- Эфемерные порты: динамически выделяются клиентам для исходящих соединений.
- Безопасность: фильтрация/ограничение открытых портов, принцип наименьших привилегий.
# Просмотр прослушиваемых портов
# Windows
netstat -ano | findstr LISTENING
# Linux/macOS
ss -tulpen
6.4 Для профессионалов
- Window Scaling: расширяет размер окна и повышает Throughput на высоколатентных каналах.
- QUIC (HTTP/3): транспорт поверх UDP с шифрованием и мультиплексированием потоков.
- PMTUD и MSS Clamping: обнаружение MTU по пути, настройка MSS на границах (особенно при туннелях/VPN).
- Алгоритмы перегрузок: CUBIC (дефолт в Linux), BBR (Google) — выбор влияет на латентность/пропускную способность.