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 “Don’t 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.