Caratteristiche generali di IPv4

Caratteristiche generali di IPv4

IPv4 è di fatto il protocollo fondamentale del livello Network, ed è un servizio a pacchetto di tipo connectionless/datagram, e quindi è un servizio non affidabile, detto anche “best effort”. Le sue funzioni fondamentali sono le seguenti:

Incapsulamento: in fase di invio, i dati che arrivano dal livello Transport vengono incapsulati i pacchetti contenenti i dati da trasmettere e diversi altri campi con delle informazioni aggiuntive;

Addressing: il protocollo IP fornisce un indirizzo univoco ad ogni host della rete;

Routing: garantisce l’instradamento dei pacchetti;

Decapsulamento: in fase di ricezione, i pacchetti ricevuti vengono decapsulati, quindi vengono rimosse le intestazioni aggiuntive e i dati vengono passati al livello superiore (il TCP);

Figura 17: Incapsulamento e Decapsulamento
Figura 17: Incapsulamento e Decapsulamento

Differenze tra Datagram e servizio Connection Oriented

Nel servizio Datagram ogni pacchetto attraversa la rete indipendentemente dagli altri, eventualmente anche su un percorso diverso. È possibile che la consegna dei pacchetti al destinatario avvenga fuori ordine. La gestione delle risorse (ad esempio la banda) è complessa. Si tratta tuttavia di un protocollo robusto, ovvero in grado di adattarsi in maniera naturale a cambiamento di traffico e a modifiche nella topologia della rete (ad es. gusti). È adatto al traffico dati di tipo “bursty”. Di contro diventa problematico quando si vogliono realizzare servizi carrier grade, dove è richiesta elevata qualità del servizio e recupero veloce dei guasti.

Frammentazione e Riassemblaggio

La frammentazione diventa indispensabile quando i link hanno MTU (Maximum Transmission Unit) diverse. I router provvedono quindi ad effettuare la frammentazione dei pacchetti, aggiungendo un Header con delle informazioni.

Ogni frammento avrà un’intestazione quasi uguale a quella originale. I frammenti possono arrivare a destinazione fuori ordine e può essere complesso effettuarne il riassemblaggio.

Alla destinazione finale, oppure attraverso un router intermedio, avviene il riassemblaggio. Alla ricezione del primo frammento di un pacchetto viene attivato un timer. I frammenti dello stesso pacchetto avranno lo stesso identifier. Se non si finisce entro lo scadere del timer, tutto viene scartato.

La figura che segue mostra l’anatomia dettagliata del pacchetto IP, compreso il suo header.

Figura 19: Pacchetto IP
Figura 19: Pacchetto IP

Vediamo il significato dei vari campi dell’header:

Version [4 bit]: indica la versione del pacchetto IP, in questo caso si tratta della versione 4 (IPv4).

IHL (Internet Header Length) [4 bit]: Indica la lunghezza (in parole da 32 bit) dell’header del pacchetto IP, ovvero la lunghezza dell’offset del campo dati. Tale lunghezza può variare da un minimo di 5 parole, ovvero 20 byte, fino ad un massimo di 15 parole, corrispondenti a 60 byte.

TOS – Type of Service (Tipo di Servizio) [8 bit]: Nelle specifiche iniziali del protocollo, definite da RFC 791, questi bit servivano all’host mittente per specificare il modo e la precedenza con cui l’host di destinazione doveva trattare il datagramma, secondo il seguente schema:

  • bit 0-2: Precedenza;
  • bit 3: Latenza (0 = normale, 1 = bassa);
  • bit 4: Throughput (0 = normale, 1 = alto);
  • bit 5: Affidabilità (0 = normale, 1 = alta);
  • bit 6-7: Riservati per usi futuri;

Ad esempio, un host poteva scegliere di lavorare con una bassa latenza, mentre un altro poteva privilegiare un’elevata affidabilità. Nella pratica l’uso del campo TOS non ha ha avuto molto successo, e di fatto questo campo viene ignorato dai router. Dopo molte sperimentazioni e ricerche, recentemente questi 8 bit sono stati ridefiniti ed hanno la funzione di Differentiated services (DiffServ) nell’IETF e Explicit Congestion Notification (ECN) codepoints (nella specifica RFC 3168), necessari per le nuove tecnologie basate sullo streaming dei dati in tempo reale, come per esempio il Voice over IP (VoIP) usato per lo scambio interattivo dei dati vocali.

Total Length (Lunghezza Totale) [16 bit]: Indica la dimensione (in byte) dell’intero pacchetto, compreso sia l’header che i dati. Tale lunghezza può variare da un minimo di 20 byte (header minimo e campo dati vuoto) ad un massimo di 65535 byte. In ogni momento, ad ogni host è richiesto di essere in grado di gestire datagrammi aventi una dimensione minima di 576 byte mentre sono autorizzati, se necessario, a frammentare datagrammi di dimensione maggiore.

ID – Identification Datagram [16 bit]: questo campo è utilizzato per identificare in modo univoco i vari frammenti in cui può essere stato “spezzato” un pacchetto IP: ogni frammento di uno stesso pacchetto avrà infatti il medesimo ID. Alcune sperimentazioni successive hanno però suggerito di utilizzare questo campo per altri scopi, come aggiungere la funzionalità di tracciamento dei pacchetti.

Flags [3 bit]: questo campo è utilizzato per il controllo del protocollo e della frammentazione dei datagrammi. Può assumere i seguenti valori:

  • Reserved: questo campo è sempre settato a 0 ed è riservato per eventuali usi futuri;
  • DF (Don’t Fragment): se settato a 1 indica che il pacchetto non deve essere frammentato; se tale pacchetto non può essere inoltrato da un host senza essere frammentato allora verrà scartato. Questo può risultare utile per “ispezionare” la capacità di gestione dei vari host del percorso di routing;
  • MF (More Fragments): se settato a 0 indica che il pacchetto è l’ultimo frammento o il solo frammento del pacchetto originario, pertanto tutti gli altri suoi frammenti hanno il bit MF settato a 1. Naturalmente, questo bit sarà sempre 0 anche in tutti i datagrammi che non sono stati frammentati.

Fragment Office (Offset di frammentazione) [13 bit]: questo campo indica l’offset (misurato in blocchi di 8 byte) di un particolare frammento relativamente all’inizio del pacchetto IP originale: il primo frammento ha offset 0. L’offset massimo risulta pertanto pari a (213-1)x8=65528 byte che, includendo l’header, potrebbe eccedere la dimensione massima di 65535 byte di un pacchetto IP.

TTL – Time to live [8 bit]: Indica il tempo di vita (time to live) del pacchetto. Questo parametro è  necessario per evitare la persistenza indefinita sulla rete di un pacchetto nel caso in cui non si riesca a recapitarlo correttamente al destinatario. Storicamente il TTL misurava i “secondi di vita” del pacchetto, mentre ora esso misura il numero di “salti” da nodo a nodo della rete: ogni router che riceve il pacchetto prima di inoltrarlo ne decrementa il TTL (modificando di conseguenza anche il campo Header Checksum): quando questo arriva a zero il pacchetto non viene più inoltrato ma scartato. Tipicamente, quando un pacchetto viene scartato per esaurimento del TTL, viene automaticamente inviato un messaggio ICMP al mittente del pacchetto, specificando il codice di richiesta scaduta; la ricezione di questo messaggio ICMP è alla base del meccanismo di traceroute.

Protocol [8 bit]: questo campo indica il codice associato al protocollo utilizzato nel campo dati del pacchetto IP: per esempio al protocollo TCP è associato il codice 6, ad UDP il codice 17, mentre ad IPv6 è associato il codice 41. La lista dei codici dei vari protocolli, inizialmente definita in RFC 790, è mantenuta e gestita dalla Internet Assigned Numbers Authority.

Header Checksum [16 bit]: questo campo è usato per il controllo degli errori dell’header. Ad ogni passaggio, il checksum viene ricalcolato (secondo la definizione data in RFC 791) e confrontato con il valore di questo campo: se il valore corrisponde allora il pacchetto viene inoltrato, in caso contrario invece viene scartato. È da notare che il checksum non effettua alcun controllo sulla presenza di errori nel campo Dati, delegando tale funzione ai livelli superiori.

Source IP-Address [32 bit]: questo è l’indirizzo IP associato all’host del mittente del pacchetto. Notiamo che questo indirizzo potrebbe non essere quello del “vero” mittente nel caso di traduzioni mediante NAT (Network Address Translation). Infatti, qualora un host intermedio effettui questa traduzione, allora esso provvederà a sostituire l’indirizzo del mittente con uno proprio, mentre effettuerà l’operazione inversa, ovvero provvederà a ripristinare l’indirizzo originario, in tutti i messaggi di risposta che gli arrivano destinati al mittente originario.

Destination IP-Address [32 bit]: questo campo indica l’indirizzo IP associato all’host del destinatario del pacchetto e segue le medesime regole del campo precedente.

Options e Padding: si tratta per l’appunto di opzioni, dall’uso facoltativo, impiegate raramente e per lo più per usi specifici del protocollo, come informazioni sui router.

Dati: il pacchetto dati vero e proprio che deve essere trasmesso al destinatario.

(*) IETF, ovvero Internet Engineering Task Force, è un organismo internazionale formato da tecnici, specialisti e ricercatori che si occupano dell’evoluzione tecnica e tecnologica di Internet. L’organismo si occupa di sviluppare e promuovere standard Internet, in stretta cooperazione con il World Wide Web Consortium e ISO/IEC, e cura in particolare i protocolli dello stack TCP/IP.