TCP vs UDP: различия, применение и производительность
TCP (Transmission Control Protocol) и UDP (User Datagram Protocol) — два фундаментальных протокола транспортного уровня в интернете. Каждое сетевое приложение использует один из них или оба для передачи данных между хостами. Понимание их различий необходимо для принятия обоснованных архитектурных решений о надёжности, задержке и пропускной способности.
Как работает TCP
TCP — протокол с установлением соединения. Перед обменом данными клиент и сервер выполняют трёхстороннее рукопожатие для создания надёжного соединения с сохранением состояния:
Клиент → Сервер: SYN (seq=x)
Сервер → Клиент: SYN-ACK (seq=y, ack=x+1)
Клиент → Сервер: ACK (ack=y+1)
После установления соединения TCP обеспечивает несколько гарантий:
- Надёжная доставка — каждый сегмент подтверждается; потерянные сегменты автоматически повторно отправляются
- Упорядоченная доставка — сегменты собираются в правильной последовательности независимо от порядка прибытия
- Управление потоком — получатель объявляет размер окна для предотвращения переполнения буфера
- Контроль перегрузки — алгоритмы Slow Start, Congestion Avoidance, Fast Retransmit и Fast Recovery адаптируют скорость отправки к условиям сети
Структура заголовка TCP
Заголовок TCP имеет размер минимум 20 байт и содержит ключевые поля для обеспечения надёжности:
| Поле | Размер | Назначение |
|---|---|---|
| Source Port | 16 бит | Идентификатор приложения-отправителя |
| Destination Port | 16 бит | Идентификатор приложения-получателя |
| Sequence Number | 32 бита | Позиция байта в потоке данных |
| Acknowledgment Number | 32 бита | Следующий ожидаемый байт от другой стороны |
| Window Size | 16 бит | Управление потоком — сколько данных может принять получатель |
| Checksum | 16 бит | Обнаружение ошибок заголовка и данных |
| Flags | 6 бит | SYN, ACK, FIN, RST, PSH, URG — управление состоянием |
Как работает UDP
UDP — протокол без установления соединения. Рукопожатия нет — отправитель просто передаёт датаграммы получателю. Заголовок UDP составляет всего 8 байт:
| Поле | Размер | Назначение |
|---|---|---|
| Source Port | 16 бит | Идентификатор отправителя |
| Destination Port | 16 бит | Идентификатор получателя |
| Length | 16 бит | Общий размер датаграммы |
| Checksum | 16 бит | Обнаружение ошибок (обязательно в IPv6) |
UDP не гарантирует доставку: пакеты могут прийти в неправильном порядке, дублироваться или потеряться. Это делает протокол легковесным и быстрым, но ответственность за надёжность ложится на прикладной уровень.
Сравнение TCP и UDP
| Характеристика | TCP | UDP |
|---|---|---|
| Соединение | С установлением (3-way handshake) | Без установления |
| Надёжность | Гарантированная доставка с повторной передачей | Без гарантий, best-effort |
| Порядок | Доставка по порядку | Без упорядоченности |
| Накладные расходы | Заголовок 20+ байт | Заголовок 8 байт |
| Задержка | Выше (рукопожатие + подтверждения) | Ниже (без установки) |
| Управление потоком | Да (скользящее окно) | Нет |
| Контроль перегрузки | Да (встроенные алгоритмы) | Нет |
| Широковещание | Не поддерживается | Поддерживается (multicast/broadcast) |
Когда использовать TCP
TCP подходит, когда целостность и полнота данных важнее скорости:
- Веб-сёрфинг (HTTP/SSL/TLS проверку) — страницы должны загружаться полностью и корректно
- Электронная почта (SMTP, IMAP, POP3) — сообщения не могут иметь пропущенных частей
- Передача файлов (FTP, SFTP) — каждый байт должен быть доставлен без искажений
- Подключения к базам данных — запросы и ответы должны быть надёжными
- SSH и удалённое администрирование — целостность команд критична
- API документацию-взаимодействие — пары запрос/ответ должны быть полными
Когда использовать UDP
UDP эффективен, когда скорость и низкая задержка важнее идеальной доставки:
- Видео- и аудиостриминг — потерянный кадр лучше, чем задержанный поток
- Онлайн-игры — обновления позиций в реальном времени, где устаревшие данные бесполезны
- DNS-запросы — маленькие запросы без состояния с быстрым повтором
- VoIP — задержка в разговоре должна быть менее 150 мс
- Данные IoT-датчиков — высокочастотные показания с допустимой потерей
- DHCP — клиентам нужны адреса до получения IP
Влияние на производительность веб-приложений
Накладные расходы на соединение
Рукопожатие TCP добавляет один RTT перед началом передачи данных. С TLS это становится два RTT. При задержке 100 мс это 200–300 мс до первого байта данных приложения.
# Измерение времени TCP-соединения
curl -w "tcp_connect: %{time_connect}s\ntls_handshake: %{time_appconnect}s\nfirst_byte: %{time_starttransfer}s\n" -o /dev/null -s https://example.com
Медленный старт TCP и окно перегрузки
Новые TCP-соединения начинают с малого окна перегрузки (обычно 10 сегментов, около 14 КБ). Для веб-сайтов критический путь рендеринга в идеале должен помещаться в начальное окно.
QUIC: лучшее из обоих миров
HTTP/3 использует QUIC — протокол поверх UDP с надёжностью на уровне приложения. QUIC сочетает надёжность TCP со скоростью UDP:
- Установление соединения за 0-RTT для повторных посетителей
- Отсутствие блокировки начала очереди между независимыми потоками
- Встроенное шифрование TLS 1.3
- Миграция соединения при смене сети (Wi-Fi → мобильная сеть)
Мониторинг TCP и UDP сервисов
При мониторинг сайтов сетевых сервисов понимание базового протокола помогает диагностировать проблемы:
- Повторные передачи TCP — указывают на перегрузку сети или потерю пакетов
- Состояния TCP-соединений — высокое число TIME_WAIT говорит о частом создании и разрыве соединений
- Потеря пакетов UDP — должна измеряться на уровне приложения, так как UDP не отслеживает доставку
- Доступность проверку портов — TCP-порты тестируются SYN-сканированием; UDP требует специфических зондов
# Проверка состояний TCP-соединений
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
# Мониторинг повторных передач TCP
watch -n1 'netstat -s | grep -i retransmit'
# Тест доступности UDP-порта
nc -zuv example.com 53
Итоги
TCP и UDP служат принципиально разным целям. TCP обеспечивает надёжную, упорядоченную доставку данных ценой большей задержки и накладных расходов. UDP предлагает минимальные накладные расходы и низкую задержку без гарантий доставки. Современные протоколы вроде QUIC показывают, что эти компромиссы не бинарны — строя надёжность поверх UDP, можно добиться лучших характеристик обоих протоколов. При проектировании или мониторинге сетевых приложений выбор транспортного протокола — одно из наиболее значимых архитектурных решений.
Проверьте ваш сайт прямо сейчас
Проверить →