Che cos’è il protocollo Internet (IP)?

Per inviare dati a qualcuno sulle reti digitali, avete bisogno dell’indirizzo giusto (in questo caso l’indirizzo IP), come accade del resto quando volete inviare una lettera. Così i pacchetti vengono dotati di un indirizzo IP, proprio come si scrive un indirizzo postale sulla busta delle lettere, di modo che la lettera arrivi a destinazione. A differenza degli indirizzi postali, i loro corrispettivi digitali non sono però legati a uno specifico luogo, bensì vengono assegnati automaticamente o manualmente al dispositivo di rete al momento di stabilire una connessione. In questo processo il cosiddetto protocollo Internet ricopre un ruolo importante.

Definizione Internet Protocol

L’Internet Protocol, abbreviato in IP, è il protocollo principale della famiglia dei protocolli Internet e quindi di vitale importanza per lo scambio di messaggi nelle reti di computer. Il protocollo senza connessione, che è stato rilasciato nel 1974 dall’Institute of Electrical and Electronics Engineers (IEEE) e specificato come standard nell’ RFC 791, deve prima di tutto garantire l’invio corretto del pacchetto dal mittente al destinatario. Per questo motivo l’Internet Protocol prestabilisce un formato che definisce il tipo di descrizione di questi pacchetti (chiamati anche datagrammi).

Protocollo Internet: definizione e storia

Il protocollo Internet (in inglese “Internet Protocol“, abbreviato in IP) è un protocollo senza connessione che, in qualità di componente importante della famiglia dei protocolli Internet, ovvero una collezione di circa 500 protocolli di rete, è responsabile per l’indirizzamento e la frammentazione dei pacchetti nelle reti digitali. Insieme al protocollo di trasporto TCP (Transmission Control Protocol) l’indirizzo IP rappresenta la base di Internet.

Per inviare un pacchetto dal mittente al destinatario, il protocollo Internet definisce una struttura di pacchetto che riassume i dati da inviare. Così il protocollo stabilisce in che modo possano essere descritte le informazioni sull’origine e la destinazione dei dati, separando queste informazioni nell’header IP dal carico vero e proprio. Un simile formato di pacchetto viene descritto anche come datagramma.

Nel 1974 l‘Institute of Electrical and Electronics Engineers (IEEE) ha pubblicato una ricerca effettuata dagli informatici statunitensi Robert Kahn e Vint Cerf, che hanno descritto un modello di protocollo per la reciproca connessione di rete del pacchetto sulla base del predecessore di Internet ARPANET. Oltre al protocollo di trasferimento TCP, anche il protocollo IP fa parte dei componenti principali di questo modello, consentendo, con uno specifico livello di astrazione, la comunicazione a partire dalle diverse reti fisiche. Successivamente sono state associate sempre più reti di ricerca sulla base di questa combinazione di protocollo, descritta come “TCP/IP”, che è stata definitivamente specificata come standard nell’RFC 791 nel 1981.

IPv4 e IPv6: cosa si nasconde dietro i differenti numeri di versione

Oggigiorno chi ha a che fare con un simile indirizzo IP per rendere, ad esempio, indirizzabili i computer nella rete locale, si imbatte nelle due varianti, IPv4 e IPv6. Con questi non si indicano però la quarta e la sesta generazione del protocollo IP, anche se in passato il protocollo ha subito dei cambiamenti radicali. Infatti nel caso dell’IPv4 si tratta piuttosto della prima versione ufficiale del protocollo Internet, mentre il numero di versione deriva solamente dal fatto che viene utilizzata la quarta generazione del protocollo TCP. Il protocollo IPv6 è a sua volta il successore diretto dell’IPv4, visto che lo sviluppo del protocollo IPv5 è stato tempestivamente sospeso per motivi economici.

Tuttavia, anche se non ci sono altre release dell’IPv4 e dell’IPv6, il protocollo Internet è stato revisionato dal 1974, come già accennato, quando non esisteva ancora come protocollo autonomo e faceva ancora parte del protocollo TCP. Essenzialmente ci si era concentrati sull’ottimizzazione della connessione e dell’indirizzamento. Così è stata ad esempio aumentata già prima la lunghezza bit degli indirizzi host, portandola da 16 a 32 bit, tramite la quale lo spazio di indirizzamento è stato ampliato a circa quattro miliardi di possibili combinazioni. L’innovativo IPv6 consente di arrivare addirittura a 340 sestilioni di diversi indirizzi, cioè a un numero con 37 zeri, grazie all’ampliamento dello spazio di indirizzamento a 128 bit, con il quale si riuscirà a soddisfare per molto tempo la necessità di nuovi indirizzi Internet.

Come è strutturato l’header IP di un datagramma

Come già accennato, il protocollo Internet si assicura che vengano antecedute a ogni pacchetto, nell’header, le proprietà strutturali importanti e che gli venga assegnato il protocollo di trasporto adeguato (solitamente quello TCP). La sezione intestazione è stata radicalmente modificata nella versione 6, motivo per cui si deve fare una distinzione tra l’header dell’IPv4 e quello dell’IPv6.

Struttura dell’header dell’IPv4

Ogni header IP comincia quindi sempre con un’indicazione di 4 bit del numero di versione del protocollo Internet IPv4 o IPv6. Seguono altri 4 bit che comprendono le informazioni sulla lunghezza dell’header (Internet Header Length), visto che non è costante. La lunghezza totale (Total Length) si calcola sempre a partire da questo valore moltiplicato per 32 bit. Il valore 5, il più piccolo possibile, sta quindi per una lunghezza dell’header di 160 bit che corrisponde a 20 byte. In questo caso non si aggiungono opzioni. Il massimo è il valore 15, ovvero 480 bit che corrispondono a 60 byte.

I bit da 8 a 15 (Type of Service) possono comprendere istruzioni per come trattare il datagramma e quale priorità dargli. In questo caso l’host può ad esempio indicare l’importanza per lui di punti, quali l’attendibilità, la capacità e il ritardo durante la trasmissione dati.

La lunghezza totale indica la dimensione complessiva del pacchetto, in altre parole somma le dimensioni dei dati di utilizzo alla lunghezza dell’header. Visto che il campo ha una lunghezza di 16 bit, il limite massimo è di 65.635 byte. In più nell’RFC 791 è stabilito che ogni host deve essere in grado di elaborare almeno 576 byte. Un datagramma può essere frammentato in un qualsiasi modo sul percorso per raggiungere l’host di destinazione dei router e degli altri dispositivi, anche se i frammenti non dovrebbero essere più piccoli di 576 byte. Gli altri campi dell’header IPv4 hanno il seguente significato:

 

  • Identification: tutti i frammenti di un datagramma dispongono di uno stesso numero di identificazione che ricevono dal mittente. Comparando questo campo di 16 bit, l’host di destinazione può quindi assegnare i singoli frammenti a un datagramma preciso.

  • Flags: ogni header IP comprende 3 flag di bit che includono le informazioni e le istruzioni da seguire per la frammentazione. Il primo bit è perciò occupato e ha sempre il valore di 0. Il secondo bit che prende il nome di “Dont Fragment“ svela se il pacchetto può essere frammentato (0) o no (1). L’ultimo bit, chiamato “More Fragments“, informa se seguono altri frammenti (1) o se il pacchetto è stato già chiuso completamente (1) o se termina con il frammento corrente (0).

  • Fragment offset: questo campo informa l’host di destinazione di quale punto faccia parte il singolo frammento di modo che possa ricomporre di nuovo facilmente tutto il datagramma. Con “offset” si indica lo scarto rispetto ad un valore di riferimento. La lunghezza di 13 bit segnala che un datagramma può essere suddiviso al massimo in 8192 frammenti.

  • Time to Live (TTL): per evitare che un pacchetto nella rete si sposti da nodo a nodo per un tempo indefinito, viene provvisto di una durata massima di vita al momento dell’invio, cioè del Time to live. Per questo campo di 8 bit lo standard RFC prevede l’unità in secondi e così la durata massima ammonta a 255 secondi. Per ogni nodo di rete attraversato il TTL viene ridotto di almeno 1. Se viene raggiunto il valore 0, il pacchetto viene automaticamente respinto.

  • Protocol: il campo protocollo (8 bit) assegna al pacchetto il rispettivo protocollo di trasporto, ad esempio il valore 6 sta per il protocollo TCP o il valore 17 per quello UDP. Dal 2002 viene gestita e aggiornata la lista di tutti i possibili protocolli dalla IANA (Internet Assigned Numbers Authority).

  • Header Checksum: il campo checksum di 16 bit comprende la checksum dell’header che deve essere riconteggiata per ogni nodo di rete, per via del TTL ridotto a ogni stazione intermedia. La correttezza dei dati da utilizzare non viene verificata per motivi di efficienza.

  • Source and Destination Address: 32 bit, quindi 4 byte, sono destinati all’indirizzo IP dell’host di origine e di destinazione. Questi indirizzi IP vengono scritti solitamente sotto forma di numeri decimali separati da 4 punti. L’indirizzo più basso è quindi 0.0.0.0, quello più alto 255.255.255.255.

 

Options: il campo di opzioni amplia il protocollo IP di informazioni aggiuntive, non previste nella struttura standard. Visto che in questo caso si tratta solo di campi opzionali, la lunghezza è variabile e viene limitata solo dalla lunghezza massima dell’header. Tra le opzioni possibili rientrano ad esempio “Security” che segnala la crittografia del datagramma, “Record Route” che indica tutti i nodi di rete attraversati e include i loro indirizzi IP per poter comprendere il percorso del pacchetto, e “Time Stamp” che inserisce la data e l’ora in cui è stato attraversato un preciso nodo.

Struttura dell’header IPv6

Al contrario dell’header del suo predecessore, l’header del protocollo IPv6 ha una dimensione fissa di 320 bit (40 byte). Le informazioni aggiuntive, necessarie solo di rado, vengono allegate separatamente tra l’header standard e il carico (payload). Queste righe di estensione della sezione intestazione (Extension Header) vengono comparate con il campo di opzione del protocollo IPv4 e possono essere adattate in ogni momento senza che debba essere modificato l’header vero e proprio. Tra gli altri, in questo modo si possono definire i percorsi del pacchetto, indicare le informazioni di frammentazione o avviare la comunicazione crittografata tramite IPSec. Tuttavia non esiste una checksum dell’header che vada particolarmente a favore della performance.

L’header IP vero e proprio comincia con un numero di versione del protocollo Internet di 4 bit, come anche nel caso dell‘IPv4. Il successivo campo “Traffic Class” equivale alla voce “Type of Service” nella variante di protocollo precedente. Come nella versione precedente, questi 8 bit informano l’host di destinazione sull’elaborazione qualitativa del datagramma, per cui valgono le stesse regole. Nell’IPv6 il Flow Label (20 bit) è un campo nuovo grazie al quale è possibile identificare flussi di dati provenienti da pacchetti correlati, per riservare la banda larga e ottimizzare il routing. La seguente lista illustra le altre informazioni dell’header del protocollo IP migliorato:

 

  • Payload Length: l’IPv6 comunica un valore per le dimensioni del carico dati trasportato, comprensivo di Extension Header (in totale 16 bit). Nella versione precedente questo valore doveva essere calcolato separatamente dalla lunghezza totale, sottraendo la lunghezza dell’header.

  • Next Header: il campo “Next Header“ di 8 bit è l’equivalente dell’indicazione del protocollo nell’IPv4 e ha preso come tale la relativa funzione, vale a dire l’assegnazione del protocollo di trasporto desiderato.

  • Hop Limit: il limite dell’hop (8 bit) definisce il numero massimo di stazioni intermedie che può attraversare un pacchetto, prima che venga respinto. Come nel campo TTL nell’IPv4, il valore viene ridotto di almeno 1 a ogni nodo.

Source and Destination Address: la maggior parte dell’header IPv6 è occupata dagli indirizzi del mittente e del destinatario. Come già brevemente accennato all’inizio, questi hanno una lunghezza di 128 bit (il quadruplo degli indirizzi IPv4). Anche per quanto riguarda la solita annotazione ci sono delle differenze sostanziali: infatti la versione più recente del protocollo Internet ricorre a numeri esadecimali, suddividendoli in 8 blocchi di 16 bit ciascuno. Per la suddivisione vengono utilizzati dei doppi punti invece dei punti. Così un indirizzo IPv6 completo assume la seguente forma: 2001:0db8:85a3:08d3:1319:8a2e:0370:7344.

Come funziona l’assegnazione di indirizzo del protocollo Internet?

I datagrammi devono essere prima di tutto assegnati ai membri della rete, di modo che nell’header possano essere eseguite le indicazioni elementari dell’indirizzo di origine e di destinazione. In questo caso si distingue tradizionalmente tra indirizzi IP interni ed esterni o pubblici. Ai primi, che servono per la comunicazione nelle reti locali, sono destinati i tre spazi di indirizzamento:

  • Da 10.0.0.0 a 10.255.255.255
  • Da 172.16.0.0 a 172.31.255.255
  • Da 192.168.0.0 a 192.168.255.255

Per le reti IPv6 è previsto il prefisso “fc00::/7”. Gli indirizzi di questi campi non vengono instradati su Internet e possono perciò essere selezionati liberamente e utilizzati nelle reti private o aziendali. L’assegnazione di un indirizzo avviene tramite inserimento manuale o automatico non appena un dispositivo si collega alla rete, a patto che l’assegnazione di indirizzo automatica sia attiva e venga utilizzato un server DHCP. Inoltre, grazie a una maschera di sottorete, una simile rete locale può essere segmentata in altri campi.

Gli indirizzi IP esterni vengono assegnati ai router automaticamente dal rispettivo provider quando si connettono a Internet. Tutti i dispositivi, che si trovano in rete tramite un router in comune, ricorrono in breve allo stesso IP esterno. Di solito i provider assegnano un nuovo indirizzo Internet ogni 24 ore da uno spazio di indirizzamento che è stato loro assegnato, a sua volta, dalla IANA. Ciò vale per l’arsenale quasi inesauribile di indirizzi IPv6 che sono rilasciati solo in parte per un normale utilizzo. Inoltre non viene solo fatta una suddivisione in indirizzi privati e pubblici, bensì emergono, grazie a possibilità di classificazione essenzialmente più versatili, anche i cosiddetti campi di validità (Address Scopes):

 

  • Host scope: un host può utilizzare l’indirizzo indicato come loopback 0:0:0:0:0:0:0:1 per inviare i datagrammi IPv6 a se stesso.

  • Link local scope: per la connettività dell’IPv6 è fondamentale che ogni host disponga di un proprio indirizzo, anche se è valido solo in una rete locale. Questo indirizzo link local è segnalato tramite il prefisso “fe80::/10“ ed è ad esempio necessario per la comunicazione con lo standard gateway (router) per poter generare un indirizzo IP pubblico.

  • Unique local scope: si tratta di uno spazio di indirizzamento già tematizzato “fc00::/7“, dedicato esclusivamente alla configurazione delle reti locali.

  • Site local scope: il Site Local Scope è nel frattempo uno spazio di indirizzamento più datato con il prefisso “fec0::/10”, che è stato ugualmente definito per le reti locali. Dall’unione di diverse reti o all’interno delle connessioni VPN tra le reti, che erano numerate con gli indirizzi site local, si è giunti però a delle complicazioni, motivo per cui lo standard è stato classificato come superato.

  • Global scope: ogni host che vorrebbe instaurare una connessione con Internet ha bisogno almeno di un proprio indirizzo pubblico che l’host desume per autoconfigurazione, ricorrendo allo SLAAC (configurazione di indirizzo senza stato) o al DHCPv6 (configurazione di indirizzo orientata allo stato).

  • Multicast scope: i nodi di rete, i router, i server e gli altri servizi di rete possono essere raccolti con l’IPv6 in gruppi multicast. Ognuno di questi gruppi dispone di un proprio indirizzo tramite il quale si possono raggiungere tutti gli host coinvolti con un singolo pacchetto.

 

Come il protocollo IP regola la frammentazione

Tutte le volte che un pacchetto deve essere inviato tramite TCP/IP avviene automaticamente una verifica delle dimensioni totali: se queste superano l’unità di trasmissione massima (“Maximum Transmission Unit” in inglese) della corrispettiva interfaccia di rete, le informazioni vengono frammentate, quindi scomposte in blocchi di dati più piccoli. Questo compito è assunto dall’host che invia (IPv6) o un router intermedio (IPv4). Il pacchetto viene unito di default dal destinatario, per cui ricorre alle informazioni di frammentazione memorizzate nell’header IP o nell’Extension Header. In casi eccezionali il Reassembling (in italiano: “riassemblamento”) può essere intrapreso da un firewall, a patto che sia configurato adeguatamente.  

Visto che in generale l’IPv6 non prevede più la frammentazione e questa non è neanche più permessa dal router, il pacchetto IP deve avere una dimensione adeguata già prima di essere inviato. Se i datagrammi IPv6 che vanno oltre la Maximum Transmission Unit raggiungono un router, quest’ultimo li rigetta e informa il mittente sotto forma di un messaggio ICMPv6 di tipo 2 “Packet too big” (in italiano “Il pacchetto [è] troppo grande). L’applicazione che invia i dati può creare pacchetti più piccoli, non frammentati, o avviare una frammentazione. Infine al pacchetto IP viene aggiunto l’Extension Header adeguato, di modo che dopo la ricezione l’host di destinazione possa ricomporre anche i singoli frammenti.