9.2. Gelaagde protocollen¶
Een frame van de camera naar een server in een andere stad sturen betekent meerdere problemen tegelijk oplossen. Het elektrische signaal moet de eerste draad overbruggen. De bytes op die draad moeten hun weg vinden door een lokale switch. Het lokale netwerk moet het bericht doorgeven aan wat zich tussen dat netwerk en de rest van het internet bevindt. De pakketten die de reis overleven moeten in de juiste volgorde weer in elkaar gezet worden. De ontvanger moet weten aan welk van zijn programma’s hij ze moet geven. En de bytes zelf moeten iets betekenen waarover beide kanten het eens zijn.
Proberen dat allemaal in één blok code op te lossen zou onbeheersbaar zijn. Het standaardantwoord is om de taak op te splitsen in lagen. Elke laag lost één goed gedefinieerd probleem op en biedt een eenvoudige dienst aan de laag erboven. Een programma praat altijd alleen met de laag er direct onder; de lagen daaronder zijn onzichtbaar.
Elke laag van een netwerkstack lost één probleem op en reikt een schone abstractie aan de volgende.¶
9.2.1. De vijf lagen¶
De onderstaande namen zijn degene die de rest van deze sectie gebruikt. Ze komen uit het standaardmodel waaromheen netwerken zijn ontworpen. De exacte grenzen tussen lagen zijn soms vaag, maar de rol die elke laag speelt is stabiel.
Fysieke laag. Verplaatst bits tussen twee apparaten op dezelfde draad of radio. Spanningsniveaus, lichtpulsen, RF-modulatie. De taak van de camera is hier voornamelijk de juiste kabel inpluggen of het juiste draadloze netwerk binnengaan; het silicium doet de rest.
Linklaag. Verplaatst frames (kleine stukjes bytes) tussen twee apparaten die een lokaal segment delen. Voegt hardware-adressen toe zodat elk frame naar één specifieke buur gestuurd kan worden. Ethernet en Wi-Fi zijn de twee linktechnologieën die de camera in de praktijk tegenkomt.
Netwerklaag. Verplaatst pakketten tussen elke twee apparaten op het internet, niet alleen op hetzelfde lokale segment. Voegt een adres op softwareniveau toe dat een host identificeert onafhankelijk van op welke kabel hij zit, en een routing-mechanisme dat een pakket van het ene lokale segment naar het volgende laat springen totdat het aankomt. Dit is de eerste laag waar de Python-code van de camera iets te zeggen begint te krijgen.
Transportlaag. Bovenop pakketten zitten en levering tussen programma’s op twee hosts aanbieden, niet alleen tussen de hosts zelf. Twee varianten komen veel voor: de ene levert een verbonden, geordende stroom bytes (het werkpaard voor het meeste verkeer), de andere levert op zichzelf staande berichten die onafhankelijk van elkaar reizen (gebruikt wanneer lage overhead belangrijker is dan garanties). Voegt poortnummers toe zodat meerdere programma’s op dezelfde host parallel gesprekken kunnen voeren.
Applicatielaag. Alles boven transport: de protocollen die de bytes betekenis geven. Degene die een webbrowser spreekt om pagina’s te laden – en degene achter vrijwel elke andere internetdienst die de lezer al elke dag gebruikt – bevinden zich hier. De tutorial behandelt transport diepgaand; deze laag krijgt een eigen vervolgsectie.
9.2.2. Hoe de lagen zich tijdens runtime stapelen¶
Wanneer de camera bytes over het netwerk verstuurt, voegt elke laag zijn eigen header vóór de data toe, zoals het nestelen van een envelop in een andere envelop:
De bytes van de applicatie gaan er eerst in.
De transportlaag verpakt ze met een kleine header die aangeeft bij welk programma ze horen (het poortnummer).
De netwerklaag verpakt dat met een header die aangeeft voor welke host ze bestemd zijn (het adres op softwareniveau).
De linklaag verpakt dat met een header die aangeeft aan welk apparaat op het lokale segment ze vervolgens overhandigd moeten worden (het hardware-adres).
De fysieke laag zet de hele bundel om in bits op een draad.
Aan de andere kant pelt elke laag zijn eigen header af en reikt de rest omhoog. De ontvangende applicatie krijgt zijn bytes terug zonder zich ervan bewust te zijn dat de netwerk-, link- en fysieke laag ooit bestonden.
Deze nesteling is waarom de tutorial van onder naar boven werkt. Begrijpen wat de laag eronder doet, maakt de laag erboven onvermijdelijk. De onderste twee lagen worden elk in een enkele pagina behandeld omdat er vanuit Python vrijwel niets te configureren valt. Vanaf de netwerklaag omhoog vertraagt het tempo naarmate de rol van Python groter wordt.