# Internet Protocol

Internet Protocol (IP), in telecomunicazioni e informatica, è un protocollo di rete, che si occupa di indirizzamento/instradamento, appartenente alla suite di protocolli Internet TCP/IP su cui è basato il funzionamento della rete Internet.

## Descrizione

È un protocollo di interconnessione di reti (Inter-Networking Protocol), classificato al livello di rete (3) del modello ISO/OSI, nato per interconnettere reti eterogenee per tecnologia, prestazioni, gestione, pertanto implementato sopra altri protocolli di livello collegamento dati (2). È un protocollo a pacchetti senza connessione e di tipo best effort, che non garantisce cioè alcuna forma di affidabilità della comunicazione in termini di controllo di errore, controllo di flusso e controllo di congestione, che può essere invece realizzata dai protocolli di trasporto di livello superiore (livello 4), come TCP.
Correntemente sono usate due versioni del protocollo IP, l'originaria versione 4 e la più recente versione 6, nata dall'esigenza di gestire meglio il crescente numero di dispositivi (host) connessi ad Internet.

### Compiti e funzioni

Il principale compito di IP è l'Indirizzamento e l'instradamento (commutazione) tra sottoreti eterogenee, che a livello locale utilizzano invece un indirizzamento proprio, tipicamente basato sull'indirizzo fisico o indirizzo MAC e protocolli di livello datalink (2) del modello ISO-OSI (es. Ethernet, Token ring, Token bus). Per far ciò è necessario assegnare un nuovo piano di indirizzamento a cui tutte le sottoreti devono sottostare per poter comunicare e interoperare tra loro: tale piano è rappresentato proprio dal Protocollo IP. Questo comporta infatti:
* l'assegnazione a ciascun terminale che ne fa richiesta (cioè si connette alla rete Internet) di un nuovo diverso indirizzo, univocamente associato all'indirizzo MAC locale, detto Indirizzo IP (tramite protocolli RARP, BOOTP o DHCP);
* la definizione delle modalità o procedure tese a individuare il percorso di rete per interconnettere due qualunque sottoreti durante una comunicazione tra host sorgente di una certa sottorete e host destinatario di un'altra sottorete, cui l'indirizzo IP appartiene. La conoscenza di questo percorso di rete comporta a sua volta l'assegnazione e la conoscenza dell'indirizzo IP a ciascun commutatore (router) che collega la rete dell'host emittente con quella dell'host destinatario, cioè quindi la conoscenza della sequenza di tutti i router di tutte le sottoreti da attraversare.
In sostanza dunque IP rappresenta la "colla" che unisce tra loro tutte le varie sottoreti eterogenee, a livello di indirizzamento\instradamento, permettendone il dialogo o scambio di informazioni tra loro cioè l'interlavoro (internetworking) o interoperabilità in fatto di trasmissione. Rimane invece compito delle singole sottoreti occuparsi di instradare, tramite i protocolli locali di livello 2, verso il successivo commutatore se la rete locale attraversata è solamente una rete di transito lungo il percorso verso un'altra sottorete di destinazione, oppure instradare verso l'Indirizzo MAC locale dell'host destinatario, cui è associato l'indirizzo IP destinatario, se la sottorete è la sottorete finale risolvendo l'indirizzo IP dell'host in indirizzo MAC tramite protocollo ARP. Sotto questo punto di vista (che coincide con la nascita e lo sviluppo storico di Internet) si parla comunemente di integrazione nell'architettura logico-protocollare delle sottoreti del protocollo IP.
In generale dunque l'instradamento in Internet può essere diretto (o locale) (direct forwarding) se deve essere attraversata una sola sottorete fisica cioè l'host destinatario fa parte della stessa sottorete dell'host sorgente oppure indiretto (indirect forwarding) se devono essere attraversate più di una sottorete ovvero se l'host destinatario non appartiene alla stessa sottorete dell'host sorgente. Per quanto detto precedentemente quest'ultimo tipo di indirizzamento altro non è che una successione di instradamenti diretti.
Anche se l'indirizzamento indiretto altro non è che una successione di instradamenti diretti tramite i protocolli locali di trasporto di livello 2, in generale operare un indirizzamento di livello 3 tramite i soli indirizzi MAC, pur essendo questi univoci per ciascun terminale host, non sarebbe stato possibile perché essi non danno vita ad un piano di indirizzamento gerarchico cioè gli indirizzi MAC, il cui assegnamento è pseudo-casuale, non sono raggruppabili in sottoreti con lo stesso prefisso identificativo come invece lo sono gli indirizzi Host_IP. In altri termini esisterebbero notevoli problemi di scalabilità nell'implementare tabelle di instradamento indicizzate non per identificativi di sottoreti (Net_ID), ma per ciascun indirizzo MAC esistente.

## Indirizzo IP

All'interno di una rete IP, ad ogni interfaccia connessa alla rete fisica viene assegnato un indirizzo univoco.
L'indirizzo IP è assegnato propriamente all'interfaccia (ad esempio una scheda di rete) e non all'host, perché è questa ad essere connessa alla rete. Un router, ad esempio, ha diverse interfacce e per ognuna occorre un indirizzo IP.

### Indirizzi IP e nomi DNS

Gli indirizzi IP sono numeri, e come tali non sono facili da ricordare per la maggior parte degli esseri umani. Il problema diventa ancora più serio con IPv6 che ha una stringa di indirizzamento di 128 bit anziché i consueti 32 di IPv4. Per questa ragione, spesso ad un indirizzo IP viene associato un nome simbolico DNS.

### Indirizzi IP ed indirizzi MAC

I protocolli di collegamento, al livello 2 del modello ISO/OSI, indirizzano i calcolatori utilizzando il MAC address.
Quando su una rete locale si utilizza IP, ad ogni calcolatore deve essere assegnato anche un indirizzo IP, per permettergli di comunicare con i calcolatori al di fuori della sua rete locale.
La corrispondenza tra indirizzo IP e MAC address è gestita tramite il protocollo ARP, che permette di conoscere il MAC address di un computer dato il suo indirizzo IP tramite un'interrogazione distribuita.
L'assegnazione di un indirizzo IP ad un calcolatore può essere manuale, o automatizzata da protocolli come DHCP o gli obsoleti BOOTP e RARP.

## Pacchetto IP

Nel pacchetto IP, cioè la sua PDU detta anche datagramma, i campi più importanti sono:
* Header Length: lunghezza dell'header;
* Total Length: Lunghezza totale del pacchetto IP;
* TOS: gestione priorità e QoS;
* Protocol number: Questo campo indica quale protocollo di alto livello è stato usato per creare le informazioni immagazzinate nella porzione di dati del pacchetto;
* Time-to-live: Tempo di vita del pacchetto. Il TTL è un numero che viene decrementato ogni volta che il pacchetto IP percorre un nodo di rete fino ad arrivare a zero. Se il TTL arriva a zero vuol dire che il pacchetto non è riuscito ad arrivare a destinazione ed è stato scartato per evitare di appesantire il traffico inutilmente; si utilizza per evitare possibili cicli infiniti di instradamento.
* Identification: identifica in modo univoco tutti i frammenti di un pacchetto;
* Fragment Offset: indica il numero di byte di dati presenti nel pacchetto ad esso precedente. Se il frammento è il primo o univoco è uguale a 0;
* Header Checksum: checksum in complemento a 1;
* Source IP address: Indirizzo IP del mittente;
* Destination IP address: Indirizzo IP del destinatario;
* Padding: bit riempitivi (0) per riallinearsi su multipli di 32 bit;
* Data: dati da inviare (carico utile).

## Funzionamento
### Host

Un host è un calcolatore che utilizza una rete IP. Un host ha normalmente una interfaccia attiva, configurata con un indirizzo IP (configurato manualmente oppure ricevuto tramite protocolli automatici come DHCP o PPP). Questo indirizzo è caratterizzato da una maschera di sottorete, che permette di calcolare se un altro indirizzo IP appartiene alla stessa sottorete oppure no. Inoltre lo strato IP è configurato con l'indirizzo IP del gateway.

### Instradamento

Estratto l'indirizzo IP dal pacchetto (datagramma IP), mettendo in AND l'indirizzo IP e la subnet-mask si ottiene l'indirizzo di Net_Id che individua la sottorete di destinazione: se tale indirizzo coincide con quello dell'interfaccia del router si ha instradamento diretto all'interno della stessa sottorete dopo risoluzione IP/MAC tramite protocollo ARP, se invece la Net_ID calcolata non corrisponde a nessuna interfaccia del router verso le rispettive sottoreti interconnesse, dopo l'indirizzamento ottenuto tramite consultazione della tabella di routing, si ha instradamento indiretto ovvero il router utilizza l'instradamento diretto (locale) di livello 2 tramite protocollo ARP per inviare il pacchetto verso il gateway o il successivo router (next hop) il quale procederà per successivi salti di instradamento fino alla sottorete di destinazione sempre seguendo le informazioni di instradamento contenute nelle tabelle di routing dei rispettivi router, a loro volta create e aggiornate dinamicamente dai protocolli di routing.
Suddividere l'instradamento in due parti distinte, instradamento per sottorete (Net_Id) e instradamento finale per host (Host_Id), fa parte dunque del piano gerarchico di instradamento secondo IP e ha fondamentalmente ragioni pratico-implementative oltre che di efficienza: non sarebbe infatti possibile instradare pacchetti unicamente secondo l'intero indirizzo IP (o anche l'indirizzo MAC) dell'host in quanto le tabelle di routing avrebbero dimensioni ingestibili da parte dei processi di elaborazione sui router. A tale problema si aggiunge inoltre il fatto che gli indirizzi IP Host_Id sono molto spesso assegnati in maniera dinamica.

### Gateway o Router

Questi dispositivi possiedono più interfacce e collegano tra loro sottoreti diverse, inoltrando pacchetti IP da una all'altra. Per decidere su quale interfaccia inviare un pacchetto ricevuto, cercano l'indirizzo destinazione del pacchetto in una tabella di routing, che nei casi non banali viene gestita dinamicamente tramite uno o più Protocolli di routing.

## Visualizzare la configurazione IP

La maggior parte dei sistemi operativi offrono soluzioni, via shell o applicativi dedicati anche grafici, per visualizzare la configurazione IP del proprio computer.
Alcuni esempi a riga di comando sono:
* Windows:
** ipconfig
** Get-NetIPConfiguration (su PowerShell)
* Linux:
** ifconfig (deprecato)
** ip