Skip to content

Instantly share code, notes, and snippets.

@zagazat
Last active March 4, 2025 13:19
Show Gist options
  • Save zagazat/3c2d78b6bfde3ab8a5e45c3789ac8b70 to your computer and use it in GitHub Desktop.
Save zagazat/3c2d78b6bfde3ab8a5e45c3789ac8b70 to your computer and use it in GitHub Desktop.
TCP vs UDP

Кем бы вы ни устраивались - фронтенд, бэкенд, qa, аналитик - на собеседовании вам могут задавать вопросы про сеть. И одним из вопросов конечно же является "Что такое TCP и UDP? А чем они отличаются?".

Конечно ещё есть NAT, TLS vs SSL, http1.1 vs http2 и так далее и тому подобное.

Но сегодня остановимся на протоколах передачи данных TCP и UDP.

Начнём, конечно же, с определения и расшифровки аббревиатур:

  • TCP - он же Transmission Control Protocol - транспортный протокол передачи данных, работающий в сетях TCP/IP. Он гарантирует доставку и получение данных. Для этого ему нужно предварительно установить соединение.
  • UDP - User Datagram Protocol - тоже транспортный протокол. Но он уже не требует установленного соединения. Один узел просто отсылает пакеты другому узлу. При этом отправитель не знает готов ли получатель к приёму пакетов, и вообще существует ли он.

Сложно, непонятно, но ладно. Давайте разбираться.

Немножко о работе сетей TCP/IP.

TCP состоит из 4х уровней:

  1. Application (Прикладной)
  2. Transmission (Транспортный)
  3. Internetwork (Межсетевой)
  4. Network (Сетевой)

Когда приложение отправляет некое сообщение, оно проходит через все эти 4 уровня.

Давайте попробуем описать:

Прикладной уровень (Application) -- браузеры, почтовые клиенты, итд. На этом этапе создаётся некое сообщение, которое отправляется по сети. Для простоты пускай это будет http-запрос. Пока что он будет выглядеть примерно так:

| request |

Дальше оно передаётся на транспортный уровень (Transmission). Работу на этом здесь определяют протоколы TCP или UDP. Есть ешё QUIC, о нём в другой раз. В общем-то именно здесь, на транспортном уровне, и кроется главное различие между TCP и UDP. Но об этом будет чуть пониже.

На транспортном уровне к нашему запросу добавляется TCP или UDP заголовок, в котором хранится информация об используемом соединении. В случае, если используем TCP, то этой информации будет много, в случае UDP только порты, длина пакета, и контрольная сумма.

После транспортного уровня наше сообщение выглядит уже вот так:

| tcp-header | request |

Это называется сегментом.

Сегмент переходит на межсетевой уровень (Internet). Здесь наше "сообщение" обогащается IP-заголовком. В нём хранятся данные об IP-адресах устройств использующих данное соединение.

| ip-header | tcp-header | request |

В результате мы наконец-то получаем "пакет". Ну или датаграмму. Принципиальной разницы здесь нет. Просто употребляя термин "Датаграмма", подразумевается, что мы говорим о UDP.

Основной протокол на межсетевом уровне это IP (Internet Protocol), который отвечает за передачу пакета между подсетями. От одного узла (маршрутизатора) до следующего, пока пакет не дойдёт до места назначения.

И теперь, наконец, наш пакет передаётся на канальный уровень (Network). Здесь он кодируется и отправляется к своему получателю. Канальный уровень определяет физические свойства для передачи информации, такие как частота сигнала, возможные задержки в соединении, расстояние передачи. Здесь уже используется Ethernet-протокол, проводное соединение.

На этом уровне протокол (TCP или UDP) так же добавляют свои доп.заголовки к пакету. Так мы получаем "фрейм".

По мере путешествия, наш фрейм добирается до какого-то узла, расшифровывается, считывается IP-заголовок и по этому заголовку узел определяет, что делать с фреймом дальше. Например, отправляем его дальше или обрабатываем запрос.

Так и в чём разница между TCP и UDP?

Ранее я уже писал, что основная разница кроется на транспортном уровне. Здесь наше приложение знает, что у нас есть порт для отправки сообщения и есть некий получатель, который тоже использует какой-то порт для получения.

UDP, будучи гораздо проще и "легче", чем TCP, в то же время является менее надёжным.

Вот, что хранит UDP-заголовок, который добавляется на транспортном уровне:

  • порт отправителя
  • порт получателя
  • длина датаграммы
  • контрольная сумма

А вот лишь часть того, что добавляется в TCP-заголовок:

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

Как минимум, уже здесь можно определить главную разницу: пакеты TCP имеют последовательность (регулируется порядковым номером), их доставка проверяется перед отправкой следующего (номер подтверждения), определяется загруженность сети и кол-во пакетов которые получатель готов принять (размер окна).

Так же, перед тем, как начинать отправлять данные, узлы tcp-соединения должны произвести так называемый handshake - рукопожатие. То есть удостовериться, что оба узла находятся в сети и готовы к приёму и отправке данных.

Говоря о UDP, и основываясь на ip-заголовке, можно увидеть, что отправитель не может быть уверен, что его датаграмма дошла до адресата. Таким образом, этот протокол используют там, где потеря пакетов и их последовательность не является чем-то критическим, а на первый план выходит именно скорость обмена. Например, передача аудио- и видеопотока, запись метрик, логов, и различные онлайн видеоигры.

Так что отвечая на вопрос интервьюера "В чём различие между TCP и UDP?", говорим следующее:
  • Во-первых, разница в скорости. UDP не следит за доставкой и потерей пакетов, а TCP в случае потери будет отправлять их повторно. Плюс сам заголовок гораздо проще и требует меньше времени/ресурсов на обработку.
  • Во-вторых, разница в установке соединения и порядке пакетов. UDP может слать их вразнобой, в то время как TCP строго следит за последовательностью пакетов, которая хранится в самом заголовке. Так же, при TCP-соединении оба узла должны быть готовы готовы к обмену данными, в отличие от UDP, который может слать в пустоту.

Протокол TCP анализирует переданные пакеты информации и, в случае ошибки, повторно запрашивает пакеты. Также он следит за верной последовательностью переданных пакетов. UDP – протокол без установки соединения, он выполняет небольшую проверку и считается ненадежным. Отправка информации с помощью UDP выполняется быстрее по сравнению с TCP.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment