9.20. Podsumowanie

Przeszedłeś przez warstwy, które wiadomość sieciowa pokonuje w drodze od kamery do reszty świata:

  • Motywacja – sieci istnieją, ponieważ okablowanie punkt-punkt przestaje się skalować w chwili, gdy więcej niż kilka urządzeń musi rozmawiać, gdy druga strona nie jest na tym samym przewodzie albo gdy wiele programów współdzieli to samo łącze naraz. Odpowiedzią są media współdzielone, adresy logiczne i routing.

  • Model warstwowy – pięć warstw, z których każda rozwiązuje jeden problem i oferuje czysty interfejs dla następnej. Warstwy fizyczna i łącza obsługują bity i ramki między bezpośrednimi sąsiadami, warstwa sieciowa obsługuje adresowanie i routing w internecie, warstwa transportowa obsługuje dostarczanie między programami, a protokoły aplikacyjne budują na tym wszystkim.

  • Warstwy najniższe – Ethernet i Wi-Fi jako praktyczne technologie łącza; adresy MAC identyfikują sprzęt w lokalnym segmencie. Moduł network kamery udostępnia jedno pokrętło warte poznania: do której sieci Wi-Fi dołączyć. Potem wszystko poniżej dzieje się automatycznie.

  • Warstwa sieciowa (IP) – adresy IPv4 i IPv6 identyfikują hosty niezależnie od tego, do którego kabla są podłączone. Routery przeskakują pakiety między lokalnymi segmentami, aż dotrą one do celu. Prywatne zakresy adresów i NAT to powód, dla którego sieci domowe i biurowe mają własną wewnętrzną przestrzeń adresową i jeden współdzielony adres publiczny na brzegu; ruch wychodzący działa swobodnie, ruch przychodzący wymaga pomocy.

  • Warstwa transportowa – porty identyfikują programy wewnątrz hosta; pełna para (IP, port) identyfikuje jedno konkretne gniazdo. UDP to cienka warstwa, która wysyła jeden samowystarczalny datagram naraz bez żadnych gwarancji – szybka, tania i odpowiednia, gdy utrata jest akceptowalna. TCP to zorientowany na połączenie, niezawodny, uporządkowany strumień bajtów – koń pociągowy większości ruchu w internecie, okupiony jednym czasem podróży w obie strony na opóźnienie uścisku dłoni.

  • Interfejs API Pythonasocket.socket to jedna klasa dla obu protokołów. sendto() / recvfrom() dla UDP; wzorce connect-lub-listen plus send() / recv() dla TCP. Gniazda dobrze współgrają z asyncio: asyncio.open_connection() i asyncio.start_server() dają każdemu połączeniu TCP parę reader/writer, dzięki czemu wiele równoczesnych konwersacji współdzieli jedną pętlę zdarzeń bez wątków.

  • Nazwy i czassocket.getaddrinfo() zamienia nazwę taką jak example.com na adres IP gotowy do przekazania gniazdu. network.hostname() ustawia własną nazwę kamery, którą routery rejestrują w swoim lokalnym DNS i na którą wbudowany w kamerę responder mDNS odpowiada jako <name>.local. ntptime.settime() to ta sama idea „wyszukaj coś w sieci” zastosowana do czasu zegarowego, ustawiająca pokładowy zegar na UTC z publicznego serwera NTP.

  • Szyfrowaniessl opakowuje gniazdo w TLS. Kamera dostarczana jest bez magazynu urzędów certyfikacji, więc od razu po wyjęciu z pudełka otrzymujesz jedynie szyfrowanie – konwersacja nie jest już jawna, ale kamera nie weryfikuje, kto odpowiedział. Dla prawdziwego uwierzytelniania – weryfikacji publicznych serwerów HTTPS, uruchamiania kamery jako serwera TLS, wzajemnego TLS – przepływ pracy oparty na certyfikatach jest omówiony w Praca z certyfikatami TLS. DTLS (TLS przez UDP) używa tego samego modułu w ten sam sposób.

  • Prawdziwy protokół aplikacyjny – MQTT jako przerobiony przykład każdej leżącej poniżej warstwy połączonej ze sobą. Jednobajtowy bajt typu i flag, pole o zmiennej długości z pozostałą długością, poprzedzony długością temat w UTF-8 oraz ładunek – wszystko podróżujące przez TCP (i opcjonalnie wewnątrz TLS) do brokera, który rozsyła wiadomość do każdego subskrybenta danego tematu. Dołączony klient mqtt opakowuje format przewodowy w interfejs API connect / publish / subscribe na tyle mały, że da się go przeczytać za jednym posiedzeniem.

To wystarczy, by pisać aplikacje kamery, które rozmawiają z innymi maszynami, publikują dane do zdalnych usług, przyjmują połączenia od klientów w sieci lokalnej i robią to wszystko równolegle z resztą pracy kamery.

9.20.1. Korzystanie z tej dokumentacji w przyszłości

Traktuj rozdziały o sieci jak materiał referencyjny; powracanie po dokładny kształt nasłuchującego UDP lub wzorzec TLS-z-asyncio jest zamierzonym sposobem użycia. Strony referencyjne network — konfiguracja sieci, socket — moduł socket, ssl — moduł SSL/TLS oraz ntptime — prosty klient NTP wymieniają każdą metodę, flagę i stałą w jednym miejscu, gdy pytanie brzmi po prostu „jaka jest dokładna nazwa tego wywołania”.

9.20.2. Dokąd dalej

Serwery WWW to kolejny duży temat. Mając działające gniazda i dostępny TLS, naturalną kolejną warstwą wyżej są protokoły, które na nich budują: HTTP do serwowania treści i API, WebSockets do utrzymywania połączeń otwartych w obie strony oraz małe frameworki ukrywające szablonowy kod. Wszystko z tej sekcji przenosi się dalej – serwer WWW jest w końcu po prostu serwerem TCP, który mówi HTTP na swoich przyjętych gniazdach, często z TLS opakowującym całość.