9.20. Recapitulare

Ai parcurs nivelurile pe care le traversează un mesaj de rețea în drumul său de la cameră către restul lumii:

  • Motivația – rețelele există deoarece cablarea punct-la-punct nu mai poate fi scalată din momentul în care mai mult de câteva dispozitive trebuie să comunice, ori atunci când partenerul nu se află pe același cablu, ori când mai multe programe partajează simultan aceeași legătură. Răspunsul este mediul partajat, adresele logice și rutarea.

  • Modelul stratificat – cinci niveluri, fiecare rezolvând câte o problemă și oferind o interfață curată către următorul. Nivelurile fizic și legătură gestionează biții și cadrele între vecinii imediați, nivelul rețea gestionează adresarea și rutarea de-a lungul internetului, nivelul transport gestionează livrarea de la program la program, iar protocoalele de aplicație se construiesc peste toate acestea.

  • Nivelurile inferioare – Ethernet și Wi-Fi ca tehnologii practice de legătură; adresele MAC identifică hardware-ul pe un segment local. Modulul network al camerei expune un singur buton care merită cunoscut: la ce rețea Wi-Fi să se conecteze. După aceea, tot ce este dedesubt este automat.

  • Nivelul rețea (IP) – adresele IPv4 și IPv6 identifică gazdele independent de cablul în care sunt conectate. Routerele transmit pachetele între segmentele locale, sărind din unul în altul, până când acestea sosesc. Intervalele de adrese private și NAT sunt motivul pentru care rețelele de acasă și de birou au propriul spațiu de adrese intern și o singură adresă publică partajată la margine; traficul de ieșire funcționează liber, cel de intrare are nevoie de ajutor.

  • Nivelul transport – porturile identifică programele din interiorul unei gazde; perechea completă (IP, port) identifică un anumit socket. UDP este un strat subțire care trimite câte o datagramă autonomă, fără garanții – rapid, ieftin și instrumentul potrivit atunci când pierderea este acceptabilă. TCP este un flux de octeți orientat pe conexiune, fiabil și ordonat – calul de povară al celei mai mari părți a traficului din internet, plătit cu latența unui singur dus-întors de strângere de mână.

  • API-ul Pythonsocket.socket este singura clasă pentru ambele protocoale. sendto() / recvfrom() pentru UDP; tiparele connect-sau-listen plus send() / recv() pentru TCP. Socket-urile se împerechează curat cu asyncio: asyncio.open_connection() și asyncio.start_server() oferă fiecărei conexiuni TCP o pereche reader/writer, astfel încât multe conversații concurente să partajeze o singură buclă de evenimente fără fire de execuție.

  • Nume și timpsocket.getaddrinfo() transformă un nume precum example.com într-o adresă IP gata de a fi predată unui socket. network.hostname() setează numele propriu al camerei, pe care routerele îl înregistrează în DNS-ul lor local și pentru care răspunde și serverul mDNS încorporat al camerei, sub forma <name>.local. ntptime.settime() este aceeași idee de „caută un lucru în rețea”, aplicată orei de perete, setând ceasul de la bord la UTC de la un server NTP public.

  • Criptaressl învelește un socket în TLS. Camera vine fără un magazin de autorități de certificare, astfel încât, din start, obții doar criptare – conversația nu mai este în clar, dar camera nu verifică cine a răspuns. Pentru autentificare reală – verificarea serverelor HTTPS publice, rularea camerei ca server TLS, TLS mutual – fluxul de lucru bazat pe certificate este tratat în Lucrul cu certificate TLS. DTLS (TLS peste UDP) folosește același modul în același mod.

  • Un protocol de aplicație real – MQTT ca exemplu lucrat în care fiecare nivel de dedesubt este cablat împreună. Un octet de 1 octet pentru tip-și-flag-uri, un câmp de lungime rămasă cu lungime variabilă, un subiect UTF-8 prefixat cu lungimea și payload-ul, toate călătorind peste TCP (și, opțional, în interiorul TLS) către un broker care distribuie mesajul fiecărui abonat la subiectul respectiv. Clientul mqtt inclus învelește formatul de pe fir într-un API connect / publish / subscribe suficient de mic încât să fie citit dintr-o singură ședință.

Asta este suficient pentru a scrie aplicații pentru cameră care comunică cu alte mașini, publică date către servicii la distanță, acceptă conexiuni de la clienți din rețeaua locală și fac toate acestea concomitent cu restul activității camerei.

9.20.1. Folosirea acestei referințe mai târziu

Tratează capitolele despre rețelistică drept material de referință; revenirea pentru forma exactă a unui ascultător UDP sau a tiparului TLS-cu-asyncio este utilizarea avută în vedere. Paginile de referință network — configurarea rețelei, socket — modulul socket, ssl — modulul SSL/TLS și ntptime — client NTP simplu enumeră fiecare metodă, flag și constantă într-un singur loc, atunci când întrebarea este doar „care este numele exact al acestui apel”.

9.20.2. Încotro de aici

Serverele web sunt următorul subiect major. Cu socket-urile funcționale și cu TLS disponibil, următorul nivel firesc sunt protocoalele care se construiesc peste ele: HTTP pentru servirea de conținut și API-uri, WebSockets pentru menținerea conexiunilor deschise în ambele sensuri și micile framework-uri care ascund codul repetitiv. Tot ce ține de această secțiune se transferă mai departe – un server web este, până la urmă, doar un server TCP care vorbește HTTP pe socket-urile sale acceptate, adesea cu TLS învelind întregul ansamblu.