9.20. Подведение итогов

Вы прошли по слоям, которые сетевое сообщение пересекает на пути от камеры к остальному миру:

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

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

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

  • Сетевой слой (IP) – адреса IPv4 и IPv6 идентифицируют узлы независимо от того, в какой кабель они воткнуты. Маршрутизаторы перебрасывают пакеты между локальными сегментами, пока те не достигнут цели. Диапазоны частных адресов и NAT – это причина, по которой у домашних и офисных сетей есть собственное внутреннее адресное пространство и один общий публичный адрес на границе; исходящий трафик работает свободно, входящему нужна помощь.

  • Транспортный слой – порты идентифицируют программы внутри узла; полная пара (IP, port) идентифицирует один конкретный сокет. UDP – это тонкий слой, который отправляет по одной самодостаточной датаграмме за раз без каких-либо гарантий – быстрый, дешёвый и правильный инструмент, когда потери допустимы. TCP – ориентированный на соединение, надёжный, упорядоченный поток байтов – рабочая лошадка для большей части интернет-трафика, оплаченная одним обходом задержки на рукопожатие.

  • API на Pythonsocket.socket – единственный класс для обоих протоколов. sendto() / recvfrom() для UDP; шаблоны connect-или-listen плюс send() / recv() для TCP. Сокеты чисто сочетаются с asyncio: asyncio.open_connection() и asyncio.start_server() дают каждому TCP-соединению пару reader/writer, так что множество одновременных разговоров делят один цикл событий без потоков.

  • Имена и времяsocket.getaddrinfo() превращает имя вроде example.com в IP-адрес, готовый к передаче сокету. network.hostname() задаёт собственное имя камеры, под которым маршрутизаторы регистрируют её в своём локальном DNS и на которое встроенный mDNS-ответчик камеры отвечает как <name>.local. ntptime.settime() – та же идея «найти что-то в сети», применённая к настенному времени: установка бортовых часов в UTC с публичного NTP-сервера.

  • Шифрованиеssl оборачивает сокет в TLS. Камера поставляется без хранилища центров сертификации, поэтому из коробки вы получаете только шифрование – разговор больше не ведётся в открытом виде, но камера не проверяет, кто ответил. Для настоящей аутентификации – проверки публичных HTTPS-серверов, запуска камеры как TLS-сервера, взаимного TLS – рабочий процесс на основе сертификатов рассмотрен в Работа с сертификатами TLS. DTLS (TLS поверх UDP) использует тот же модуль тем же способом.

  • Реальный прикладной протокол – MQTT как проработанный пример всех нижележащих слоёв, соединённых вместе. Однобайтовое поле типа и флагов, поле переменной длины с оставшейся длиной, тема в UTF-8 с префиксом длины и полезная нагрузка – всё это путешествует поверх TCP (и при необходимости внутри TLS) к брокеру, который рассылает сообщение каждому подписчику на тему. Входящий в комплект клиент mqtt оборачивает проводной формат в API connect / publish / subscribe, достаточно небольшой, чтобы прочитать его за один присест.

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

9.20.1. Использование этого справочника в дальнейшем

Относитесь к главам о сетях как к справочному материалу; возвращаться за точной формой UDP-слушателя или шаблоном TLS-с-asyncio – это и есть предполагаемое использование. Справочные страницы network — настройка сети, socket — модуль socket, ssl — Модуль SSL/TLS и ntptime — простой NTP-клиент перечисляют каждый метод, флаг и константу в одном месте, когда вопрос лишь в том, «как точно называется этот вызов».

9.20.2. Куда двигаться дальше

Веб-серверы – следующая крупная тема. Когда сокеты работают и доступен TLS, естественный следующий слой выше – это протоколы, которые строятся на них: HTTP для отдачи контента и API, WebSockets для поддержания соединений открытыми в обе стороны и небольшие фреймворки, скрывающие шаблонный код. Всё из этого раздела переносится дальше – веб-сервер, в конце концов, – это просто TCP-сервер, который говорит по HTTP на своих принятых сокетах, часто с TLS, оборачивающим всё целиком.