IPv4: differenze tra le versioni
Aspetto
Contenuto cancellato Contenuto aggiunto
Aggiunto link proposto come non esistente |
←Pagina svuotata completamente |
||
Riga 1: | Riga 1: | ||
'''IPv4''' (Internet Protocol version 4) è la quarta revisione dell'[[Internet Protocol]]. Il protocollo è descritto nell'RFC 791, pubblicato dalla [[Internet Engineering Task Force|IETF]] nel settembre [[1981]], ed è il più usato a [[livello di rete]], poiché fa parte della [[suite di protocolli Internet]]. |
|||
Nel [[1998]] è stata suggerita una nuova versione del protocollo Internet, denominata [[IPv6]], a causa del problema della [[saturazione di IPv4]]. Al [[2011]], l'IPv6 risulta tuttavia meno utilizzato rispetto alla versione 4<ref>{{en}} [http://bgp.potaroo.net/v6/v6rpt.html IPv6: IPv6 / IPv4 Comparative Statistics]</ref>. |
|||
== Il pacchetto IPv4 == |
|||
L'header del pacchetto IPv4 consiste in 13 campi di cui 1 opzionale (segnalato nello schema con sfondo rosso) e chiamato con il nome di ''Options''. I campi sono inseriti col byte più significativo messo per primo (notazione [[Ordine dei byte|big-endian]]) e all'interno dei singoli byte il bit più significativo è il primo (quello di indice 0). |
|||
{| class="wikitable" style="margin: 0 auto; text-align: center;" |
|||
|- align="center" |
|||
! width="4%"|+ |
|||
! colspan="4" width="12%"| Bits 0–3 |
|||
! colspan="4" width="12%"| 4–7 |
|||
! colspan="8" width="24%"| 8–15 |
|||
! colspan="3" width="9%"| 16–18 |
|||
! colspan="13" width="39%"| 19–31 |
|||
|- align="center" |
|||
! 0 |
|||
| colspan="4"| Version |
|||
| colspan="4"| Internet<br />Header length |
|||
| colspan="8"| [[Type of Service]]<br />(adesso [[Differentiated services|DiffServ]] e [[Explicit Congestion Notification|ECN]]) |
|||
| colspan="16"| Total Length |
|||
|- align="center" |
|||
! 32 |
|||
| colspan="16"| Identification |
|||
| colspan="3"| Flags |
|||
| colspan="13"| Fragment Offset |
|||
|- align="center" |
|||
! 64 |
|||
| colspan="8"| Time to Live |
|||
| colspan="8"| Protocol |
|||
| colspan="16"| Header Checksum |
|||
|- align="center" |
|||
! 96 |
|||
| colspan="32"| Source Address |
|||
|- align="center" |
|||
! 128 |
|||
| colspan="32"| Destination Address |
|||
|- align="center" |
|||
! 160 |
|||
| colspan="32" bgcolor="#FFDDDD"| Options (facoltativo) |
|||
|- align="center" |
|||
! 160<br />o<br />192+ |
|||
| colspan="32"| <br />Data<br /> |
|||
|} |
|||
* '''Versione''' [4 bit] - Indica la versione del [[Pacchetto (reti)|pacchetto]] IP: per IPv4, ha valore 4 (da qui il nome IPv4); |
|||
* '''Internet Header Length''' (''IHL'') [4 bit] - Indica la lunghezza (in [[word]] da 32 bit) dell'header del pacchetto IP ovvero l'offset del campo dati; tale lunghezza può variare da 5 word (20 byte) a 15 word (60 byte) a seconda della presenza e della lunghezza del campo facoltativo ''Options''; |
|||
* '''Type of Service''' (''TOS'') [8 bit] - Nelle specifiche iniziali del protocollo (RFC 791), questi bit servivano all'host mittente per specificare il modo e in particolare la precedenza con cui l'host ricevente doveva trattare il datagramma: |
|||
** 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 una bassa latenza, mentre un altro preferire un'alta affidabilità. Nella pratica questo uso del campo TOS non ha preso largamente piede. |
|||
: Dopo molte sperimentazioni e ricerche, recentemente questi 8 bit sono stati ridefiniti ed hanno la funzione di [[Differentiated services|Differentiated services (DiffServ)]] nell'[[IETF]] e [[Explicit Congestion Notification|Explicit Congestion Notification (ECN)]] codepoints (vedi 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''' [16 bit] - Indica la dimensione (in byte) dell'intero pacchetto, comprendendo header e 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; |
|||
* '''Identification''' [16 bit] - Utilizzato, come da specifiche iniziali, per identificare in modo univoco i vari frammenti in cui può essere stato "spezzato" un pacchetto IP. Alcune sperimentazioni successive hanno però suggerito di utilizzare questo campo per altri scopi, come aggiungere la funzionalità di tracciamento dei pacchetti; |
|||
* '''Flags''' [3 bit] - Bit utilizzati per il controllo del protocollo e della frammentazione dei datagrammi: |
|||
** Reserved - sempre settato a 0. Come [[pesce d'aprile]], in RFC 3514 si è proposto di utilizzarlo come "[[:en:Evil_bit|Evil bit]]"; |
|||
** 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, viene semplicemente 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 Offset ''' [13 bit] - 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 <math>(2^{13}-1)\times8=</math>65528 byte che, includendo l'header, potrebbe eccedere la dimensione massima di 65535 byte di un pacchetto IP; |
|||
* '''[[Time to live]]''' (''TTL'') [8 bit] - Indica il ''tempo di vita'' ([[time to live]]) del pacchetto, necessario per evitarne la persistenza indefinita sulla rete nel caso in cui non si riesca a recapitarlo 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 [[Internet Control Message Protocol|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] - Indica il codice associato al [[Protocollo di rete|protocollo]] utilizzato nel campo dati del pacchetto IP: per esempio al protocollo [[Transmission Control Protocol|TCP]] è associato il codice ''6'', ad [[User Datagram Protocol|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] - È un campo usato per il controllo degli errori dell'header. Ad ogni hop, il checksum viene ricalcolato (secondo la definizione data in [[Request for Comments|RFC]] 791) e confrontato con il valore di questo campo: se non c'è corrispondenza il pacchetto viene scartato. È da notare che non viene effettuato alcun controllo sulla presenza di errori nel campo ''Data'' deputandolo ai livelli superiori; |
|||
* '''Source address''' [32 bit] - Indica l'''indirizzo IP associato all'host del mittente'' del pacchetto. |
|||
: Da notare che questo indirizzo potrebbe non essere quello del "vero" mittente nel caso di traduzioni mediante [[Network address translation|NAT]]. Infatti, qualora un host intermedio effettui questa traduzione, sostituisce l'indirizzo del mittente con uno proprio, premurandosi poi di ripristinare l'indirizzo originario su tutti i messaggi di risposta che gli arrivano destinati al mittente originario; |
|||
* '''Destination address''' [32 bit] - Indica l'''indirizzo IP associato all'host del destinatario'' del pacchetto e segue le medesime regole del campo ''Source address''; |
|||
* '''Options''' - Opzioni (facoltative e non molto usate) per usi più specifici del protocollo, come informazioni sui router; |
|||
: Si ricorda che il valore del campo ''IHL'' deve essere sufficientemente grande da includere anche tutte le opzioni e, nel caso queste siano più corte di una word, il padding necessario a completare i 32 bit. Inoltre, nel caso in cui la lista di opzioni non coincida con la fine dell'header, occorre aggiungere in coda ad essa un marcatore ''EOL'' (''End of Options List''). |
|||
: C'è da notare infine che, potendo causare problemi di sicurezza, l'uso delle opzioni ''LSSR'' e ''SSRR'' (''Loose'' e ''Strict Source and Record Route'') è scoraggiato e molti router bloccano i datagrammi che contengono queste opzioni. |
|||
Di seguito è riportata la struttura contenuta nell'[[header file|header]] ''ip.h'' della [[GNU C Library|libreria GNU C]]: |
|||
<pre> |
|||
struct iphdr { |
|||
#if __BYTE_ORDER == __LITTLE_ENDIAN |
|||
unsigned int ihl:4; |
|||
unsigned int version:4; |
|||
#elif __BYTE_ORDER == __BIG_ENDIAN |
|||
unsigned int version:4; |
|||
unsigned int ihl:4; |
|||
#else |
|||
# error "Please fix <bits/endian.h>" |
|||
#endif |
|||
u_int8_t tos; |
|||
u_int16_t tot_len; |
|||
u_int16_t id; |
|||
u_int16_t frag_off; |
|||
u_int8_t ttl; |
|||
u_int8_t protocol; |
|||
u_int16_t check; |
|||
u_int32_t saddr; |
|||
u_int32_t daddr; |
|||
// The options start here. |
|||
}; |
|||
</pre> |
|||
== Indirizzamento IPv4 == |
|||
L'indirizzo IPv4 è formato da 32 bit, esso è univoco sulla [[rete telematica|rete]] di cui fa parte. Tale indirizzo, inoltre, non va assegnato all'host, ma alle connessioni fisiche alla [[rete telematica|rete]] che l'[[host]] possiede (nel cast di ''host multicollegati'' o di [[dispositivi di rete]]). Si è però verificato che i primi paesi in cui si è diffuso Internet e all'interno di essi i primi provider, si sono "accaparrati" un numero di Ip proporzionalmente sbilanciato. Gli ultimi provider hanno pertanto dovuto ricorrere ad un sistema per ovviare alla scarsità degli IP a loro attribuiti. Hanno pertanto considerato gli utenti a loro connessi di una intera città come un'unica LAN e pertanto tutti dotati dello stesso IP. |
|||
Concettualmente l'indirizzo IP si compone di due parti: |
|||
# identificatore di [[rete telematica|rete]] e precisamente della [[sottorete]]; |
|||
# identificatore di [[host]]. |
|||
=== Notazione decimale puntata === |
|||
Per semplificarne la lettura, ogni indirizzo IP viene descritto con 4 numeri in base decimale, in modo che ognuno rappresenti un byte (il valore di un byte varia da 0 a 255 quando lo consideriamo in base dieci), separati dal simbolo "punto"; un esempio di indirizzo IPv4 è 192.0.34.166. |
|||
=== Indirizzi particolari === |
|||
Ogni indirizzo in cui l'identificativo [[host]] presenta tutti 0 si riferisce alla rete, mentre se tutti i bit di questo identificativo sono a 1, l'indirizzo si riferisce ad una trasmissione [[broadcast]] diretta. |
|||
In pratica quando ad un [[router]] arriva un pacchetto in cui la parte di host dell'indirizzo presenta tutti i bit a 1, esso esegue un broadcast a tutti i nodi della sotto-rete. Questo comportamento è stato sfruttato dai [[Cracker (informatica)|cracker]] per creare attacchi di tipo [[denial of service]], pertanto è buona norma disabilitare nei router l'inoltro del broadcast diretto. |
|||
=== Indirizzamento a classi === |
|||
{{vedi anche|Classi di indirizzi IP}} |
|||
Se un host deve comunicare con un altro host della stessa sottorete, userà il protocollo di livello 2 della rete a cui è collegato, altrimenti dovrà inviare i pacchetti ad un [[router|gateway o router]], che sarà connesso ad altre reti e si occuperà di inoltrare i pacchetti ricevuti. |
|||
La comunicazione tra i router avviene mediante indirizzi IP utilizzando delle tecniche particolari di indirizzamento per individuare la sottorete e l'host. |
|||
Originariamente lo schema delle suddivisioni delle due componenti era a classi per cui un [[indirizzo IP]] apparteneva una classe (''classfull'') in base ai primi 4 bit dell'IP. |
|||
Con questo schema l'indirizzo è ad [[autoidentificazione]] perché il confine tra le due componenti si può determinare con i bit più significativi. |
|||
=== Limiti === |
|||
Il numero di indirizzi univoci disponibili in IPv4 è <math>2^{32} = 256^4 = 4.294.967.296 \cong 4,3 \cdot 10^9 </math>, ma bisogna tener presente che non vengono usati tutti, perché alcuni sono riservati a un particolare utilizzo (ad esempio gli indirizzi 0.0.0.0, [[127.0.0.1]], 255.255.255.255, 192.0.34.166 e la classe 192.168.0.1/16) e perché certe classi non vengono sfruttate interamente per via della suddivisione interna in classi più piccole. |
|||
L'indirizzamento a [[Classi di indirizzi IP|classi]], proprio per questo, presenta diversi limiti dovuti soprattutto al numero di host gestibili dalle diverse classi. |
|||
In pratica se si esauriscono gli indirizzi univoci resi disponibili da una classe, ad esempio la C connettendo più di 255 host, occorre fare ricorso ad un indirizzo di classe superiore. |
|||
Il cambiamento di indirizzo non è indolore con questa tecnica perché il software di rete va aggiornato con i nuovi indirizzi e non consente una transizione graduale. |
|||
In pratica l'indicatore di rete univoco non poteva adempiere alle esigenze della crescita che negli anni ottanta ebbero le reti [[LAN]]. Quindi per risparmiare i prefissi di rete si dovettero escogitare altre tecniche come quella del ''mascheramento'' (vedi [[Network address translation|NAT]]) per continuare a fare in modo che IPv4 potesse adempiere al suo ruolo prima dell'entrata di [[IPv6]]. |
|||
=== Indirizzamento senza classi === |
|||
L'indirizzamento in classi è considerato obsoleto e per permettere un migliore sfruttamento degli indirizzi IP disponibili, è stato introdotto l'indirizzamento senza classi (''classless''), o [[CIDR]]. |
|||
La modifica introdotta dal CIDR consiste essenzialmente nell'utilizzare ''maschere di sottorete'' (''[[subnet mask]]'') di lunghezza arbitraria, mentre l'indirizzamento con classi ammetteva solo tre lunghezze della maschera di sottorete: /8, /16 e /24. La maschera della vecchia classe C (/24) è ancora popolare, ma si usano anche maschere più corte per reti grandi (/23 o /22) o più lunghe per reti piccole (/25, /26, fino a /30 per reti punto-punto). |
|||
I bit che nella maschera di sottorete sono a 1 fanno parte dell'indirizzo della sottorete, gli altri sono l'indirizzo dell'host. Normalmente, la maschera di sottorete è costituita da N bit a 1 seguiti da (32-N) bit a 0 e può essere abbreviata nella forma /N. |
|||
In questo modo non si è vincolati a un numero fisso di bit per determinare l'indirizzo di rete, ma i bit utili a rappresentare la rete, piuttosto che l'host, sono fissati liberamente. |
|||
Vedi anche [[Saturazione di IPv4]]. |
|||
=== Enti di gestione === |
|||
Gli indirizzi IP sono univoci a livello mondiale e vengono assegnati in modo centralizzato da una gerarchia di enti appositi. Sono considerati una risorsa preziosa da gestire con cura. Per rafforzare questo concetto, si parla di "indirizzi IP pubblici". |
|||
Inizialmente l'autorità preposta era la IANA (''Internet Assigned Number Authority''), dopo il [[1998]] venne creato l'[[ICANN]] (''Internet corporation for Assigned Names and Numbers'') che opera tuttora. Essa è responsabile della gestione degli indirizzi IP in base alle direttive dell'[[Request for Comments|RFC]] 2050. |
|||
== Note == |
|||
<references /> |
|||
== Voci correlate == |
|||
* [[Internet Protocol]] |
|||
* [[IPv6]] |
|||
* [[Classi di indirizzi IP]] |
|||
* [[Saturazione di IPv4]] |
|||
* [[Transizione IPV4/IPV6]] |
|||
* [[IP broadcast]] |
|||
== Altri progetti == |
|||
{{interprogetto}} |
|||
== Collegamenti esterni == |
|||
* {{cita web|http://www.ietf.org/rfc/rfc0791.txt|RFC 791 - Internet Protocol|lingua=en}} |
|||
* {{cita web|http://tools.ietf.org/html/rfc3168|RFC 3168 - Explicit congestion notification|lingua=en}} |
|||
* {{cita web|http://www.ietf.org/rfc/rfc2050.txt|RFC 2050 - Internet Registry IP Allocation Guidelines|lingua=en}} |
|||
{{IPstack}} |
|||
{{Controllo di autorità}} |
|||
{{Portale|Telematica}} |
|||
[[Categoria:Standard Internet]] |
|||
[[Categoria:Protocolli livello rete]] |