Найти тему

#23 TCP vs UDP. Реализация на Go

Оглавление
Назовите разницу между протоколами TCP и UDP

Этот вопрос часто встречается на собеседованиях в секции про сети или Computer Science. Важно понимать, в каких ситуациях предпочтительнее использовать TCP (Transmission Control Protocol), а в каких — UDP (User Datagram Protocol). Выбор протокола должен основываться на требованиях к приложению, особенно в контексте скорости, надежности и последовательности передачи данных.

Транспортный уровень модели OSI

TCP и UDP расположены на транспортном уровне (4-м уровне) модели OSI. На этом уровне осуществляется передача данных между хостами по принципу точка-точка. Блоки данных разделяются на сегменты, размер которых зависит от протокола: короткие объединяются в один, а длинные разбиваются.

Протоколы транспортного уровня часто обеспечивают контроль доставки данных, требуя от системы, принимающей данные, отправлять подтверждение о приеме передающей стороне. Они также отвечают за восстановление порядка данных, особенно при использовании сетевых протоколов, которые работают без установления соединения.

Выбор между TCP и UDP и основные отличия

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

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

Работа с протоколами в Go

Протоколы TCP и UDP реализованы в пакете net стандартной библиотеки.

TCP

Функция Listen используется для создания серверного сокета, который ожидает входящие соединения. Listen инициализирует сетевой слушатель на заданном порту и IP-адресе. Создает сокет в операционной системе, который прослушивает входящие пакеты данных. Функция блокируется, ожидая входящие соединения, и возвращает их при поступлении.

Функция Dial используется для инициализации клиентского соединения с сервером по указанному адресу. Функция координирует процесс рукопожатия с сервером для установления соединения. Возвращает объект соединения, который можно использовать для отправки и получения данных.

TCP-сервер

ссылка на Playground

-2

TCP-клиент

ссылка на Playgorund

-3

TCP-клиент подключается к TCP-серверу на порту 9999. Пользователь вводит текст в консоль, который затем отправляется на сервер. После отправки клиент ожидает и выводит ответ сервера. Цикл продолжается, позволяя пользователю вводить несколько строк текста. Запускать клиент и сервер следует в разных окнах терминала.

UDP

ListenUDP аналогична Listen, но используется специально для создания UDP сокета. Она cоздает UDP сокет, который слушает входящие дейтаграммы (UDP пакеты). ListenUDP просто ожидает входящие пакеты без установления соединения. Возвращает объект, через который можно читать входящие дейтаграммы.

DialUDP cоздает UDP "соединение" с указанным сервером, хотя на самом деле в UDP не существует постоянного соединения. Позволяет отправлять и получать дейтаграммы на указанный адрес и порт. Подчеркивает безсоединительный характер UDP, где каждая дейтаграмма обрабатывается независимо.

UDP-сервер

ссылка на Playground

-4

UDP-клиент

ссылка на Playground

-5

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