Perché IPv4 è ancora qui
IPv4 è stato definito nel 1981 con la RFC 791. Quarantaquattro anni dopo lo trovi ancora su ogni router, ogni switch L3, ogni server. Non perché sia perfetto — ha limiti evidenti, primo fra tutti lo spazio di indirizzamento esaurito — ma perché costruito su principi solidi: semplicità, robustezza, interoperabilità.
Il livello Network (strato 3 OSI) ha un compito preciso: portare un pacchetto dalla sorgente alla destinazione attraverso reti eterogenee. IPv4 lo fa attraverso due meccanismi: l’indirizzamento (ogni nodo ha un indirizzo univoco globalmente instradabile) e il routing (i router leggono l’header e decidono il percorso). In questa lezione analizziamo l’header nel dettaglio e il sistema di indirizzamento.
L’header IPv4: struttura campo per campo
Ogni datagramma IPv4 è composto da un header (minimo 20 byte, massimo 60 byte con opzioni) seguito dal payload. Vediamo ogni campo:
4b
4b
6b
2b
3b
| Campo | Dimensione | Funzione |
|---|---|---|
| Version (VER) | 4 bit | Versione del protocollo IP. Per IPv4 il valore è sempre 0100 (4). |
| IHL | 4 bit | Internet Header Length: lunghezza dell’header in word da 32 bit. Valore minimo = 5 (20 byte), massimo = 15 (60 byte). Indica dove finisce l’header e inizia il payload. |
| DSCP / ECN | 8 bit | Precedentemente chiamato ToS (Type of Service). DSCP (6 bit) classifica il traffico per QoS (Differentiated Services). ECN (2 bit) notifica la congestione senza scartare pacchetti. |
| Total Length | 16 bit | Lunghezza totale del datagramma in byte (header + payload). Massimo 65.535 byte. In pratica limitata dall’MTU (1500 byte su Ethernet). |
| Identification | 16 bit | Identificatore univoco del datagramma. Tutti i frammenti dello stesso datagramma originale condividono lo stesso valore. |
| Flags | 3 bit | Bit 0: riservato (sempre 0). Bit 1 (DF): Don’t Fragment — se impostato il router scarta il pacchetto anziché frammentarlo. Bit 2 (MF): More Fragments — impostato su tutti i frammenti tranne l’ultimo. |
| Fragment Offset | 13 bit | Posizione del frammento all’interno del datagramma originale, misurata in unità di 8 byte. Il ricevitore usa questo campo per riassemblare i frammenti nell’ordine corretto. |
| TTL | 8 bit | Time To Live: ogni router decrementa TTL di 1 prima di inviare il pacchetto. Quando TTL raggiunge 0, il pacchetto viene scartato e viene inviato un messaggio ICMP “Time Exceeded” alla sorgente. Previene loop infiniti. Valore tipico: 64 (Linux), 128 (Windows), 255 (Cisco). |
| Protocol | 8 bit | Identifica il protocollo del payload (strato 4): 6 = TCP, 17 = UDP, 1 = ICMP, 89 = OSPF. Equivalente dell’EtherType di Ethernet. |
| Header Checksum | 16 bit | Checksum dell’header (solo header, non payload). Ricalcolato ad ogni hop perché il TTL cambia. Nota: IPv6 elimina questo campo per ridurre l’overhead di calcolo. |
| Source IP | 32 bit | Indirizzo IPv4 del mittente. |
| Destination IP | 32 bit | Indirizzo IPv4 del destinatario. Il router usa questo campo per decidere il next-hop. |
| Options | 0–40 byte | Opzionali: timestamp, record route, source routing. Raramente usate, complesse da processare. IPv6 le sostituisce con Extension Headers. |
traceroute sfrutta il campo TTL in modo creativo: invia pacchetti con TTL=1, poi TTL=2, poi TTL=3… Ogni router che scarta il pacchetto risponde con ICMP “Time Exceeded”, rivelando il proprio indirizzo. Così si mappa l’intero percorso verso la destinazione.
Indirizzamento IPv4
Un indirizzo IPv4 è un numero a 32 bit. Viene scritto in notazione decimale puntata: quattro ottetti separati da punti, ciascuno con valore 0–255. Ad esempio: 192.168.1.100.
Ogni indirizzo identifica un’interfaccia di rete (non un host in senso assoluto — un router con 4 interfacce ha 4 indirizzi IP). L’indirizzo è diviso in due parti logiche:
Identifica la rete (subnet). Tutti gli host nella stessa rete condividono questa parte. Il router la usa per instradare il pacchetto verso la rete giusta.
Identifica lo specifico host all’interno della rete. Deve essere univoco all’interno della stessa subnet. Lo switch/ARP lo usa per identificare il nodo finale.
Le classi di indirizzi (sistema classful — storico)
Originariamente il confine tra network portion e host portion era fisso, determinato dai primi bit dell’indirizzo. Questo sistema è detto classful:
| Classe | Primo bit/i | Range primo ottetto | Subnet mask default | Reti / Host per rete | Uso |
|---|---|---|---|---|---|
| A | 0 | 1 – 126 | /8 (255.0.0.0) | 128 reti / ~16M host | Grandi ISP, multinazionali |
| B | 10 | 128 – 191 | /16 (255.255.0.0) | 16.384 reti / ~65K host | Organizzazioni medie |
| C | 110 | 192 – 223 | /24 (255.255.255.0) | 2M reti / 254 host | LAN aziendali, uffici |
| D | 1110 | 224 – 239 | — | — | Multicast (OSPF, RIP, streaming) |
| E | 1111 | 240 – 255 | — | — | Sperimentale, riservato |
Il classful allocava blocchi enormi: un’azienda con 300 host riceveva una classe B (65.534 host) sprecando 65.000 indirizzi. Con lo spazio IPv4 esaurito (IANA ha distribuito l’ultimo blocco nel 2011), oggi si usa esclusivamente il sistema classless (CIDR), che permette prefissi di lunghezza arbitraria.
La subnet mask e la notazione CIDR
La subnet mask è una maschera a 32 bit dove i bit a 1 indicano la network portion e i bit a 0 indicano la host portion. Si scrive in due modi equivalenti:
La notazione CIDR (Classless Inter-Domain Routing) esprime la subnet mask come il numero di bit a 1: /24 equivale a 255.255.255.0. È più compatta e flessibile — il prefisso può essere qualsiasi valore da /0 a /32.
Calcolo rapido: per un prefisso /n, il numero di indirizzi host utilizzabili è 2^(32-n) − 2 (si sottraggono l’indirizzo di rete e il broadcast).
| Prefisso CIDR | Subnet mask | Indirizzi totali | Host utilizzabili |
|---|---|---|---|
/24 | 255.255.255.0 | 256 | 254 |
/25 | 255.255.255.128 | 128 | 126 |
/26 | 255.255.255.192 | 64 | 62 |
/27 | 255.255.255.224 | 32 | 30 |
/28 | 255.255.255.240 | 16 | 14 |
/29 | 255.255.255.248 | 8 | 6 |
/30 | 255.255.255.252 | 4 | 2 |
/31 | 255.255.255.254 | 2 | 0 (link p2p — RFC 3021) |
/32 | 255.255.255.255 | 1 | 0 (host specifico) |
Indirizzi speciali e riservati
Non tutti i 4,3 miliardi di indirizzi IPv4 possibili sono assegnabili agli host. Alcune gamme hanno significati speciali definiti da RFC.
Indirizzi privati (RFC 1918)
Sono blocchi non instradabili su Internet pubblico — usati nelle LAN. Un router con indirizzo privato deve fare NAT per comunicare con Internet.
| Blocco | Range | Classe originale | Host disponibili |
|---|---|---|---|
10.0.0.0/8 | 10.0.0.0 – 10.255.255.255 | A | ~16,7 milioni |
172.16.0.0/12 | 172.16.0.0 – 172.31.255.255 | B | ~1,05 milioni |
192.168.0.0/16 | 192.168.0.0 – 192.168.255.255 | C | ~65.536 |
Altri indirizzi riservati notevoli
| Indirizzo / Blocco | Significato | RFC |
|---|---|---|
127.0.0.0/8 | Loopback: il traffico rimane nell’host, non esce sulla rete. 127.0.0.1 è il più usato. Utile per testing stack TCP/IP locale. | RFC 1122 |
0.0.0.0 | Indirizzo non specificato: un host che non conosce ancora il proprio indirizzo lo usa come sorgente (es. durante DHCP discover). Anche usato nei routing table come default route. | RFC 1122 |
255.255.255.255 | Limited broadcast: raggiunge tutti gli host sulla subnet locale. Non instradato dai router. | RFC 919 |
x.x.x.255 (o .0) | Directed broadcast: broadcast verso una subnet specifica (es. 192.168.1.255). Molti router lo bloccano per sicurezza (smurf attack). | RFC 919 |
169.254.0.0/16 | APIPA (Automatic Private IP Addressing): assegnato automaticamente da Windows/macOS quando il DHCP non risponde. Non instradabile. | RFC 3927 |
100.64.0.0/10 | Shared Address Space: usato dagli ISP per CGN (Carrier-Grade NAT). Non instradabile su Internet pubblico. | RFC 6598 |
224.0.0.0/4 | Multicast: un pacchetto viene consegnato a un gruppo di ricevitori. 224.0.0.5 = tutti i router OSPF, 224.0.0.1 = tutti gli host subnet. | RFC 1112 |
Con 4,3 miliardi di indirizzi IPv4 e miliardi di device connessi, lo spazio è esaurito. La soluzione temporanea è il NAT (Network Address Translation): l’intera rete privata di casa tua (192.168.x.x) esce su Internet con un solo indirizzo pubblico. Il router tiene traccia delle connessioni e smista le risposte. È la ragione per cui il tuo telefono ha un IP privato ma riesce a comunicare con server globali.
Come un router elabora l’header
Quando un pacchetto arriva su un’interfaccia, il router esegue questi passi:
- Legge il campo Version: se non è 4 (IPv4) o 6 (IPv6), scarta.
- Verifica l’Header Checksum: se errato, scarta silenziosamente.
- Decrementa il TTL di 1. Se TTL = 0, scarta e invia ICMP Time Exceeded.
- Cerca il Destination IP nella routing table (longest prefix match).
- Determina l’interfaccia di uscita e il next-hop.
- Ricalcola l’Header Checksum (cambiato per TTL).
- Verifica se il datagramma supera l’MTU dell’interfaccia di uscita. Se DF=0, frammenta. Se DF=1, scarta e invia ICMP Fragmentation Needed.
- Incapsula in un nuovo frame Data Link (es. nuovo frame Ethernet con MAC del next-hop) e trasmette.
- L’header IPv4 è lungo almeno 20 byte e contiene tutti i metadati per routing, frammentazione e QoS.
- Il TTL previene loop: decrementato ad ogni hop, scatta un ICMP quando raggiunge 0. È la base di traceroute.
- Un indirizzo IPv4 a 32 bit è diviso in network portion + host portion tramite la subnet mask.
- La notazione CIDR (
/n) esprime la lunghezza del prefisso di rete in modo compatto e flessibile. - Gli indirizzi RFC 1918 (10.x, 172.16–31.x, 192.168.x) sono privati: non instradabili su Internet senza NAT.
- Per una rete
/n: host utilizzabili = 2^(32−n) − 2. Si sottraggono network address e broadcast.