# Protocolli di rete

Un protocollo di rete è un insieme di regole che due macchine devono rispettare per poter comunicare tra di loro. L'utilizzo di protocolli diventa necessaria quando la tipologia di macchina varia (es: computer e palle) o più semplicemente quando il costruttore è diverso.

## Pila ISO/OSI

La logica della comunicazione tra computer si basa su uno standard chiamato OSI(Open System Interconnection). Questo standard definisce 7 livelli, o stack, che rappresentano i passaggi obbligatori che un'informazione deve subire per poter partire da un host e arrivare ad un altro host. Nei vari livelli di questa pila troviamo famiglie di protocolli utilizzabili che stabiliscono le regole per quel livello e consento all'informazione di passare al livello successivo. I livelli, o stack, vengono percorsi dal livello fisico (cavo o mezzo su cui viaggia la trasmissione elettrica) al livello applicativo (ultimo livello appena sotto all'applicazione usata dall'utente) e viceversa a seconda che sia una trasmissione o ricezione di dati. Per approfondire vedere Standard ISO/OSI.

## Livello Fisico
### Bluetooth

Bluetooth è una specifica dell'omonimo protocollo, che permette a due macchine di interagire tra di loro attraverso la comunicazione tramite onde radio corte. Sviluppata da Etheri5G nel 1999, è ancora oggi uno dei protocolli più sicuri. Può essere considerato come una Wireless Personal Area Network (WPAN).
L'attuale versione è la 2.0, ma presto verrà sostituita dalla versione Lisbon, con maggiore sicurezza e portata (l'attuale portata non supera i 100 metri). Ogni dispositivo può essere classificato in base alla potenza:
* 1 mW: ~ 1 metro di portata
* 2,5 mW: ~ 10 metri di portata
* 100 mW: ~ 100 metri di portata
Per approfondire vedere Bluetooth.

### DSL

DSL (a volte chiamata anche come xDSL) è una famiglia di protocolli che gestisce la comunicazione dati tra la centrale telefonica e l'abbonato. Normalmente questa tecnologia non supera i 24 MB/s per problemi hardware.

#### aDSL

L'ADSL (Asymmetric Digital Subscribe Line) è il protocollo più diffuso delle tecnologie DSL. Il protocollo ADSL si occupa di gestire la quantità di traffico in entrata e in uscita (Asymmetric), aumentando o dimuendo in base alle esigenze upload e download. Le compagnie telefoniche di solito lasciano più alto il traffico in entrata solitamente più richiesto dall'utente.
Per approfondire vedere DSL.

### UWB
## Livello Datadik
### Ethernet

La tecnologia Ethernet utilizza connettori RJ-45 per scambiarsi dati. Si basa sulla tecnologia dei frames:
* Preamble: Messaggio di 8 byte predefinito. Se la scheda di rete rileva questo messaggio e la macchina non è avviata, tenta di avviarla.
* SFD: Avvisa che il Preamble è terminato. È stato inserito per problemi di compatibilità con diverse versioni (prima il Preamble aveva 7 byte).
* Destination Mac Address: Questo campo contiene l'indirizzo MAC dell'adattatore di destinazione.
* Source Mac Address: Questo campo contiene l'indirizzo MAC dell'adattatore sorgente.
* EtherType: (2 byte) Contiene la versione del protocollo e la lunghezza dei dati.
* Payload: Contiene i dati di trasmissione. La lunghezza minima è 46 byte, mentre quella massima 1500 byte. Se il valore supera il limite, i dati vengono separati in pacchetti.
* FCS: Chiamato anche CSC è il controllo di ridondanza ciclica, serve a verificare se ci sono errori di trasmissione. La lunghezza è di 4 byte.

### FDDI
## Livello Rete
### X.25
## Livello Trasporto
### TCP

Transmission Control Protocol (TCP) è definito nella RFC 793, e su di esso si appoggiano gran parte delle applicazioni internet.
TCP è stato progettato per utilizzare i servizi del protocollo IP, che non offre alcuna garanzia in ordine alla consegna dei pacchetti, al ritardo, alla congestione, e costruire un canale di comunicazione affidabile tra due processi applicativi. Il canale di comunicazione è costituito da un flusso bidirezionale di byte. Inoltre, alcune funzionalità di TCP sono vitali per il buon funzionamento complessivo di una rete IP.

#### Caratteristiche

* Il servizio offerto da TCP è il trasporto di un flusso di byte bidirezionale tra due applicazioni in esecuzione su host differenti. Il flusso viene frazionato in blocchi per la trasmissione dall'applicazione a TCP (che normalmente è implementato nel sistema operativo), per la trasmissione all'interno di segmenti TCP, per la consegna all'applicazione che lo riceve, ma questa divisione in blocchi non è per forza la stessa nei diversi passaggi.
* TCP è un protocollo orientato alla connessione, ovvero prima di poter trasmettere dati deve stabilire la comunicazione, negoziando una connessione tra mittente e destinatario, infine conclude con la chiusura della connessione. Esso quindi ha le funzionalità per creare, mantenere e chiudere una connessione.
* TCP garantisce che i dati trasmessi, se giungono a destinazione, lo facciano in ordine e una volta sola ("at most once"): il protocollo in pratica cerca di simulare per i livelli superiori una connessione fisica diretta di un flusso di byte, attraverso vari meccanismi di acknowledgement e di ritrasmissione su timeout.
* TCP possiede funzionalità di controllo di flusso e di controllo della congestione sulla connessione, attraverso il meccanismo della finestra scorrevole. Questo permette di ottimizzare l'utilizzo della rete anche in caso di congestione, e di condividere equamente la capacità disponibile tra diverse sessioni TCP attive su un collegamento.
* TCP fornisce un servizio di multiplazione delle connessioni su un host, attraverso il meccanismo delle porte.

#### Struttura

Un segmento TCP è così strutturato:
| + | Bit 0–3 | Bit 0–3 | Bit 0–3 | Bit 0–3 | 4–9 | 4–9 | 4–9 | 4–9 | 4–9 | 4–9 | 10–15 | 10–15 | 10–15 | 10–15 | 10–15 | 10–15 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 |
| 0 | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Source Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port |
| 32 | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number | Sequence Number |
| 64 | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number | Acknowledgment Number |
| 96 | Header Length | Header Length | Header Length | Header Length | Reserved | Reserved | Reserved | Reserved | Reserved | Reserved | Flags | Flags | Flags | Flags | Flags | Flags | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window | Advertise Window |
| 128 | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer | Urgent Pointer |
| 160 | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) | Options (optional) |
| 160 o 192+ | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka | Kaka |
* Source port [16 bit] - Identifica il numero di porta sull'host mittente associato alla connessione TCP.
* Destination port [16 bit] - Identifica il numero di porta sull'host destinatario associato alla connessione TCP.
* Sequence number [32 bit] - Numero di sequenza, indica lo scostamento (espresso in byte) dell'inizio del segmento TCP all'interno del flusso completo, a partire dall' Initial Sequence Number (ISN), negoziato all'apertura della connessione.
* Acknowledgment number [32 bit] - Numero di riscontro, ha significato solo se il flag ACK è settato a 1, e conferma la ricezione di una parte del flusso di dati nella direzione opposta, indicando il valore del prossimo Sequence number che l'host mittente del segmento TCP si aspetta di ricevere.
* Header Length [4 bit] - Indica la lunghezza (in word da 32 bit) dell'header del segmento TCP; 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.
* Reserved [6 bit] - Bit non utilizzati e predisposti per sviluppi futuri del protocollo.
* Flags [6 bit] - Bit utilizzati per il controllo del protocollo:
** URG - se settato a 1 indica che nel flusso sono presenti dati urgenti alla posizione (offset) indicata dal campo Urgent pointer;
** ACK - se settato a 1 indica che il campo Acknowledgment number è valido;
** PSH - se settato a 1 indica che i dati in arrivo non devono essere bufferizzati ma passati subito ai livelli superiori dell'applicazione;
** RST - se settato a 1 ripristina la connessione; viene utilizzato in caso di grave errore;
** SYN - se settato a 1 indica che l'host mittente del segmento vuole aprire una connessione TCP con l'host destinatario e specifica nel campo Sequence number il valore dell' Initial Sequence Number (ISN);
** FIN - se settato a 1 indica che l'host mittente del segmento vuole chiudere la connessione TCP aperta con l'host destinatario.
* Advertise Window [16 bit] - Indica la dimensione della finestra di ricezione dell'host mittente, cioè il numero di byte che il mittente è in grado di accettare a partire da quello specificato dall'acknowledgment number.
* Checksum [16 bit] - Campo di controllo utilizzato per la verifica della validità del segmento.
* Urgent pointer [16 bit] - Puntatore a dato urgente, ha significato solo se il flag URG è settato a 1 ed indica lo scostamento in byte a partire dal Sequence number del byte di dati urgenti all'interno del flusso.
* Options - Opzioni (facoltative) per usi del protocollo avanzati.

### UDP

L'User Datagram Protocol (UDP) è definito nella RFC768. A differenza del TCP, non gestisce il riordinamento dei pacchetti né la ritrasmissione di quelli persi. L'UDP ha come caratteristica di essere un protocollo di rete inaffidabile, privo di connessione, ma in compenso molto rapido ed efficiente per le applicazioni "leggere" o time-sensitive. Infatti, è usato spesso per la trasmissione di informazioni audio o video. Dato che le applicazioni in tempo reale spesso richiedono un ritmo minimo di spedizione, non vogliono ritardare eccessivamente la trasmissione dei pacchetti e possono tollerare qualche perdita di dati, il modello di servizio TCP può non essere particolarmente adatto alle esigenze di queste applicazioni. L'UDP fornisce soltanto i servizi basilari del livello di trasporto, ovvero:
* multiplazione delle connessioni, ottenuta attraverso il meccanismo delle porte
* verifica degli errori mediante una checksum, inserita in un campo dell'intestazione del pacchetto.
mentre TCP garantisce anche il trasferimento affidabile dei dati, il controllo di flusso e il controllo della congestione.
UDP è un protocollo stateless ovvero privo di stato: non mantiene lo stato della connessione dunque rispetto a TCP ha informazioni in meno da memorizzare. Un server dedicato ad una particolare applicazione che sceglie UDP come protocollo di trasporto può supportare molti più client attivi.

#### Struttura

Un datagramma UDP è così strutturato:
| + | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | Bit 0-15 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 | 16-31 |
| 0 | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Source Port (optional) | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port | Destination Port |
| 32 | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Length | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) | Checksum (optional) |
| 64+ | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data | Data |
* Source port [16 bit] - Identifica il numero di porta sull'host del mittente del datagramma;
* Destination port [16 bit] - Identifica il numero di porta sull'host del destinatario del datagramma;
* Length [16 bit] - contiene la lunghezza totale del datagramma UDP (header+dati);Indica la lunghezza (in word da 32 bit) dell'header del segmento TCP;
* Checksum [16 bit] - contiene il codice di controllo del datagramma (header+dati). L'algoritmo di calcolo è definito nell'RFC del protocollo;
* Data - contiene i dati del datagramma.

### NetBIOS
## Livello Sessione
### RPC
## Livello Presentazione
## A proposito di Linux

Nello specifico, all'interno di Linux è spesso possibile trovare informazioni legibili su ciò che accade alla rete: più nello specifico esistono strumenti per controllare la rete, generare pacchetti, chiedere informazioni alla rete e agli apparati che la compongono. Sui sistemi operativi Linux è presente un file (/etc/service nei sistemi similari a RedHat) che elenca i protocolli indipendentemente dal livello in cui lavorano con le corrispondenti porte standard.

## Fonti

* Transmission Control Protocol su Wikipedia
* User Datagram Protocol su Wikipedia