9.6. Пакеты и маршрутизация¶
IP-адрес говорит, кому предназначено сообщение. Механизм, который фактически его доставляет, называется маршрутизацией, и это процесс «переход за переходом», в ходе которого пакет путешествует из локальной сети отправителя в локальную сеть получателя, возможно, очень далёкую.
9.6.1. Кратко о пакете¶
Пакет – это единица работы уровня IP, фрагмент байтов с небольшим заголовком и полезной нагрузкой. В заголовке есть два поля, важные для маршрутизации:
IP-адрес источника (откуда пришёл пакет).
IP-адрес назначения (куда он направляется).
Полезная нагрузка – это всё, что транспортный уровень попросил доставить сетевой уровень. Заголовок пакета также содержит счётчик time-to-live, контрольную сумму по заголовку и несколько управляющих флагов. Ни к чему из этого код Python на камере напрямую не обращается.
Пакеты не обещают ничего большего, чем «мы попытались» – они могут быть потеряны, продублированы или доставлены не по порядку. Надёжность и упорядочивание – это задачи, которые решает транспортный уровень выше; сетевой уровень просто делает всё возможное, чтобы переслать каждый пакет к его назначению.
9.6.2. Переход за переходом¶
Пакет покидает камеру и прибывает на первое устройство, которое не находится в локальном сегменте камеры: шлюз по умолчанию. (На предыдущей странице упоминалось, что DHCP выдаёт камере адрес шлюза при поднятии сети.) Это устройство – маршрутизатор, коробка, чья задача – принимать пакеты, смотреть на их назначение и пересылать их дальше.
Пакет от камеры к назначению перескакивает между маршрутизаторами, каждый из которых на шаг ближе.¶
У маршрутизатора есть таблица маршрутизации – список вида «для назначений, соответствующих этому шаблону, отправлять пакет через этот интерфейс». Для назначений в той же сети, что и камера, запись говорит «отправить обратно по тому кабелю, по которому он пришёл». Для назначений в более широком интернете запись говорит «отправить вышестоящему маршрутизатору». Для известных шаблонов назначений (корпоративная VPN, сеть конкретного делового партнёра, спутниковый канал) у маршрутизатора может быть более конкретная запись, переопределяющая значение по умолчанию.
Вышестоящий маршрутизатор делает то же самое. И следующий. И следующий. Каждый переход одинаков по форме: принять пакет, найти назначение в таблице, отправить через нужный интерфейс. В конце концов пакет прибывает на маршрутизатор, который находится в том же локальном сегменте, что и IP назначения. Этот маршрутизатор выполняет финальный переход, назначение получает пакет, и поездка окончена.
9.6.3. Конечные точки не знают маршрута¶
Камера, отправляющая пакет удалённому серверу, не знает, как пакет туда доберётся. Она знает лишь IP назначения и адрес собственного шлюза по умолчанию. Всё, что между ними – какие маршрутизаторы, какие оптоволоконные линии, какие подводные кабели – решают по ходу дела маршрутизаторы вдоль пути на основе собственных таблиц. Сами маршрутизаторы знают лишь своих непосредственных соседей и примерное направление к распространённым назначениям; ни одно устройство в интернете не имеет его полной карты.
Именно эта децентрализация и есть причина, по которой сеть продолжает работать, когда отдельные пути отказывают. Перерезанный кабель где-то посередине превращается в событие перемаршрутизации на нескольких маршрутизаторах; конечные точки этого вовсе не замечают. Это также причина, по которой пакет от камеры в Токио к серверу в Дублине может пройти успешно, причём ни одна из сторон не знает, какие страны лежат между ними.
9.6.4. Что это означает для скрипта на Python¶
Задача камеры на сетевом уровне сводится к следующему:
Иметь IP-адрес.
Знать адрес шлюза по умолчанию (DHCP заполняет это автоматически).
Передавать исходящие пакеты, адресованные любому IP, этому шлюзу и доверять остальной части пути.
Скрипт никогда не выбирает маршрут, никогда не называет промежуточный переход и никогда не видит маршрутизаторов посередине. Он записывает IP назначения в пакет, и сетевой уровень берёт дело на себя. С точки зрения скрипта на Python вся маршрутизация – это просто свойство сети, к которой присоединилась камера: «шлюз отправляет пакеты куда-то, где они полезны для меня».
Транспортный уровень, который идёт следом, исходит из того, что маршрутизация просто работает, и поверх неё строит надёжность, упорядочивание и адресацию от программы к программе.