9.20. Sammanfattning

Du har gått igenom de lager ett nätverksmeddelande korsar på sin väg från kameran till resten av världen:

  • Motivationen – nätverk finns eftersom punkt-till-punkt-kabeldragning slutar skala i samma stund som mer än ett par enheter behöver prata, eller motparten inte är på samma kabel, eller många program delar samma länk samtidigt. Svaret är delade media, logiska adresser och routing.

  • Den lagerindelade modellen – fem lager, vart och ett löser ett problem och erbjuder ett rent gränssnitt till nästa. Fysiska lagret och länklagret hanterar bitar och bildrutor mellan omedelbara grannar, nätverkslagret hanterar adressering och routing över internet, transportlagret hanterar leverans från program till program, och applikationsprotokoll bygger på allt detta.

  • De nedre lagren – Ethernet och Wi-Fi som praktiska länkteknologier; MAC-adresser identifierar hårdvara på ett lokalt segment. Kamerans network-modul exponerar en inställning värd att känna till: vilket Wi-Fi-nätverk som ska anslutas till. Efter det är allt nedanför automatiskt.

  • Nätverkslagret (IP) – IPv4- och IPv6-adresser identifierar värdar oberoende av vilken kabel de är inkopplade i. Routrar hoppar paket mellan lokala segment tills de anländer. Privata adressintervall och NAT är anledningen till att hem- och kontorsnätverk har sitt eget interna adressutrymme och en delad publik adress vid kanten; utgående trafik fungerar fritt, inkommande behöver hjälp.

  • Transportlagret – portar identifierar program inuti en värd; det fullständiga paret (IP, port) identifierar en specifik socket. UDP är ett tunt lager som skickar ett självständigt datagram i taget utan några garantier – snabbt, billigt och rätt verktyg när förlust är acceptabel. TCP är en anslutningsorienterad, pålitlig, ordnad byteström – arbetshästen för det mesta av internettrafiken, betald med en tur-och-retur av handskakningslatens.

  • Python-API:tsocket.socket är den enda klassen för båda protokollen. sendto() / recvfrom() för UDP; connect-eller-listen-mönstren plus send() / recv() för TCP. Socketar passar rent ihop med asyncio: asyncio.open_connection() och asyncio.start_server() ger varje TCP-anslutning ett läsar/skrivar-par, så att många samtidiga samtal delar en enda händelseloop utan trådning.

  • Namn och tidsocket.getaddrinfo() omvandlar ett namn som example.com till en IP-adress redo att lämnas över till en socket. network.hostname() sätter kamerans eget namn, som routrar registrerar under sin lokala DNS och som kamerans inbyggda mDNS-svarare svarar för som <name>.local. ntptime.settime() är samma idé om att ”slå upp en sak på nätverket” tillämpad på väggklockans tid, som ställer in den inbyggda klockan till UTC från en publik NTP-server.

  • Krypteringssl kapslar in en socket i TLS. Kameran levereras utan något lager för certifikatutfärdare, så direkt ur kartongen får du endast kryptering – samtalet är inte längre i klartext, men kameran verifierar inte vem som svarade. För riktig autentisering – att verifiera publika HTTPS-servrar, köra kameran som en TLS-server, ömsesidig TLS – behandlas det certifikatbaserade arbetsflödet i Arbeta med TLS-certifikat. DTLS (TLS över UDP) använder samma modul på samma sätt.

  • Ett riktigt applikationsprotokoll – MQTT som det utarbetade exemplet på varje lager under det sammankopplat. En 1-byte stor typ-och-flaggor-byte, ett fält med variabel längd för återstående längd, ett längdprefixerat UTF-8-ämne och nyttolasten, allt resande över TCP (och valfritt inuti TLS) till en mäklare som sprider meddelandet vidare till varje prenumerant på ämnet. Den medföljande mqtt-klienten kapslar in trådformatet i ett connect / publish / subscribe-API litet nog att läsa i en sittning.

Det räcker för att skriva kameraapplikationer som pratar med andra maskiner, publicerar data till fjärrtjänster, accepterar anslutningar från klienter på det lokala nätverket, och gör allt detta samtidigt med resten av kamerans arbete.

9.20.1. Att använda denna referens senare

Behandla nätverkskapitlen som referensmaterial; att återkomma för den exakta formen på en UDP-lyssnare eller TLS-med-asyncio-mönstret är den avsedda användningen. Referenssidorna network — nätverkskonfiguration, socket — socket-modul, ssl — SSL/TLS-modul och ntptime — enkel NTP-klient listar varje metod, flagga och konstant på ett ställe när frågan bara är ”vad är det exakta namnet på detta anrop”.

9.20.2. Vart man går härifrån

Webbservrar är nästa stora ämne. Med socketar som fungerar och TLS tillgängligt är det naturliga nästa lagret uppåt de protokoll som bygger på dem: HTTP för att servera innehåll och API:er, WebSockets för att hålla anslutningar öppna åt båda håll, och de små ramverken som döljer standardkoden. Allt från detta avsnitt förs vidare – en webbserver är trots allt bara en TCP-server som talar HTTP på sina accepterade socketar, ofta med TLS som kapslar in det hela.