9.5. IP-adressen¶
Een hardwareadres pikt één apparaat eruit tussen de andere op dezelfde lokale kabel of radiocel. Daar is het prima voor, maar buiten het lokale segment is het nutteloos: een switch in het volgende gebouw kan er niet op routeren, omdat het onderliggende mechanisme dat een switch MAC-adressen laat leren alleen binnen één segment werkt.
De netwerklaag lost dat op met een tweede soort adres dat onafhankelijk is van de kabel waarop een apparaat is aangesloten. De naam voor dit soort adres is het Internet Protocol-adres, of IP-adres, en de “Internet Protocol”-helft benoemt de set regels die elke host op het internet volgt wanneer hij er een verzendt of doorstuurt. Het huidige internet gebruikt twee versies van het adresseringsschema naast elkaar – IPv4 (de oudere vorm, nog steeds dominant op kleine netwerken) en IPv6 (de nieuwere vorm, die het langzaam vervangt).
9.5.1. Wat een IP-adres is¶
Een IP-adres is een getal dat groot genoeg is om elk apparaat op het internet uniek te identificeren. Het wordt geschreven in een voor mensen leesbare vorm die de rest van deze sectie gebruikt, maar in de pakketheader is het slechts een geheel getal met een vaste grootte.
IPv4-adressen zijn 32 bits lang en worden geschreven als vier decimale getallen gescheiden door punten, waarbij elk getal één byte is:
192.168.1.42 8.8.8.8 10.0.0.1
Tweeëndertig bits geeft ruwweg vier miljard mogelijke adressen, wat veel leek toen IPv4 in de jaren 70 werd ontworpen en begin jaren 2010 niet genoeg meer was.
IPv6-adressen zijn 128 bits lang en worden geschreven als acht groepen van vier hexadecimale cijfers gescheiden door dubbele punten:
2001:0db8:85a3:0000:0000:8a2e:0370:7334Reeksen nullen kunnen worden ingekort tot
::, en voorloopnullen in een groep kunnen worden weggelaten, dus het bovenstaande adres wordt normaal geschreven als2001:db8:85a3::8a2e:370:7334.
De twee adresfamilies zijn verder verschillende talen; een IPv4-host kan niet rechtstreeks een pakket naar een IPv6-host sturen zonder hulp van een gateway. De modules network en socket van de camera ondersteunen beide. Deze tutorial gebruikt IPv4 in de voorbeelden omdat de meeste lokale netwerken waar de camera zich bij aansluit nog steeds alleen IPv4 zijn, maar alles wat volgt werkt op precies dezelfde manier voor IPv6 zodra de adressen worden vervangen.
9.5.2. Waar een IP-adres voor dient¶
Het IP-adres zegt voor welke host op het internet een pakket bedoeld is. Een router die niet weet hoe hij een bestemming rechtstreeks kan bereiken, weet dat een andere router dat waarschijnlijk wel kan, en stuurt het pakket daarheen. Het pakket springt van router naar router, elke keer een beetje dichter bij de bestemming, totdat een router die wel op het lokale segment van de bestemming zit de laatste sprong aflevert.
Dat sprong-voor-sprong-gedrag is wat het internet laat werken als één groot netwerk in plaats van vele kleine eilanden. De volgende pagina behandelt hoe de sprongen worden gekozen; deze gaat alleen over het adres.
9.5.3. Hoe een camera er een krijgt¶
Een camera die zich net bij een wifinetwerk heeft aangesloten heeft een IP-adres nodig voordat hij met iets kan communiceren. Er zijn twee gangbare manieren waarop dat gebeurt.
De eerste is automatische toewijzing. De camera vraagt het lokale netwerk om een adres; het apparaat dat er een uitdeelt is de router – het kastje dat het lokale netwerk verbindt met het bredere internet. In de meeste thuis- en kleinkantooropstellingen fungeert hetzelfde fysieke kastje ook als de switch waarop bedrade apparaten worden aangesloten en als het wifi-toegangspunt waarmee draadloze apparaten zich associëren, dus “de router”, “de switch” en “het toegangspunt” kunnen allemaal hetzelfde stuk hardware zijn. De router draait een kleine dienst genaamd DHCP (het Dynamic Host Configuration Protocol), die een pool van beschikbare adressen bijhoudt, er voor elk nieuw aangekomen apparaat een kiest en het voor een vaste tijd leaset. Terwijl DHCP daarmee bezig is, geeft de router de camera ook nog een paar andere nuttige stukjes configuratie:
het adres waar uitgaand verkeer naartoe moet wanneer de bestemming buiten het lokale netwerk ligt (de standaardgateway, wat het eigen adres van de router is); en
de adressen van een of meer naamservers die voor mensen leesbare namen zoals
example.comomzetten in IP-adressen. De naamopzoekdienst heet DNS, het Domain Name System, en Namen en DNS behandelt het in detail.
Dit alles gebeurt automatisch terwijl de verbinding tot stand komt. De camera hoeft er niets expliciet om te vragen; op het moment dat isconnected() True teruggeeft in het voorbeeld op de vorige pagina, heeft de cam al zijn adres, zijn gateway en zijn naamservers.
De tweede optie is statische configuratie. Sommige implementaties willen een bekend adres voor de camera zodat andere apparaten hem kunnen bereiken zonder hem eerst op te zoeken. De methode ipconfig() stelt het adres, de gateway en de naamserver handmatig in:
wlan.ipconfig(addr4=("192.168.1.50/24", "192.168.1.1"))
wlan.ipconfig(dns="192.168.1.1")
Statische configuratie is kwetsbaar (twee apparaten die per ongeluk hetzelfde adres krijgen, botsen). Grijp naar de DHCP-standaard tenzij er een specifieke reden opduikt om die te overschrijven.
Zodra de camera een IP-adres heeft, is hij toegetreden tot het internet (of in ieder geval tot het deel ervan op het lokale netwerk). Andere apparaten kunnen nu pakketten naar dat adres adresseren, en hij kan pakketten naar hen adresseren.
9.5.4. Het netmasker en de /24¶
De /24 aan het einde van het adres in het statische voorbeeld hierboven is het netmasker. Een IP-adres op zichzelf zegt niet waar het lokale netwerk eindigt – 192.168.1.50 kan een van een paar honderd adressen op een klein thuisnetwerk zijn, of een van duizenden op een groter netwerk. Het netmasker zegt hoeveel van het adres het netwerk benoemt en hoeveel de host daarbinnen.
/24 betekent “de eerste 24 van de 32 bits benoemen het netwerk; de laatste 8 benoemen de host”. Voor 192.168.1.50/24 splitst dat het adres in 192.168.1 voor het netwerk en .50 voor de host, waardoor er ruimte overblijft voor ongeveer 254 apparaten op hetzelfde lokale netwerk. /16 zou meer bits overlaten voor de host-helft en veel meer apparaten op één netwerk passen; /30 zou slechts twee hostadressen overlaten en past op een punt-naar-puntverbinding.
Het netmasker wordt ook vaak geschreven als een getal van vier bytes in dezelfde puntnotatie als het adres. /24 is gelijk aan 255.255.255.0 – lees elke byte als “alle bits die bij de netwerkhelft horen”. De twee vormen zijn uitwisselbaar; de ipconfig()-lezer in de volgende subsectie geeft toevallig de vorm met vier bytes terug.
Waarom de splitsing überhaupt belangrijk is – hoe een apparaat het netmasker gebruikt om te beslissen of een bestemming zich op het lokale netwerk bevindt of via de gateway naar buiten moet, en waarom de meeste thuisnetwerken op /24 uitkomen – wordt behandeld in Privénetwerken en NAT.
9.5.5. Het adres teruglezen¶
De methode ipconfig() zonder argumenten geeft de actieve configuratie terug. De addr4-weergave geeft het IP-adres en het netmasker terug:
>>> wlan.ipconfig("addr4")
('192.168.1.50', '255.255.255.0')