Hosts, links, nodes, packets — базовые сущности сети
Прежде чем разбирать TCP, HTTP, DNS, нужно условиться о терминах. В сетях есть несколько фундаментальных сущностей, и если их не различать, дальнейшие концепции превращаются в кашу. К сожалению, многие учебники используют эти слова взаимозаменяемо, что только запутывает. В этом уроке наведём порядок.
Главное, что вы должны вынести: host — это конечное устройство, node — любой узел в сети, link — физическая или логическая связь между узлами, packet — кусок данных, которые ходят по сети. Дальше посмотрим, как они соотносятся.
Host — конечная точка сети
Host — это устройство, на котором работает приложение, использующее сеть. Ваш ноутбук — host. Сервер в дата-центре — host. Ваш телефон — host. Кофеварка с Wi-Fi — тоже host (привет, IoT).
Ключевая характеристика host — он генерирует трафик и потребляет трафик. Браузер на ноутбуке отправляет HTTP-запросы (генерирует) и получает HTML (потребляет). Сервер слушает входящие соединения, обрабатывает их, отправляет ответы.
Терминология вариативная: host, machine, endpoint, peer, system — часто означают одно и то же. В академическом контексте чаще «host», в инфраструктурном — «machine», в peer-to-peer — «peer». В этом курсе будем говорить «host», когда нужна точность.
Link — физическая или логическая связь
Link — это «провод» между двумя узлами. Может быть физическим (медный Ethernet-кабель, оптоволокно) или логическим (Wi-Fi, виртуальная сеть в облаке).
Linkи имеют важные параметры, которые определяют их пригодность для разных задач:
- Bandwidth (пропускная способность). Сколько байт в секунду можно прокачать. Ethernet 1 Гбит/с = 1,000,000,000 бит/с = ~125 МБ/с.
- Latency (задержка). Сколько времени один пакет идёт от A до B. Внутри дата-центра — 0.1-1 мс. Между континентами — 100-300 мс.
- Packet loss (потери). Сколько процентов пакетов теряется. На хорошем link — 0.001%. На плохом — может быть 5-10%.
- Jitter (вариативность latency). Насколько latency колеблется. Постоянная latency = 0 jitter. Если бывает 5 мс, 25 мс, 8 мс — большой jitter.
Эти параметры определяют, какое приложение комфортно работает на этом link. Видеосвязь требует низкого jitter (иначе видео заикается). Скачивание файлов требует высокого bandwidth, но толерантно к latency. Игры требуют низкого latency и low packet loss.
# Посмотреть свои сетевые интерфейсы (links) на Linux:
ip link show
# Увидите en0, wlan0, lo (loopback), может быть docker0, br-*
# Или на macOS:
ifconfig
# Увидите en0 (Ethernet или Wi-Fi), lo0 (loopback), utun* (VPN)
# Посмотреть скорость текущего Wi-Fi link (macOS):
networksetup -getairportnetwork en0
system_profiler SPAirPortDataType | grep -A 3 "Current Network"
# Linux:
iwconfig wlan0 2>&1 | grep -i 'bit rate'
Node — любой узел в сети
Node — более общий термин, чем host. Node — это любая точка в сети, которая обрабатывает пакеты. Hosts — это nodes. Но routers и switches тоже nodes. Они не запускают приложений, но участвуют в передаче трафика.
Когда вы отправляете HTTP-запрос с ноутбука на сервер в AWS Frankfurt, пакеты проходят через 10-20 промежуточных nodes. Каждый — это switch, router или firewall. Вы их обычно не видите, но они там есть. Команда traceroute показывает этот путь.
# Посмотреть все промежуточные nodes между вами и сервером:
traceroute github.com
# Покажет 10-20 строк -- каждая это router на пути
# На некоторых строках будут * * * -- это router,
# который не отвечает на ICMP (специально или по политике)
Различие host vs node важно, когда мы говорим о слоях. Hosts видят все слои сетевого стека (Ethernet, IP, TCP, HTTP), потому что они генерируют и потребляют трафик. Routers видят только IP-слой и ниже (Ethernet, IP) — они не должны парсить TCP или HTTP. Switches видят только Ethernet. Каждое промежуточное устройство работает на своём «уровне абстракции».
Packet — единица передачи
Packet — это кусок данных, который ходит по сети. Когда вы отправляете большой файл, он разбивается на множество пакетов, каждый из которых идёт независимо.
В терминологии есть нюанс: на каждом слое единица называется по-разному.
- Frame — на link layer (Ethernet-кадр).
- Packet — на network layer (IP-пакет).
- Segment — на transport layer (TCP-сегмент).
- Datagram — на transport layer (UDP-датаграмма).
- Message — на application layer (HTTP-сообщение).
Это вложенная структура. Когда вы отправляете HTTP-запрос, он становится HTTP-message, упаковывается в TCP-segment, упаковывается в IP-packet, упаковывается в Ethernet-frame, и улетает в кабель. На приёмной стороне всё разворачивается обратно. Это и есть encapsulation, который мы разберём в модуле 3.
# Посмотреть пакеты, проходящие через ваш интерфейс:
sudo tcpdump -i en0 -c 5
# Покажет 5 пакетов. Каждая строка -- один пакет с метаданными:
# время, source IP:port, destination IP:port, флаги
# В Wireshark вы увидите ту же информацию в GUI -- дерево полей пакета
# с расшифровкой каждого слоя
Размер пакетов — MTU
Сколько байт можно положить в один пакет? Это ограничивает MTU (Maximum Transmission Unit). Для Ethernet типичный MTU = 1500 байт (для payload IP-пакета). Это значит, что один IP-пакет на Ethernet не может быть больше 1500 байт (плюс заголовок Ethernet ещё 14 байт сверху).
Откуда взялась цифра 1500? Историческое решение IEEE при стандартизации Ethernet в 1980-х. Сейчас иногда используют jumbo frames — до 9000 байт, для дата-центров. Но в публичном internet всё ещё 1500 байт.
Что важно понимать: с точки зрения приложения вы шлёте 5000 байт. С точки зрения сети — 4 пакета. Все механизмы reliability TCP работают на уровне сегментов: ACKs, retransmission, congestion control. Когда вы видите в Wireshark «4 TCP packets для одного запроса» — это нормально для сообщений больше MTU.
# Узнать MTU своего интерфейса:
ip link show eth0 | grep mtu
# Или на macOS:
ifconfig en0 | grep mtu
# Будет что-то вроде: mtu 1500
# Проверить максимальный размер пакета до сервера (без фрагментации):
ping -M do -s 1472 google.com # Linux, -M do = don't fragment
ping -D -s 1472 google.com # macOS, -D = don't fragment
# Если пакет 1500 байт (1472 payload + 28 IP/ICMP headers) проходит, MTU >= 1500
# Если получаете 'Message too long' -- MTU меньше
Это была проблема в эпоху ADSL: PPPoE заголовки уменьшали MTU до 1492 байт, и некоторые сайты не открывались, потому что серверы слали 1500-байтные пакеты с DF (Don’t Fragment), которые не проходили. Решение — MSS clamping на router’е.
Топология — как nodes соединяются
Topology — это форма сети. Как nodes физически соединены друг с другом.
В современных сетях преобладает hybrid: внутри одного дата-центра star/tree, между дата-центрами одного провайдера mesh, между провайдерами — мощный mesh на уровне backbone.
Для вас, инженера-программиста, топология обычно не важна напрямую. Но она проясняет, почему сетевые задержки такие, какие они есть. Например, два инстанса в одном AZ AWS — 0.1-0.5 мс (star). Между AZ — 1-2 мс (tree). Между регионами — 50-200 мс (mesh через backbone).
Попробуй сам
Посмотрите своими глазами все эти сущности в реальной сети.
# 1. Свои интерфейсы (links)
ip link show 2>/dev/null || ifconfig
# Найдите свой основной (en0 или eth0). Запомните его имя
# 2. Свои IP-адреса (для своего host)
ip addr show 2>/dev/null || ifconfig | grep 'inet '
# Найдите свой основной IP (обычно 192.168.x.y или 10.x.y.z)
# 3. Default gateway -- ближайший router
ip route show default 2>/dev/null || route -n get default | grep gateway
# Это IP вашего домашнего роутера или офисного
# 4. Все nodes между вами и google.com
traceroute -m 30 google.com
# Каждая строка -- это node на пути
# 5. Размер пакета и MTU
ping -c 3 -M do -s 1472 google.com 2>/dev/null || ping -c 3 -D -s 1472 google.com
# 6. Захватить пакеты на 5 секунд
sudo tcpdump -i en0 -c 20
# Каждая строка -- один packet. Видите src и dst адреса
Посчитайте, сколько hop’ов до Google (это nodes), какой MTU у вашего link, сколько пакетов в секунду генерирует ваш браузер, когда вы открываете обычный сайт. Эти цифры — ваш базовый sense of scale.
Loopback и Unix-сокеты: коммуникация внутри одного хоста Виртуальные links Docker: veth, bridge и overlay