9.1. Зачем нужны сети¶
Управление аппаратурой дало камере способы общаться с конкретным другим устройством на конкретном другом проводе. UART между камерой и одной сопутствующей платой. I2C между камерой и датчиками, висящими на одной короткой шине. CAN между небольшим набором модулей, разделяющих одну надёжную шину. Каждый случай следует одной и той же схеме: две стороны (или небольшая известная группа), одна общая среда, соглашение между ними о том, что означают байты в этой среде.
9.1.1. Эта схема перестаёт масштабироваться¶
Шаблон «точка-точка» работает, пока оба конца находятся рядом, оба конца известны заранее и скрипт сам выбирает, по какому проводу он общается. Как только любое из этих ограничений нарушается, проводки становится недостаточно.
Множество собеседников. Сеть из пятидесяти камер, отчитывающихся одному серверу, нельзя соединить «один-к-одному»; на сервере не хватит UART, а прокладка кабелей была бы невозможна.
Собеседники не на том же проводе. Камера на заводе и панель управления в офисе на другом конце города не могут разделять последовательный кабель. Между ними должен существовать некий путь через ту инфраструктуру, которая уже проложена между двумя зданиями.
Собеседники не известны заранее. Камера, публикующая свои результаты в облако, не выбирает, с каким сервером она общается, в схеме проводки; адрес облака – это то, что скрипт ищет во время выполнения и куда направляет данные.
Множество программ на одном кабеле. Ноутбук сегодня запускает браузер, мессенджер, видеозвонок и резервное копирование – всё одновременно общается через один и тот же сетевой интерфейс. Провод не может быть «во владении» одного разговора так, как это происходит с UART.
Каждый из этих сбоев – это другой вид проблемы адресации. Решение их всех вместе требует большего, чем провод и скорость передачи.
9.1.2. Что такое сеть¶
Сеть – это инфраструктура, которая позволяет любому из большого числа компьютеров обмениваться сообщениями с любым другим, без того чтобы каждой паре требовался собственный выделенный канал. Три свойства делают сеть чем-то большим, чем просто большой последовательный кабель:
Общая среда. Множество устройств подключается к одному и тому же кабелю, коммутатору или радиоканалу. Они чередуются или мультиплексируются, чтобы на одном физическом канале умещалось более одного разговора.
Логические адреса. У каждого устройства есть номер, который идентифицирует его независимо от того, в какой кабель оно включено. Отправка сообщения означает запись этого номера на сообщении, а не подключение конкретного провода.
Маршрутизация. Когда отправитель и получатель не находятся в одном локальном сегменте, инфраструктура между ними переносит сообщение от узла к узлу. Конечные точки не знают маршрута; они просто знают адреса друг друга.
Ноутбук в офисном Wi-Fi, обращающийся к серверу в удалённом дата-центре, использует все три. Канал Wi-Fi – это общая радиосреда; у ноутбука и сервера есть свои собственные логические адреса; сообщение прокладывает себе путь через ту инфраструктуру, которая находится между ними, пересылаясь по одному узлу за раз. Пользователь нажимает на ссылку, ноутбук отправляет пакет, а сеть делает всё остальное.
9.1.3. А как насчёт камеры?¶
Камера играет в сети ровно ту же роль, что и ноутбук. Она получает логический адрес, когда присоединяется к сети, адресует исходящие сообщения по логическим адресам других устройств и позволяет инфраструктуре маршрутизировать их.
От глав об управлении аппаратурой меняется интерфейс. Вместо открытия экземпляра UART и записи в него байтов скрипт открывает сокет и записывает байты в него. Сокет – это конечная точка в сети, точно так же, как экземпляр UART является конечной точкой в проводе. Части между сокетом и проводом – кадры, пакеты, таблицы маршрутизации, коммутаторы, радиомодули – все находятся ниже и по большей части невидимы для кода Python.
Следующие страницы подробно описывают эти части, уровень за уровнем, чтобы абстракция «открой сокет и отправь байты» казалась неизбежной, а не волшебной.