9.20. Подведение итогов¶
Вы прошли по слоям, которые сетевое сообщение пересекает на пути от камеры к остальному миру:
Мотивация – сети существуют потому, что прямое соединение проводами перестаёт масштабироваться в тот момент, когда поговорить нужно более чем паре устройств, или когда собеседник находится не на том же проводе, или когда много программ одновременно используют один и тот же канал. Ответ – разделяемая среда, логические адреса и маршрутизация.
Многоуровневая модель – пять слоёв, каждый из которых решает одну задачу и предлагает чистый интерфейс следующему. Физический и канальный слои занимаются битами и кадрами между непосредственными соседями, сетевой слой – адресацией и маршрутизацией по интернету, транспортный слой – доставкой от программы к программе, а прикладные протоколы строятся на всём этом.
Нижние слои – Ethernet и Wi-Fi как практические канальные технологии; MAC-адреса идентифицируют оборудование в локальном сегменте. Модуль камеры
networkпредоставляет одну ручку, о которой стоит знать: к какой сети Wi-Fi подключаться. После этого всё, что ниже, происходит автоматически.Сетевой слой (IP) – адреса IPv4 и IPv6 идентифицируют узлы независимо от того, в какой кабель они воткнуты. Маршрутизаторы перебрасывают пакеты между локальными сегментами, пока те не достигнут цели. Диапазоны частных адресов и NAT – это причина, по которой у домашних и офисных сетей есть собственное внутреннее адресное пространство и один общий публичный адрес на границе; исходящий трафик работает свободно, входящему нужна помощь.
Транспортный слой – порты идентифицируют программы внутри узла; полная пара
(IP, port)идентифицирует один конкретный сокет. UDP – это тонкий слой, который отправляет по одной самодостаточной датаграмме за раз без каких-либо гарантий – быстрый, дешёвый и правильный инструмент, когда потери допустимы. TCP – ориентированный на соединение, надёжный, упорядоченный поток байтов – рабочая лошадка для большей части интернет-трафика, оплаченная одним обходом задержки на рукопожатие.API на Python –
socket.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оборачивает проводной формат в APIconnect/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, оборачивающим всё целиком.