9.6. Pakketten en routering¶
Een IP-adres zegt voor wie een bericht bestemd is. Het mechanisme dat het daadwerkelijk aflevert heet routering, en het is het sprong-voor-sprong-proces waarmee een pakket reist van het lokale netwerk van een zender naar het lokale netwerk van een ontvanger, mogelijk heel ver weg.
9.6.1. Een pakket, kort gezegd¶
Een pakket is de werkeenheid van de IP-laag – een stuk bytes met een kleine header en een payload. De header heeft twee velden die belangrijk zijn voor routering:
Het bron-IP-adres (waar het pakket vandaan kwam).
Het bestemmings-IP-adres (waar het naartoe gaat).
De payload is wat de transportlaag de netwerklaag heeft gevraagd af te leveren. De pakketheader bevat ook een time-to-live-teller, een checksum over de header en een paar besturingsvlaggen. Geen van die dingen raakt de Python-code van de camera rechtstreeks aan.
Pakketten beloven niets meer dan “we hebben het geprobeerd” – ze kunnen verloren gaan, gedupliceerd worden of buiten volgorde worden afgeleverd. Betrouwbaarheid en volgorde zijn problemen die de transportlaag erboven oplost; de netwerklaag doet gewoon zijn best om elk pakket richting zijn bestemming door te sturen.
9.6.2. Sprong voor sprong¶
Het pakket verlaat de camera en komt aan bij het eerste apparaat dat niet op het lokale segment van de camera zit: de standaardgateway. (De vorige pagina vermeldde dat DHCP de camera het adres van de gateway gaf toen het netwerk tot stand kwam.) Dat apparaat is een router – een kastje wiens taak het is pakketten te ontvangen, naar hun bestemming te kijken en ze door te sturen.
Een pakket van de camera naar de bestemming springt van router naar router, elke keer een stap dichterbij.¶
De router heeft een routeringstabel – een lijst van “voor bestemmingen die overeenkomen met dit patroon, stuur het pakket via deze interface naar buiten”. Voor bestemmingen op hetzelfde netwerk als de camera zegt de vermelding “stuur het terug over de kabel waarover het binnenkwam”. Voor bestemmingen op het bredere internet zegt de vermelding “stuur het naar de stroomopwaartse router”. Voor bekende patronen van bestemmingen (een bedrijfs-VPN, het netwerk van een specifieke zakenpartner, een satellietverbinding) heeft de router mogelijk een specifiekere vermelding die de standaard overschrijft.
De stroomopwaartse router doet hetzelfde. En de volgende. En de volgende. Elke sprong heeft dezelfde vorm: ontvang het pakket, zoek de bestemming op in de tabel, stuur het via de juiste interface naar buiten. Uiteindelijk komt het pakket aan bij een router die wel op hetzelfde lokale segment zit als het bestemmings-IP-adres. Die router levert de laatste sprong af, de bestemming ontvangt het pakket, en de reis is voorbij.
9.6.3. De eindpunten kennen de route niet¶
Een camera die een pakket naar een externe server stuurt, weet niet hoe het pakket daar zal komen. Hij kent alleen het bestemmings-IP-adres en het adres van zijn eigen standaardgateway. Alles daartussen – welke routers, welke glasvezels, welke onderzeese kabels – is iets dat de routers langs het pad onderweg beslissen, op basis van hun eigen tabellen. De routers zelf kennen alleen hun directe buren en de ruwe richting van veelvoorkomende bestemmingen; geen enkel apparaat op het internet heeft er een complete kaart van.
Die decentralisatie is waarom het netwerk blijft werken wanneer afzonderlijke paden uitvallen. Een doorgesneden kabel ergens in het midden wordt een herrouteringsgebeurtenis bij een paar routers; de eindpunten merken er niets van. Het is ook waarom een pakket van een camera in Tokio naar een server in Dublin kan slagen zonder dat een van beide kanten weet welke landen er tussenin liggen.
9.6.4. Wat dit betekent voor een Python-script¶
De taak van de camera op de netwerklaag komt neer op:
Een IP-adres hebben.
Het adres van de standaardgateway kennen (DHCP vult dit automatisch in).
Uitgaande pakketten, geadresseerd aan elk IP-adres, aan die gateway overhandigen en op de rest van het pad vertrouwen.
Een script kiest nooit een route, benoemt nooit een tussenliggende sprong en ziet nooit de routers in het midden. Het schrijft het bestemmings-IP-adres op het pakket en de netwerklaag neemt het over. Vanuit een Python-script is alle routering slechts een eigenschap van het netwerk waar de camera zich bij heeft aangesloten – “de gateway stuurt pakketten ergens naartoe dat nuttig voor mij is”.
De transportlaag die hierna komt gaat ervan uit dat routering gewoon werkt, en bouwt betrouwbaarheid, volgorde en programma-naar-programma-adressering daarbovenop.