9.5. Indirizzi IP

Un indirizzo hardware distingue un dispositivo dagli altri presenti sullo stesso cavo locale o sulla stessa cella radio. Per questo compito va bene, ma è inutile al di là del segmento locale: uno switch nell’edificio accanto non può instradare in base ad esso, perché il meccanismo sottostante che consente a uno switch di apprendere gli indirizzi MAC funziona solo all’interno di un singolo segmento.

Il livello di rete risolve il problema con un secondo tipo di indirizzo, indipendente dal cavo a cui un dispositivo è collegato. Il nome di questo tipo di indirizzo è indirizzo Internet Protocol, o indirizzo IP, e la parte «Internet Protocol» indica l’insieme di regole che ogni host su internet segue quando ne invia o ne inoltra uno. L’internet attuale usa in parallelo due versioni dello schema di indirizzamento – IPv4 (la forma più vecchia, ancora dominante sulle piccole reti) e IPv6 (la forma più recente, che lo sta lentamente sostituendo).

9.5.1. Cos’è un indirizzo IP

Un indirizzo IP è un numero abbastanza grande da identificare in modo univoco qualsiasi dispositivo su internet. Viene scritto in una forma leggibile dall’uomo, usata nel resto della sezione, ma nell’intestazione del pacchetto è semplicemente un intero di dimensione fissa.

  • Gli indirizzi IPv4 sono lunghi 32 bit e si scrivono come quattro numeri decimali separati da punti, ciascun numero corrispondente a un byte:

    192.168.1.42
    8.8.8.8
    10.0.0.1
    

    Trentadue bit danno circa quattro miliardi di indirizzi possibili, che sembravano abbondanti quando IPv4 fu progettato negli anni “70 e non erano più sufficienti all’inizio degli anni 2010.

  • Gli indirizzi IPv6 sono lunghi 128 bit e si scrivono come otto gruppi di quattro cifre esadecimali separati da due punti:

    2001:0db8:85a3:0000:0000:8a2e:0370:7334
    

    Le sequenze di zeri possono essere abbreviate in :: e gli zeri iniziali in un gruppo possono essere omessi, quindi l’indirizzo sopra si scrive normalmente 2001:db8:85a3::8a2e:370:7334.

Le due famiglie di indirizzi sono per il resto lingue diverse; un host IPv4 non può inviare direttamente un pacchetto a un host IPv6 senza l’aiuto di un gateway. I moduli network e socket della camera supportano entrambe. Questo tutorial usa IPv4 negli esempi perché la maggior parte delle reti locali a cui la camera si collegherà è ancora solo IPv4, ma tutto ciò che segue funziona esattamente allo stesso modo per IPv6, una volta sostituiti gli indirizzi.

9.5.2. A cosa serve un indirizzo IP

L’indirizzo IP indica a quale host su internet è destinato un pacchetto. Un router che non sa come raggiungere direttamente una destinazione sa che probabilmente qualche altro router lo sa, e gli inoltra il pacchetto. Il pacchetto salta da un router all’altro, ognuno un po” più vicino alla destinazione, finché un router che si trova sul segmento locale della destinazione effettua l’ultimo salto.

Questo comportamento salto per salto è ciò che fa funzionare internet come un’unica grande rete invece che come tante piccole isole. La pagina successiva spiega come vengono scelti i salti; questa riguarda solo l’indirizzo.

9.5.3. Come una camera ne ottiene uno

Una camera che si è appena collegata a una rete Wi-Fi ha bisogno di un indirizzo IP prima di poter comunicare con qualsiasi cosa. Esistono due modi comuni perché ciò accada.

Il primo è l”assegnazione automatica. La camera chiede un indirizzo alla rete locale; il dispositivo che ne distribuisce uno è il router – la scatola che collega la rete locale all’internet più ampio. Nella maggior parte delle configurazioni domestiche e dei piccoli uffici, lo stesso dispositivo fisico funge anche da switch a cui si collegano i dispositivi cablati e da access point Wi-Fi a cui si associano quelli wireless, quindi «il router», «lo switch» e «l’access point» possono essere tutti lo stesso componente hardware. Il router esegue un piccolo servizio chiamato DHCP (il Dynamic Host Configuration Protocol), che mantiene un pool di indirizzi disponibili, ne sceglie uno per ogni nuovo dispositivo che si presenta e glielo concede in leasing per un tempo determinato. Già che c’è, il DHCP fa sì che il router consegni alla camera anche un paio di altri elementi utili di configurazione:

  • l’indirizzo a cui inviare il traffico in uscita quando la destinazione è fuori dalla rete locale (il gateway predefinito, che è l’indirizzo del router stesso); e

  • gli indirizzi di uno o più name server che convertono nomi leggibili dall’uomo come example.com in indirizzi IP. Il servizio di risoluzione dei nomi si chiama DNS, il Domain Name System, e Nomi e DNS lo tratta in dettaglio.

Tutto questo avviene automaticamente mentre il collegamento si attiva. La camera non deve richiedere nulla di tutto ciò esplicitamente; nel momento in cui isconnected() restituisce True nell’esempio della pagina precedente, la cam ha già il suo indirizzo, il suo gateway e i suoi name server.

La seconda opzione è la configurazione statica. Alcune installazioni vogliono un indirizzo noto per la camera, così che altri dispositivi possano raggiungerla senza prima doverlo cercare. Il metodo ipconfig() imposta manualmente l’indirizzo, il gateway e il name server:

wlan.ipconfig(addr4=("192.168.1.50/24", "192.168.1.1"))
wlan.ipconfig(dns="192.168.1.1")

La configurazione statica è fragile (due dispositivi a cui si assegna accidentalmente lo stesso indirizzo vanno in conflitto). Affidati all’impostazione predefinita DHCP a meno che non emerga un motivo specifico per sovrascriverla.

Una volta che la camera ha un indirizzo IP, si è unita a internet (o almeno alla porzione di rete locale che le compete). Altri dispositivi possono ora indirizzarle pacchetti tramite quell’indirizzo, e lei può indirizzare pacchetti a loro.

9.5.4. La netmask e il /24

Il /24 alla fine dell’indirizzo nell’esempio statico sopra è la netmask. Un indirizzo IP da solo non indica dove finisce la rete locale – 192.168.1.50 potrebbe essere uno di qualche centinaio di indirizzi su una piccola rete domestica, oppure uno di migliaia su una più grande. La netmask indica quanta parte dell’indirizzo nomina la rete e quanta nomina l”host al suo interno.

/24 significa «i primi 24 dei 32 bit nominano la rete; gli ultimi 8 nominano l’host». Per 192.168.1.50/24 questo divide l’indirizzo in 192.168.1 per la rete e .50 per l’host, lasciando spazio per circa 254 dispositivi sulla stessa rete locale. /16 lascerebbe più bit per la parte host e farebbe stare molti più dispositivi su una rete; /30 lascerebbe solo due indirizzi host e farebbe stare un collegamento punto-punto.

La netmask viene comunemente scritta anche come numero a quattro byte nella stessa notazione con i punti dell’indirizzo. /24 equivale a 255.255.255.0 – leggi ogni byte come «tutti i bit che appartengono alla parte di rete». Le due forme sono intercambiabili; il lettore ipconfig() della prossima sottosezione restituisce per l’appunto la forma a quattro byte.

Perché la suddivisione sia importante in primo luogo – come un dispositivo usa la netmask per decidere se una destinazione è sulla rete locale o deve uscire attraverso il gateway, e perché la maggior parte delle reti domestiche adotta /24 – è trattato in Reti private e NAT.

9.5.5. Rileggere l’indirizzo

Il metodo ipconfig() senza argomenti restituisce la configurazione attiva. La vista addr4 restituisce l’indirizzo IP e la netmask:

>>> wlan.ipconfig("addr4")
('192.168.1.50', '255.255.255.0')