9.6. Пакеты и маршрутизация

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

9.6.1. Кратко о пакете

Пакет – это единица работы уровня IP, фрагмент байтов с небольшим заголовком и полезной нагрузкой. В заголовке есть два поля, важные для маршрутизации:

  • IP-адрес источника (откуда пришёл пакет).

  • IP-адрес назначения (куда он направляется).

Полезная нагрузка – это всё, что транспортный уровень попросил доставить сетевой уровень. Заголовок пакета также содержит счётчик time-to-live, контрольную сумму по заголовку и несколько управляющих флагов. Ни к чему из этого код Python на камере напрямую не обращается.

Пакеты не обещают ничего большего, чем «мы попытались» – они могут быть потеряны, продублированы или доставлены не по порядку. Надёжность и упорядочивание – это задачи, которые решает транспортный уровень выше; сетевой уровень просто делает всё возможное, чтобы переслать каждый пакет к его назначению.

9.6.2. Переход за переходом

Пакет покидает камеру и прибывает на первое устройство, которое не находится в локальном сегменте камеры: шлюз по умолчанию. (На предыдущей странице упоминалось, что DHCP выдаёт камере адрес шлюза при поднятии сети.) Это устройство – маршрутизатор, коробка, чья задача – принимать пакеты, смотреть на их назначение и пересылать их дальше.

Диаграмма, показывающая пять коробок. Слева камера с меткой "10.0.0.42". Подключена к маршрутизатору с меткой "10.0.0.1 / 203.0.113.5". Затем последовательность из двух безымянных маршрутизаторов в середине. Затем маршрутизатор с меткой "198.51.100.1 / 198.51.100.x". Наконец сервер с меткой "198.51.100.20". Стрелка с меткой "назначение: 198.51.100.20" движется вдоль цепочки слева направо.

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

У маршрутизатора есть таблица маршрутизации – список вида «для назначений, соответствующих этому шаблону, отправлять пакет через этот интерфейс». Для назначений в той же сети, что и камера, запись говорит «отправить обратно по тому кабелю, по которому он пришёл». Для назначений в более широком интернете запись говорит «отправить вышестоящему маршрутизатору». Для известных шаблонов назначений (корпоративная VPN, сеть конкретного делового партнёра, спутниковый канал) у маршрутизатора может быть более конкретная запись, переопределяющая значение по умолчанию.

Вышестоящий маршрутизатор делает то же самое. И следующий. И следующий. Каждый переход одинаков по форме: принять пакет, найти назначение в таблице, отправить через нужный интерфейс. В конце концов пакет прибывает на маршрутизатор, который находится в том же локальном сегменте, что и IP назначения. Этот маршрутизатор выполняет финальный переход, назначение получает пакет, и поездка окончена.

9.6.3. Конечные точки не знают маршрута

Камера, отправляющая пакет удалённому серверу, не знает, как пакет туда доберётся. Она знает лишь IP назначения и адрес собственного шлюза по умолчанию. Всё, что между ними – какие маршрутизаторы, какие оптоволоконные линии, какие подводные кабели – решают по ходу дела маршрутизаторы вдоль пути на основе собственных таблиц. Сами маршрутизаторы знают лишь своих непосредственных соседей и примерное направление к распространённым назначениям; ни одно устройство в интернете не имеет его полной карты.

Именно эта децентрализация и есть причина, по которой сеть продолжает работать, когда отдельные пути отказывают. Перерезанный кабель где-то посередине превращается в событие перемаршрутизации на нескольких маршрутизаторах; конечные точки этого вовсе не замечают. Это также причина, по которой пакет от камеры в Токио к серверу в Дублине может пройти успешно, причём ни одна из сторон не знает, какие страны лежат между ними.

9.6.4. Что это означает для скрипта на Python

Задача камеры на сетевом уровне сводится к следующему:

  • Иметь IP-адрес.

  • Знать адрес шлюза по умолчанию (DHCP заполняет это автоматически).

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

Скрипт никогда не выбирает маршрут, никогда не называет промежуточный переход и никогда не видит маршрутизаторов посередине. Он записывает IP назначения в пакет, и сетевой уровень берёт дело на себя. С точки зрения скрипта на Python вся маршрутизация – это просто свойство сети, к которой присоединилась камера: «шлюз отправляет пакеты куда-то, где они полезны для меня».

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