🔹 TCP vs UDP
TCP (Transmission Control Protocol) — протокол ориентированный на соединение, обеспечивающий надёжную, последовательную и подтверждённую передачу данных.
Каждый сегмент подтверждается (ACK), выполняется контроль ошибок и перегрузок. TCP гарантирует порядок и целостность доставки.
UDP (User Datagram Protocol) — протокол без установления соединения, передающий отдельные дейтаграммы без гарантии получения и контроля ошибок.
Он быстрее, но ненадёжнее, чем TCP.
| Критерий | TCP | UDP |
|---|---|---|
| Тип протокола | С установлением соединения | Без установления соединения |
| Контроль доставки | Есть (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
-
Программа отправляет первый пакет с TTL = 1.
Первый маршрутизатор уменьшает TTL до 0, отбрасывает пакет и возвращает ICMP "Time Exceeded".
Так определяется первый узел маршрута. -
Затем отправляется следующий пакет с TTL = 2, который проходит первый узел и "умирает" на втором — теперь известен второй маршрутизатор.
-
Процесс продолжается, пока:
- не достигнута целевая точка,
- или не превышено заданное число прыжков (hops).
-
Когда пакет доходит до конечного хоста, тот отвечает 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).
🧩 Типы сокетов
| Тип | Константа | Протокол | Особенности | Применение |
|---|---|---|---|---|
| Stream | SOCK_STREAM | TCP | Поток данных, надёжность, порядок | Веб, SSH |
| Datagram | SOCK_DGRAM | UDP | Пакеты, без подтверждения | DNS, VoIP |
| Raw | SOCK_RAW | IP | Прямой доступ к IP-пакетам | Анализ, ICMP |
| Packet | PF_PACKET | Ethernet | Канальный уровень | IDS, Wireshark |
| WebSocket | (над TCP) | TCP + HTTP Upgrade | Двунаправленный поток сообщений | Чаты, браузеры |
🧠 Жизненный цикл сокета (TCP)
socket()— создание дескриптора.bind()— привязка к адресу.listen()— ожидание подключений (сервер).connect()/accept()— установление соединения (3-way handshake).send()/recv()— передача и приём данных.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().