TCP, UDP, ICMP и сокеты

Oct, 22, 2025

🔹 TCP vs UDP

TCP (Transmission Control Protocol) — протокол ориентированный на соединение, обеспечивающий надёжную, последовательную и подтверждённую передачу данных.
Каждый сегмент подтверждается (ACK), выполняется контроль ошибок и перегрузок. TCP гарантирует порядок и целостность доставки.

UDP (User Datagram Protocol)протокол без установления соединения, передающий отдельные дейтаграммы без гарантии получения и контроля ошибок.
Он быстрее, но ненадёжнее, чем TCP.

КритерийTCPUDP
Тип протоколаС установлением соединенияБез установления соединения
Контроль доставкиЕсть (ACK, sequence)Нет
Порядок пакетовГарантируетсяНе гарантируется
ПрименениеВеб, почта, SSHВидео, VoIP, игры, DNS

🔹 ICMP и ping

ICMP (Internet Control Message Protocol) — протокол сетевого уровня, применяемый для диагностики и обмена служебными сообщениями об ошибках.
ICMP не передаёт пользовательские данные, а используется для уведомлений о сетевых событиях.

Типы ICMP-сообщений:

  • Echo Request / Echo Reply — проверка доступности (ping)
  • Destination Unreachable — недостижимый адрес
  • Time Exceeded — время жизни пакета истекло (TTL = 0)
  • Redirect — изменение маршрута

🧩 Команда ping

ping отправляет ICMP Echo Request пакеты и измеряет:

  • время отклика (RTT, round-trip time),
  • процент потерь,
  • возможность доставки.

Пример:

ping 8.8.8.8

Результаты показывают минимальную, максимальную и среднюю задержку в миллисекундах.


🔹 Механизм работы traceroute и TTL

Traceroute — диагностическая утилита, позволяющая определить маршрут прохождения пакета через сеть.
Она основана на использовании поля TTL (Time To Live) в заголовке IP-пакета.

⚙️ TTL (Time To Live)

Поле TTL представляет собой целое число (1–255), уменьшающееся на единицу каждым маршрутизатором, через который проходит пакет.
Если TTL становится нулевым, маршрутизатор отбрасывает пакет и отправляет обратно ICMP-сообщение “Time Exceeded” источнику.

Это предотвращает бесконечное циркулирование пакетов при ошибках маршрутизации.

🧩 Принцип работы traceroute

  1. Программа отправляет первый пакет с TTL = 1.
    Первый маршрутизатор уменьшает TTL до 0, отбрасывает пакет и возвращает ICMP "Time Exceeded".
    Так определяется первый узел маршрута.

  2. Затем отправляется следующий пакет с TTL = 2, который проходит первый узел и "умирает" на втором — теперь известен второй маршрутизатор.

  3. Процесс продолжается, пока:

    • не достигнута целевая точка,
    • или не превышено заданное число прыжков (hops).
  4. Когда пакет доходит до конечного хоста, тот отвечает ICMP Echo Reply (если используется ICMP) или UDP Port Unreachable (если используется UDP-вариант traceroute).

📈 Интерпретация вывода

Каждая строка вывода traceroute содержит:

  • порядковый номер (hop count),
  • IP-адрес или имя маршрутизатора,
  • три измерения RTT (в миллисекундах).
1  192.168.1.1   1.3 ms   0.9 ms   1.0 ms
2  10.0.0.1       7.2 ms   6.9 ms   7.1 ms
3  8.8.8.8       18.5 ms  18.3 ms  18.6 ms

🔹 Основные сетевые утилиты

УтилитаНазначение
pingПроверяет доступность хоста (ICMP Echo)
traceroute / tracertОтображает маршрут пакетов через сеть (TTL)
netstat / ssАнализирует открытые соединения и порты
nslookup / digПроверка DNS-записей
ip / ifconfigНастройка сетевых интерфейсов
curl / wgetПроверка HTTP-запросов
tcpdump / wiresharkЗахват и анализ пакетов на уровне протоколов

🔹 Концепция сокетов и соединений

Сокет (socket) — это программный интерфейс прикладного уровня, обеспечивающий взаимодействие между процессами через сеть.
Он реализует унифицированный доступ к транспортным протоколам TCP, UDP и другим.

С точки зрения TCP/IP, сокет соединяет прикладной уровень с транспортным, предоставляя системные вызовы для создания, настройки и управления соединениями.

⚙️ Формальное определение

Каждый сокет идентифицируется кортежем:

<протокол, локальный IP, локальный порт, удалённый IP, удалённый порт>

Это уникальная пара, описывающая сеанс взаимодействия между двумя конечными точками (endpoints).


🧩 Типы сокетов

ТипКонстантаПротоколОсобенностиПрименение
StreamSOCK_STREAMTCPПоток данных, надёжность, порядокВеб, SSH
DatagramSOCK_DGRAMUDPПакеты, без подтвержденияDNS, VoIP
RawSOCK_RAWIPПрямой доступ к IP-пакетамАнализ, ICMP
PacketPF_PACKETEthernetКанальный уровеньIDS, Wireshark
WebSocket(над TCP)TCP + HTTP UpgradeДвунаправленный поток сообщенийЧаты, браузеры

🧠 Жизненный цикл сокета (TCP)

  1. socket() — создание дескриптора.
  2. bind() — привязка к адресу.
  3. listen() — ожидание подключений (сервер).
  4. connect() / accept() — установление соединения (3-way handshake).
  5. send() / recv() — передача и приём данных.
  6. close() — завершение соединения (FIN/ACK).

🌐 WebSocket

WebSocket — протокол, расширяющий HTTP до постоянного TCP-соединения после Upgrade-запроса.
Он обеспечивает дуплексную (двустороннюю) связь в реальном времени без необходимости постоянных HTTP-запросов.

Пример:

const socket = new WebSocket('wss://example.com/chat');
socket.onmessage = (event) => console.log(event.data);

⚙️ Внутренняя реализация в Linux

Сокеты представлены структурами ядра:

struct socket {
    socket_state state;
    short type;
    struct sock *sk;
    struct file *file;
};

На уровне пользовательского пространства они отображаются как файловые дескрипторы, что позволяет использовать системные вызовы read(), write(), select(), poll() и epoll().

TCP, UDP, ICMP и сокеты | Aleksandr Suprun