Il protocollo IPv4

Sono disponibili attualmente due versioni di IP:

  • IPv4: ampiamente utilizzato
  • IPv6: proposta in sostituzione di IPv4
    Un pacchetto a livello di rete è definito datagramma.

Vediamo com'è fatto un datagramma IPv4.
Pasted image 20231009192006.png
Da sinistra a destra analizziamo ciascuna riga di questo pacchetto:

  • Version: è di 4 bit ed indica la versione del protocollo
  • Header length: indica il punto in cui cominciano i dati del datagramma
  • Type of service: per distinguere i tipi di datagrammi, per esempio i pacchetti di notifica di congestione
  • Datagram length: indica la lunghezza totale del datagramma
  • 16-bit identifier, Flags, 13-bit Fragmentation offset: identificatore, flasg e offset di frammentazione sono utilizzati per la frammentazione che approfondiremo tra breve
  • Time-to-live: tempo di vita del datagramma (TTL)
  • Upper-layer protocol: indica qual è il protocollo a livello di trasporto al quale vanno passati i dati del datagramma
  • Header checksum: consente di rilevare errori nell'intestazione del datagramma, in TCP/UDP viene fatto sull'intero segmento
  • Source Ip address: indirizzo IP del mittente
  • Destination IP address: indirizzo IP cui il pacchetto è diretto
  • Data: i dati contenuti, payload

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.

Frammentazione dei datagrammi IPv4
...

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.
Pasted image 20231009193527.png

Di più sul campo flag

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.

Indirizzamento IPv4
...

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 indirizzi IP, circa 4 miliardi.
L'indirizzo IP 193.32.216.9 corrisponde a:
Ogni interfaccia, sia quella di un host che quella di un router di Internet ha un IP globalmente univoco. Tuttavia, tali indirizzi non possono essere scelti in modo arbitrario. Una parte dell'indirizzo di un'interfaccia è determinata dalla sottorete cui è collegata.
Pasted image 20231009193920.png
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.
Pasted image 20231009194308.png
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 indica il numero di bit nella prima parte dell'indirizzo. Gli bit più a sinistra costituiscono il prefisso di rete dell'indirizzo. I rimanenti bit dell'indirizzo possono essere usati per distinguere i dispositivi interni connessi alla sottorete.
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.
Pasted image 20231009194544.png

Vediamo un esempio più articolato
...

Pasted image 20231009200315.png
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:

  • 223.1.1.0/24
  • 223.1.2.0/24
  • 223.1.3.0/24
    Oltre a queste però ne abbiamo altre tre:
  • 223.1.9.0/24
  • 223.1.8.0/24
  • 223.1.7.0/24
    Che sono le reti interne a ciascun collegamento.
    Di fatti ogni router ha 3 interfacce:
  • 1 per la rete broadcast verso gli host
  • 1 per il collegamento con un router
  • 1 per il collegamento con un altro router
Aggregazione di indirizzi

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.
Pasted image 20231011090006.png
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?

  • L'organizzazione 1 potrebbe rinumerare i proprio router e host al fine di presentare indirizzi all'interno del blocco ISPs-R-Us, si tratta tuttavia di una operazione costosa (senza contare che in futuro tale organizzazione potrebbe essere riassegnata ad un'altra sussidiaria).
  • L'organizzazione 1 mantiene gli indirizzi, tutto rimane invariato se non che ISPs-R-Us adesso mostra anche il blocco di indirizzi dell'organizzazione 1, come si vede nella figura di seguito.

Pasted image 20231011090615.png

Classe A
...

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.

Classe B
...

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.

Classe C
...

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.

Classe D
...

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.

Classe E
...

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.

Come ottenere un blocco di indirizzi
...

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:
Pasted image 20231009200808.png
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).

Come ottenere l'indirizzo di un host: DHCP
...

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:

  1. Individuazione server DHCP. Questa operazione è svolta inviando un messaggio DHCP discover che un client invia in un pacchetto UDP attraverso la porta 67. Ma a chi viene inviato tale datagramma? L’host appena collegato non sa l’IP della rete cui si è appena collegato, così nell’intestazione del pacchetto mette come indirizzo quello di broadcast 255.255.255.255 (tutti gli host) e come indirizzo sorgente 0.0.0.0 (questo host).
  2. Offerta del server DHCP. Un server DHCP che riceve un messaggio di identificazione, risponde al client con un messaggio DHCP offer, che, anch’esso viene inviato in broadcast. L’offerta del server contiene: l’ID di transazione del messaggio di identificazione ricevuto, l’IP proposto al client, la maschera di sottorete e la durata della connessione (dell’ordine di ore o giorni).
  3. Richiesta DHCP. Il client appena collegato sceglierà tra le offerte dei server DHCP (se ce ne sono più di uno) e risponde con un messaggio DHCP request, che riporta i parametri di configurazione.
  4. Conferma DHCP. Il server risponde con un messaggio di DHCP ACK che conferma i parametri richiesti. L'utente può utilizzare l'IP fornito da DHCP per il periodo di tempo specificato nell'offerta. Dato che un utente può prolungare la sua sessione in rete, DHCP fornisce un meccanismo che consente di rinnovare la concessione di un IP.
    Pasted image 20231011091449.png

NAT (Network Address Translation)
...

Pasted image 20231011092043.png
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).