9.20. Afronding¶
Je hebt de lagen doorlopen die een netwerkbericht passeert op weg van de camera naar de rest van de wereld:
De motivatie – netwerken bestaan omdat punt-tot-punt-bedrading niet meer schaalt op het moment dat meer dan een paar apparaten met elkaar moeten praten, of de tegenpartij niet op dezelfde draad zit, of veel programma’s tegelijk dezelfde verbinding delen. Het antwoord is gedeelde media, logische adressen en routering.
Het gelaagde model – vijf lagen, elk die één probleem oplost en een schone interface biedt aan de volgende. De fysieke en de linklaag verwerken bits en frames tussen directe buren, de netwerklaag verwerkt adressering en routering over het internet, de transportlaag verwerkt aflevering van programma naar programma, en applicatieprotocollen bouwen op dat alles voort.
De onderste lagen – Ethernet en Wi-Fi als praktische linktechnologieën; MAC-adressen identificeren hardware op een lokaal segment. De
network-module van de camera biedt één knop die het waard is om te kennen: met welk Wi-Fi-netwerk verbinding te maken. Daarna gaat alles eronder automatisch.De netwerklaag (IP) – IPv4- en IPv6-adressen identificeren hosts onafhankelijk van de kabel waarin ze zijn aangesloten. Routers laten pakketten van het ene lokale segment naar het andere hoppen totdat ze aankomen. Privé-adresbereiken en NAT zijn de reden waarom thuis- en kantoornetwerken hun eigen interne adresruimte hebben en één gedeeld openbaar adres aan de rand; uitgaand verkeer werkt vrijelijk, inkomend heeft hulp nodig.
De transportlaag – poorten identificeren programma’s binnen een host; het volledige
(IP, port)-paar identificeert één specifieke socket. UDP is een dunne laag die één op zichzelf staand datagram per keer verstuurt zonder garanties – snel, goedkoop, en het juiste gereedschap wanneer verlies acceptabel is. TCP is een verbindingsgeoriënteerde, betrouwbare, geordende bytestroom – het werkpaard voor het grootste deel van het internetverkeer, betaald met één heen-en-terugreis aan handshakelatentie.De Python-API –
socket.socketis de ene klasse voor beide protocollen.sendto()/recvfrom()voor UDP; de connect-of-listen-patronen plussend()/recv()voor TCP. Sockets passen netjes samen metasyncio:asyncio.open_connection()enasyncio.start_server()geven elke TCP-verbinding een reader/writer-paar, zodat veel gelijktijdige conversaties één event loop delen zonder threading.Namen en tijd –
socket.getaddrinfo()zet een naam alsexample.comom in een IP-adres dat klaar is om aan een socket te worden gegeven.network.hostname()stelt de eigen naam van de camera in, die routers registreren onder hun lokale DNS en waarvoor de ingebouwde mDNS-responder van de camera antwoordt als<name>.local.ntptime.settime()is hetzelfde idee van “iets opzoeken op het netwerk” toegepast op de kloktijd, waarbij de ingebouwde klok wordt ingesteld op UTC van een openbare NTP-server.Versleuteling –
sslverpakt een socket in TLS. De camera wordt geleverd zonder opslag van certificeringsautoriteiten, dus standaard krijg je alleen versleuteling – de conversatie is niet langer onversleuteld, maar de camera verifieert niet wie er antwoordde. Voor echte authenticatie – het verifiëren van openbare HTTPS-servers, de camera als TLS-server draaien, wederzijdse TLS – wordt de op certificaten gebaseerde workflow behandeld in Werken met TLS-certificaten. DTLS (TLS over UDP) gebruikt dezelfde module op dezelfde manier.Een echt applicatieprotocol – MQTT als het uitgewerkte voorbeeld van elke laag eronder die met elkaar verbonden is. Een byte van 1 byte met type-en-vlaggen, een veld met variabele lengte voor de resterende lengte, een lengtegeprefixt UTF-8-onderwerp, en de payload, allemaal reizend over TCP (en optioneel binnen TLS) naar een broker die het bericht uitwaaiert naar elke abonnee op het onderwerp. De meegeleverde
mqtt-client verpakt het draadformaat in eenconnect/publish/subscribe-API die klein genoeg is om in één zitting te lezen.
Dat is genoeg om cameraapplicaties te schrijven die met andere machines praten, gegevens publiceren naar externe diensten, verbindingen accepteren van clients op het lokale netwerk, en dit alles gelijktijdig met de rest van het werk van de camera doen.
9.20.1. Deze naslag later gebruiken¶
Behandel de netwerkhoofdstukken als naslagmateriaal; terugkomen voor de exacte vorm van een UDP-listener of het TLS-met-asyncio-patroon is het bedoelde gebruik. De naslagpagina’s network — netwerkconfiguratie, socket — socket-module, ssl — SSL/TLS-module en ntptime — eenvoudige NTP-client sommen elke methode, vlag en constante op één plek op wanneer de vraag alleen is “wat is de exacte naam van deze aanroep”.
9.20.2. Waar ga je hierna naartoe¶
Webservers is het volgende grote onderwerp. Met werkende sockets en beschikbare TLS is de natuurlijke volgende laag erbovenop de protocollen die daarop voortbouwen: HTTP voor het serveren van content en API’s, WebSockets om verbindingen in beide richtingen open te houden, en de kleine frameworks die de standaardcode verbergen. Alles uit deze sectie wordt meegenomen – een webserver is immers gewoon een TCP-server die HTTP spreekt op zijn geaccepteerde sockets, vaak met TLS om het geheel heen.