9.20. Підсумок

Ви пройшли через рівні, які долає мережеве повідомлення на шляху від камери до решти світу:

  • Мотивація – мережі існують, оскільки пряме з’єднання перестає масштабуватись, щойно більш ніж кілька пристроїв мають спілкуватись, або counterpart перебуває не на тому ж дроті, або багато програм спільно використовують один канал. Відповіддю є спільне середовище, логічні адреси та маршрутизація.

  • Багаторівнева модель – п’ять рівнів, кожен вирішує одну задачу і надає чистий інтерфейс наступному. Фізичний та канальний рівні обробляють біти та кадри між безпосередніми сусідами, мережевий рівень вирішує адресацію та маршрутизацію через інтернет, транспортний рівень забезпечує доставку між програмами, а прикладні протоколи будуються на всьому цьому.

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

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

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

  • Python APIsocket.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-responder камери під назвою <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 — модуль сокетів, ssl — модуль SSL/TLS та ntptime — простий NTP-клієнт перераховують кожен метод, прапор і константу в одному місці, коли питання лише «яка точна назва цього виклику».

9.20.2. Куди рухатись далі

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