9.1. Зачем нужны сети

Управление аппаратурой дало камере способы общаться с конкретным другим устройством на конкретном другом проводе. UART между камерой и одной сопутствующей платой. I2C между камерой и датчиками, висящими на одной короткой шине. CAN между небольшим набором модулей, разделяющих одну надёжную шину. Каждый случай следует одной и той же схеме: две стороны (или небольшая известная группа), одна общая среда, соглашение между ними о том, что означают байты в этой среде.

9.1.1. Эта схема перестаёт масштабироваться

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

  • Множество собеседников. Сеть из пятидесяти камер, отчитывающихся одному серверу, нельзя соединить «один-к-одному»; на сервере не хватит UART, а прокладка кабелей была бы невозможна.

  • Собеседники не на том же проводе. Камера на заводе и панель управления в офисе на другом конце города не могут разделять последовательный кабель. Между ними должен существовать некий путь через ту инфраструктуру, которая уже проложена между двумя зданиями.

  • Собеседники не известны заранее. Камера, публикующая свои результаты в облако, не выбирает, с каким сервером она общается, в схеме проводки; адрес облака – это то, что скрипт ищет во время выполнения и куда направляет данные.

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

Каждый из этих сбоев – это другой вид проблемы адресации. Решение их всех вместе требует большего, чем провод и скорость передачи.

9.1.2. Что такое сеть

Сеть – это инфраструктура, которая позволяет любому из большого числа компьютеров обмениваться сообщениями с любым другим, без того чтобы каждой паре требовался собственный выделенный канал. Три свойства делают сеть чем-то большим, чем просто большой последовательный кабель:

  • Общая среда. Множество устройств подключается к одному и тому же кабелю, коммутатору или радиоканалу. Они чередуются или мультиплексируются, чтобы на одном физическом канале умещалось более одного разговора.

  • Логические адреса. У каждого устройства есть номер, который идентифицирует его независимо от того, в какой кабель оно включено. Отправка сообщения означает запись этого номера на сообщении, а не подключение конкретного провода.

  • Маршрутизация. Когда отправитель и получатель не находятся в одном локальном сегменте, инфраструктура между ними переносит сообщение от узла к узлу. Конечные точки не знают маршрута; они просто знают адреса друг друга.

Ноутбук в офисном Wi-Fi, обращающийся к серверу в удалённом дата-центре, использует все три. Канал Wi-Fi – это общая радиосреда; у ноутбука и сервера есть свои собственные логические адреса; сообщение прокладывает себе путь через ту инфраструктуру, которая находится между ними, пересылаясь по одному узлу за раз. Пользователь нажимает на ссылку, ноутбук отправляет пакет, а сеть делает всё остальное.

9.1.3. А как насчёт камеры?

Камера играет в сети ровно ту же роль, что и ноутбук. Она получает логический адрес, когда присоединяется к сети, адресует исходящие сообщения по логическим адресам других устройств и позволяет инфраструктуре маршрутизировать их.

От глав об управлении аппаратурой меняется интерфейс. Вместо открытия экземпляра UART и записи в него байтов скрипт открывает сокет и записывает байты в него. Сокет – это конечная точка в сети, точно так же, как экземпляр UART является конечной точкой в проводе. Части между сокетом и проводом – кадры, пакеты, таблицы маршрутизации, коммутаторы, радиомодули – все находятся ниже и по большей части невидимы для кода Python.

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