Получить доступ

Чем TCP отличается от UDP?

JuniorСети
Ещё спрашивают так:
  • Когда выбирают UDP вместо TCP?
  • Почему видеозвонки работают по UDP?
  • Почему DNS использует UDP?
Коротко

TCP — надёжный упорядоченный поток байтов с установкой соединения. UDP — отдельные датаграммы без гарантий: быстро и просто.

  • TCP: рукопожатие, подтверждения, повторная передача, порядок, управление потоком и перегрузкой
  • UDP: нет соединения, нет повторов, порядок не гарантирован, сообщения сохраняют границы
  • UDP — где потерянное устарело: голос, видео, игры; где запрос маленький: DNS

А ещё QUIC (HTTP/3) — надёжность поверх UDP, чтобы обойти ограничения TCP

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

TCP: рукопожатие, потери и повторная передача

Подробно

TCP даёт приложению абстракцию трубы: что записали с одной стороны, то в том же порядке и без потерь прочитают с другой. Для этого:

  • установка соединения тройным рукопожатием;
  • нумерация байтов и подтверждения, повторная отправка потерянного;
  • переупорядочивание на приёме;
  • управление потоком — не завалить медленного получателя;
  • управление перегрузкой — не завалить сеть.

Цена — задержка на установку соединения, состояние на обеих сторонах и блокировка начала очереди: если потерялся один сегмент, все следующие ждут его повторной отправки, даже если уже пришли.

UDP добавляет к IP только порты и контрольную сумму. Нет соединения, нет подтверждений, нет порядка; каждая датаграмма — отдельное сообщение, границы сохраняются (в TCP их нет — приложение само делит поток на сообщения). Приложение может само реализовать ровно ту надёжность, которая нужна.

Когда что:

  • TCP — почти всё, где важна целостность: HTTP/1.1 и 2, базы данных, почта, SSH, брокеры;
  • UDP — реальное время, где повтор опоздавших данных бесполезен: голос и видео (RTP, WebRTC), онлайн-игры; короткие запросы-ответы, где дешевле переспросить, чем устанавливать соединение: DNS, NTP; рассылка многим получателям (multicast); метрики (StatsD) — потеря точки не страшна;
  • QUIC — транспорт HTTP/3 поверх UDP: шифрование встроено, установка соединения за один оборот (или ноль при повторном), независимые потоки без общей блокировки, переезд соединения при смене сети.

DNS переходит на TCP, если ответ больше 512 байт (или лимита EDNS), и для передачи зон.

Пример

import socket
# UDP: одна датаграмма, ответа может не быть
u = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
u.sendto(b"ping", ("127.0.0.1", 9999))

# TCP: соединение и поток байтов — два send могут прийти одним recv
t = socket.create_connection(("example.com", 80))
t.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n")
print(t.recv(100))

Что хотят услышать

  • Надёжный поток против датаграмм без гарантий.
  • Механизмы TCP: рукопожатие, подтверждения, порядок, управление потоком и перегрузкой.
  • Примеры выбора UDP и почему.
  • Отсутствие границ сообщений в TCP, QUIC — плюс.

Частые ошибки

  • «UDP быстрее, потому что пакеты меньше» — дело в отсутствии ожиданий и повторов.
  • Считать, что TCP гарантирует доставку сообщений приложению на другой стороне — он гарантирует байты в буфер ядра, не обработку.

Что спросят дальше

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем