Sono disponibili attualmente due versioni di IP:
Vediamo com'è fatto un datagramma IPv4.
Da sinistra a destra analizziamo ciascuna riga di questo pacchetto:
Si noti che alcuni campi del datagramma vanno ricalcolati ad ogni router (checksum, TTL)
I datagrammi IP hanno 20 byte di intestazione, escludendo le opzioni.
I datagrammi non frammentati (che trasportano segmenti TCP) ne hanno 40 byte: 20 di intestazione IP + 20 di intestazione TCP, assieme al messaggio di livello applicativo.
A livello di collegamento i pacchetti si chiamano frame. Non tutti i protocolli a quel livello possono trasportare la stessa dimensione di pacchetti. L'unità massima di dati che un frame a livello di collegamento può trasportare è detta MTU (maximum transmission unit). I datagrammi viaggiano attraverso collegamenti del livello sottostante, il protocollo a livello di collegamento può variare e in tal modo varia anche il valore di MTU per quel collegamento. Immaginiamo che un datagramma in uscita scopra che il collegamento su cui è diretto ha un valore di MTU inferiore alla sua dimensione, cosa succede? Il datagramma viene frammentato: suddiviso in datagrammi più piccoli. Essi dovranno essere riassemblati prima di giungere al livello di trasporto alla destinazione. Il compito di riassemblaggio viene effettuato dai sistemi periferici e non dai router. Per dare la possibilità ai sistemi periferici di riassemblare i datagrammi: nell'intestazione di IPv4 ci sono dei campi: identificazione, flag, offset di frammentazione che servono proprio a questo.
Quando viene creato un datagramma il router gli assegna un numero identificativo (identification). I pacchetti frammentati dal datagramma originario hanno lo stesso identificativo del datagramma originario. Quando un host riceve dei datagrammi frammentati se ne rende conto poiché ci saranno datagrammi con lo stesso identificativo. Poiché IP non è affidabile, un datagramma può andare perso, per questo motivo l'ultimo datagramma frammentato ha il campo flag posto a 0, mentre tutti gli altri posti a 1. Il campo offset specifica l'ordine in cui devono essere riassemblati.
Il campo flag è lungo 3 bit.
Il primo bit è tutto ora inutilizzato e deve esser posto a 0.
Il secondo bit è il flag: may fragment che indica la possibilità che un datagramma venga frammentato oppure no. Se il may fragment è posto a 0, allora IP può frammentare il datagramma, se è posto a 1 vuol dire che IP non può frammentare il datagramma. Bisogna notare che se il datagramma è troppo grande e tale flag è posto a 1, IP non invia il datagramma.
Il terzo bit indica il flag more fragments ed è quello che abbiamo descritto prima. L'ultimo frammento avrà more fragment posto a 0, tutti gli altri posto a 1.
Generalmente un host ha un solo collegamento verso la rete, quando l'implementazione IP dell'host vuole inviare un datagramma, lo fa su tale collegamento. Il confine tra host e collegamento fisico viene detto interfaccia. Invece, dato che il compito di un router è ricevere datagrammi da un collegamento e inoltrarli su un altro, questo deve essere necessariamente connesso ad almeno due collegamenti. Anche il confine tra un router e i suoi collegamenti viene detto interfaccia: un router ha più interfacce. IP richiede che tutte le interfacce abbiano un indirizzo IP. Pertanto l'IP è associato all'interfaccia e non all'host o al router. Gli indirizzi IP sono 32 bit = 4 byte e quindi ci sono
L'indirizzo IP 193.32.216.9 corrisponde a:
Al centro abbiamo un router con 3 interfacce, ciascuna interfaccia ha un indirizzo IP. Ciascuna sotto-rete è riconosciuta da dall'indirizzo dell'interfaccia cui sono collegati, mentre gli host connessi a ciascuna sotto-rete sono riconosciuti da un indirizzo (sempre di interfaccia, ma questa volta dell'host) della rete cui sono allacciati. Si noti che i primi tre byte della sotto-rete e degli host che vi sono connessi sono uguali.
Per il momento immaginiamo che nelle sotto reti non ci siano router e che le interfacce degli host siano tra di loro interconnesse.
La sottorete è formata dall'interfaccia del router e dagli host che vi sono collegati. IP assegna alla sottorete (nel caso della sottorete a sinistra) l'indirizzo 223.1.1.0/24, dove /24 viene detta maschera di sottorete (subnet mask). Sotto possiamo vedere gli indirizzi delle sotto-reti.
Ogni host connesso alla sottorete, prendiamo come esempio sempre quella di sinistra, deve avere un indirizzo del tipo: 223.1.1.xxx.
La strategia di assegnazione degli indirizzi IP è detta classless interdomain routing (CIDR).
L'indirizzo IP viene diviso in due parti: a.b.c.d/x, dove
Un altro indirizzo è l'indirizzo di broadcast: 255.255.255.255, quando viene emesso da un host un datagramma con destinazione specificata da questo IP, il datagramma viene recapitato a tutti gli host della sua sottorete.
Come abbiamo detto un indirizzo IP è costituito di 32 bit. Prima dell’adozione di CIDR lo schema di indirizzamento era noto come classful addressing, dato che le sotto-reti con indirizzi di sottorete da 8, 16 e 24 bit erano note rispettivamente come reti di classe A, B e C.
Vi sono nella figura 3 router connessi da collegamenti punto punto. Ciascuno di essi ha poi una connessione broadcast ad un coppia di host. Ora abbiamo sicuramente tre reti:
Supponiamo che vi sia un provider (chiamato Fly-By-Night-ISP) che connette 8 organizzazioni. Tale provider comunica che gli debbano essere inviati tutti i datagrammi i cui primi 20 bit di indirizzo corrispondano a 200.23.16.0/20. Il resto del mondo non ha bisogno di sapere che sotto quegli indirizzi esistono 8 organizzazioni diverse, ciascuna con la propria sotto-rete. La possibilità di utilizzare lo stesso indirizzo per organizzazioni diverse viene detta aggregazione di indirizzi.
Cosa succede se Fly-By-Night-ISP acquisisce un providere chiamato ISPs-R-Us e poi facesso connettere l'organizzazione 1 a Internet attraverso la propria sussidiaria (ormai) ISPs-R-Us?
La sussidiaria possiede il blocco di indirizzi 199.31.0.0/16, ma gli indirizzi IP dell'organizzazione 1 sfortunatamente non appartengono a tale blocco. Che cosa fare di questi indirizzi?
Il primo byte rappresenta la rete; gli altri tre gli host per ogni rete.
In notazione decimale gli IP variano nel modo seguente 0-127.H.H.H.
La maschera di rete è 255.0.0.0 (o anche detta /8, in quanto i bit di rete sono 8).
Questi indirizzi in binario iniziano con 0.
I primi due byte rappresentano la rete; gli altri due gli host per ogni rete.
In notazione decimale gli IP variano nel modo seguente 128-191.N.H.H.
N varia da 0 a 255.
La maschera di rete è 255.255.0.0 (o anche detta /16, in quanto i bit di rete sono 16).
Questi indirizzi in binario iniziano con i bit 10.
I primi tre byte rappresentano la rete; l'altro gli host per ogni rete.
In notazione decimale gli IP variano nel modo seguente 192-223.N.N.H.
N varia da 0 a 255.
La maschera di rete è 255.255.255.0 (o anche detta /24, in quanto i bit di rete sono 24).
Questi indirizzi in binario iniziano con i bit 110.
Tale classe è riservata agli indirizzi mutlicast.
In notazione decimale gli IP variano nel modo seguente 224-239.x.x.x.
Non è definita una maschera di rete, essendo tutti e 32 i bit dell'indirizzo utilizzati per indicare un gruppo, non un singolo.
Questi indirizzi in binario iniziano con i bit 1110.
Riservata per usi futuri.
In notazione decimale gli IP variano nel modo seguente 240-255.x.x.x.
Non è definita una maschera di rete.
Questi indirizzi comincia per 1111.
Per ottenere un blocco di indirizzi da utilizzare in una sottorete, un amministratore di rete deve innanzitutto contattare il proprio ISP, che potrebbe fornire degli indirizzi attingendo da un blocco più grande che gli è già stato allocato. Un provider al quale, a titolo di esempio, sia stato allocato un blocco di indirizzi 200.23.16.0/20, potrebbe a sua volta dividerlo in otto blocchi uguali di indirizzi contigui e fornirne uno a ciascuno delle 8 organizzazioni che supporta, come mostrato sotto:
Rivolgersi ad un ISP è solo un modo per ottenere un blocco di indirizzi, ma non è l'unico.
Esiste una organizzazione che il compito di gestire lo spazio degli indirizzi (ICANN - Internet Corporation for Assigned Names and Numbers).
Un’organizzazione che ha ottenuto un blocco di indirizzi li può assegnare individualmente alle interfacce di host e router nella propria struttura. Per gli indirizzi delle interfacce dei router, l’amministratore di sistema configura manualmente gli indirizzi IP nel router (spesso da remoto). Gli indirizzi degli host possono essere configurati anch’essi manualmente, ma spesso questo viene fatto in automatico attraverso DHCP (dynamic host configuration protocol). DHCP può essere configurato in modo da assegnare ad un determinato host un IP statico, oppure in modo che assegni agli host che si connettono indirizzi temporanei. DHCP è un protocollo client-server dove gli host che si connettono sono dei client che richiedono informazioni sulla rete. Nel caso più semplice ogni sottorete dispone di un server DHCP, altrimenti è necessario un agente di relay (implementato nel router) che conosce l’indirizzo di un server DHCP per quella sottorete. Di seguito ipotizziamo che nella sottorete ci sia un server DHCP. Per i nuovi host DHCP si articola in quattro fasi:
La figura sopra mostra l'attività di un router abilitato al NAT, con un interfaccia che fa parte della rete domestica (destra). La rete domestica usa uno spazio degli indirizzi 10.0.0.0/24, infatti le quattro interfacce hanno lo stesso indirizzo di sottorete (138.76.29.7). Diverse reti potrebbero, e effettivamente usano, lo stesso spazio degli indirizzi, 10.0.0.0/24, per scambiarsi pacchetti internamente. Gli indirizzi privati, come 10.0.0.0/24, hanno senso solo all'interno di una rete. Ma allora come vengono scambiati i pacchetti all'esterno? Con il NAT. Il router delle rete domestica (centrale nella figura) si comporta come un unico dispositivo, con un unico IP. Tutto il traffico generato dai dispositivi della rete a destra, passa ad internet come se fosse generata dal dispositivo con IP 138.76.29.7, stessa cosa vale per il traffico in entrata.
I router prendono i loro indirizzi dal server DHCP dell'ISP e manda in esecuzione il proprio server DHCP per fornire indirizzo IP ai dispositivi interni.
Come fa il router a sapere a quale dispositivo è diretto il traffico in entrata (dato che l'indirizzo cui sono diretti i pacchetti è uguale)? Il router abilitato al NAT usa una tabella di traduzione NAT dove vengono inclusi indirizzi IP (interni) e numeri di porta.
Esempio: diciamo che il dispositivo con IP interno 10.0.0.1 voglia fare una richiesta HTTP (porta 80) all'indirizzo IP: 128.119.40.186. L'host assegna come numero di porta di origine 3345 (arbitrario) e invia il datagramma nella rete locale. Il router NAT riceve il datagramma, cambia l'IP 10.0.0.1 con il proprio indirizzo pubblico 138.76.29.7 e cambia il numero di porta 3345 con uno arbitrario (non ancora presente nella NAT Table), diciamo 5001. Il web server, ignaro delle modifiche apportate al datagramma, riceve la richiesta HTTP con IP sorgente = 138.76.29.7 e porta sorgente = 5001 e risponde usando come destinazione queste informazioni, quando esse giungono nuovamente al router NAT verrà consultata la NAT Table per instradare il pacchetto verso il dispositivo corretto.
(L'esempio è illustrato nell'immagine sopra).
Si noti che i numeri di porta sono a 16 bit: e ci sono circa 60 mila porte che possono accettare connessioni (simultanee) su uno stesso IP (router NAT).