Как пакет находит дорогу
Таблица маршрутизации, самый длинный префикс и шлюз по умолчанию — а ещё почему интернет это сеть сетей и почему traceroute вообще видит промежуточные узлы.
В младшем грейде вы делили 192.168.1.0/24 на подсети и выясняли, какие адреса лежат в одном сегменте. Это ответ на вопрос про адреса. Но остался следующий: пакет уходит с вашей машины с адресом назначения, а у машины один кабель, один Wi-Fi и ни малейшего представления, где этот адрес находится физически. Поиск дороги — отдельная работа, и делают её маршрутизаторы, шаг за шагом.
У каждого хоста и каждого маршрутизатора есть таблица маршрутизации: список направлений, куда он уже умеет дойти. Каждая запись — это префикс сети плюс две вещи: следующий узел (какому соседу отдать пакет) и исходящий интерфейс (в какой кабель или эфир его положить). Ни одна запись не описывает весь путь. Запись описывает один шаг, а у следующего маршрутизатора своя таблица.
$ ip route
default via 192.168.1.1 dev wlan0 proto dhcp metric 600
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.42Типичная таблица маршрутизации ноутбука: три записи покрывают весь интернет.Когда адрес назначения подходит сразу под несколько записей, маршрутизатор не берёт первую попавшуюся и вообще не смотрит на порядок строк. Он применяет правило самого длинного префикса: побеждает запись с большим числом бит сети, потому что она точнее. /32 — одна машина, /24 — одна подсеть, /16 — группа подсетей, /0 подходит под любой существующий адрес и поэтому идёт последним. Эта последняя запись — маршрут по умолчанию, а её следующий узел — шлюз по умолчанию, обычно тот маршрутизатор, который соединяет вашу сеть с провайдером.
destination next hop matched by
----------------- -------------- ------------------
10.8.0.7 direct (tun0) /24 10.8.0.0/24
10.8.5.7 192.168.1.1 /16 10.8.0.0/16
everything else 192.168.1.1 /0 defaultОдна и та же таблица, три разных адреса.Передача идёт узел за узлом, и каждый узел повторяет одно и то же решение независимо. Ваша машина проверяет, лежит ли адрес назначения в напрямую подключённой сети; если нет — пакет уходит на шлюз. Шлюз делает ту же проверку по своей таблице и передаёт пакет дальше, и так по цепочке. Каждый маршрутизатор переписывает заголовок канального уровня — MAC-адрес следующего узла — но IP-адреса не трогает. Нигде в пакете не записан пройденный путь, поэтому ответ может вернуться совсем другой дорогой.
laptop 192.168.1.42 --ttl 64--> router 203.0.113.1
router 203.0.113.1 --ttl 63--> transit 198.51.100.9
transit 198.51.100.9 --ttl 62--> server 93.184.216.34
reply comes back on a different path: routing is per packet, not per connectionTTL уменьшается на каждом узле. Дойдя до нуля, маршрутизатор выбрасывает пакет.TTL существует, чтобы пакет не кружил вечно, когда два маршрутизатора расходятся во мнениях. Traceroute превращает эту защиту в измерительный прибор. Он отправляет пакет с TTL 1: первый маршрутизатор уменьшает счётчик до нуля и отвечает сообщением ICMP time exceeded, выдавая свой адрес. Потом TTL 2, потом 3, и ответы выстраиваются по порядку. Звёздочка вместо адреса означает, что этому маршрутизатору запретили отвечать: путь существует, вы просто не видите этот узел. Поэтому честная проверка — traceroute на TCP-порт: множество сетей молча выбрасывает ICMP и при этом спокойно пропускает трафик, который вам действительно нужен.
$ traceroute -n 93.184.216.34
1 192.168.1.1 1.204 ms
2 10.44.0.1 7.881 ms
3 203.0.113.9 12.115 ms
4 198.51.100.9 95.402 ms
5 93.184.216.34 103.771 ms
$ traceroute -n -T -p 443 93.184.216.34
5 93.184.216.34 103.902 msУзлы появляются по порядку, потому что TTL растёт на единицу с каждым заходом.Внутри одной организации маршрутизаторы узнают маршруты автоматически, с помощью внутреннего протокола вроде OSPF. Между организациями работает BGP, и единица здесь не маршрутизатор, а автономная система: одна сеть под одним управлением с номером вида AS64500. Каждая система объявляет блоки адресов, до которых может дойти, а соседи передают эти объявления дальше, добавляя в путь свой номер. Поэтому у маршрутизатора к одному префиксу обычно несколько возможных путей, и он выбирает по политике: длина пути, коммерческие договорённости, локальные предпочтения. Карты интернета у него нет — есть набор утверждений о нём.
Ни одна центральная машина не знает интернет целиком. Вместо этого есть иерархия масштабов. Дома один маршрутизатор обслуживает одну подсеть. Провайдер держит тысячи маршрутизаторов под одним внутренним протоколом и прячет всё это за одним объявлением BGP. Выше несколько тысяч автономных систем обмениваются объявлениями между собой. Каждому уровню нижний нужен лишь как один достижимый блок — только поэтому таблица маршрутизации остаётся настолько маленькой, что её просматривают за микросекунды.
Практика
По таблице маршрутизации из теории: какую запись выберет ядро для пакета на адрес 10.8.5.7 и почему?
Подсказки
- Правило самого длинного префикса игнорирует порядок строк в таблице и сравнивает только длину префикса.
- Адрес 10.8.5.7 попадает в 10.8.0.0/16, но не попадает в 10.8.0.0/24.
- Маршрут по умолчанию — самый короткий возможный префикс: /0, он подходит под всё.
Сопоставьте части записи таблицы маршрутизации с тем, что каждая из них сообщает ядру.
Подсказки
- Спросите, сколько бит префикса маршрутизатор обязан сравнить: 0, 24 или 32.
- Следующий узел это адрес, а исходящий интерфейс это имя устройства вроде tun0 или wlan0.
- Один элемент в списке вообще не часть маршрута: это результат запроса о маршруте.
Расставьте шаги одного замера traceroute в том порядке, в каком они происходят в сети.
- 1первый маршрутизатор уменьшает TTL до 0 и выбрасывает пакет
- 2следующий замер уходит с TTL 2 и доходит на один узел дальше
- 3этот маршрутизатор отвечает ICMP time exceeded и выдаёт свой адрес
- 4отправить пробный пакет с TTL 1 в сторону назначения
Подсказки
- Traceroute отправляет пакеты с маленьким TTL и увеличивает его на единицу на каждом шаге.
- Отвечает тот узел, который выбросил пакет, а не предыдущий.
Вопросы по этому уроку
Зачем вообще учить сети?
Почти всё, что ты делаешь, в итоге с чем-то общается. Понимание того, как данные реально ходят, превращает «не работает» из загадки в список того, что можно проверить по очереди.
В чём реальная разница между TCP и UDP?
TCP следит, чтобы всё дошло и по порядку, и повторяет потерянное — за это платит временем. UDP отправляет и не оглядывается, поэтому видеозвонки и игры предпочитают его: опоздавший кадр хуже пропавшего.
Что такое DNS простыми словами?
Это телефонная книга интернета. Ты знаешь имя, а компьютеру нужен номер. DNS превращает имя вроде example.org в IP-адрес и запоминает ответ, чтобы не спрашивать каждый раз.
Это бесплатно?
Да. Первый уровень каждого предмета бесплатный и не требует аккаунта. Дальше уровни и старшие грейды платные — именно это позволяет проекту существовать.
На какой возраст рассчитано?
Для любознательных подростков примерно с 12 лет и для взрослых, начинающих с нуля. Опыт программирования не предполагается: уроки по сетям и физике не требуют математики сверх школьной.
Нужно ли уже уметь программировать?
Нет. Логика, физика и сети начинаются с нуля. Код ты пишешь в разделе языков — и он тоже начинается с самого начала.
Нужно что-то устанавливать?
Нет. Всё работает в браузере: теория, практика и интерактивные симуляции. Скачивать нечего и настраивать нечего.
Сколько времени занимает один предмет?
Урок — от 10 до 15 минут. Грейд «джун» это примерно 12–20 уроков, то есть несколько недель регулярных занятий, а не один вечер.
Обязательно идти по порядку?
Внутри грейда уровни открываются по очереди: каждый опирается на предыдущий. А между предметами ты свободен — начинай с логики, физики или сетей.