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), deciso all’apertura della connessione.
Acknowledgment number [32 bit] - Numero di riscontro, ha significato solo se il flag ACK è impostato 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.
Data offset [4 bit] - Indica la lunghezza (in dword da 32 bit) dell’header del segmento TCP; tale lunghezza può variare da 5 dword (20 byte) a 15 dword (60 byte) a seconda della presenza e della lunghezza del campo facoltativo Options.
Reserved [4 bit] - Bit non utilizzati e predisposti per sviluppi futuri del protocollo; dovrebbero essere impostati a zero.
Flags [8 bit] - Bit utilizzati per il controllo del protocollo:
CWR (Congestion Window Reduced) - se impostato a 1 indica che l’host sorgente ha ricevuto un segmento TCP con il flag ECE impostato a 1 (aggiunto all’header in RFC 3168).
ECE [ECN (Explicit Congestion Notification) -Echo] - se impostato a 1 indica che l’host supporta ECN durante il 3-way handshake (aggiunto all’header in RFC 3168).
URG - se impostato a 1 indica che nel flusso sono presenti dati urgenti alla posizione (offset) indicata dal campo Urgent pointer. Urgent Pointer punta alla fine dei dati urgenti;
ACK - se impostato a 1 indica che il campo Acknowledgment number è valido;
PSH - se impostato a 1 indica che i dati in arrivo non devono essere bufferizzati ma passati subito ai livelli superiori dell’applicazione;
RST - se impostato a 1 indica che la connessione non è valida; viene utilizzato in caso di grave errore; a volte utilizzato insieme al flag ACK per la chiusura di una connessione.
SYN - se impostato 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); ha lo scopo di sincronizzare i numeri di sequenza dei due host. L’host che ha inviato il SYN deve attendere dall’host remoto un pacchetto SYN/ACK.
FIN - se impostato a 1 indica che l’host mittente del segmento vuole chiudere la connessione TCP aperta con l’host destinatario. Il mittente attende la conferma dal ricevente (con un FIN-ACK). A questo punto la connessione è ritenuta chiusa per metà: l’host che ha inviato FIN non potrà più inviare dati, mentre l’altro host ha il canale di comunicazione ancora disponibile. Quando anche l’altro host invierà il pacchetto con FIN impostato, la connessione, dopo il relativo FIN-ACK, sarà considerata completamente chiusa.
Window size [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. È ottenuto facendo il complemento a 1 della somma complemento a uno a 16 bit dell’intero header TCP (con il campo checksum messo a zero), dell’intero payload, con l’aggiunta di uno pseudo header composto da: indirizzo IP sorgente(32bit),indirizzo IP destinazione(32bit), un byte di zeri, un byte che indica il protocollo e due byte che indicano la lunghezza del pacchetto TCP (header + dati).
Urgent pointer [16 bit] - Puntatore a dato urgente, ha significato solo se il flag URG è impostato 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.
Data - rappresenta il carico utile o payload da trasmettere cioè la PDU proveniente dal livello superiore.
Funzionamento
Prima ancora del trasferimento dei dati su canale di comunicazione e delle operazioni di controllo di trasmissione sul flusso dei dati in ricezione, in trasmissione TCP si occupa di instaurare la connessione agli estremi tra i processi applicativi dei terminali in comunicazione attraverso la definizione del socket ovvero coppia indirizzo IP, porta sia del mittente che del destinatario. Si ricorda invece che la commutazione interna nei nodi della rete di trasporto dati segue invece tipicamente la commutazione di pacchetto ovvero senza circuito o connessione fissa dedicata tipica invece della commutazione di circuito. Il fine della connessione TCP è in ogni caso il riservamento di risorse tra processi applicativi che si scambiano informazioni o servizi tra loro (es. server e client). Al termine della connessione, TCP attua la fase dell’abbattimento della connessione. Le due procedure sono distinte.
Le procedure di creazione e abbattimento della connessione e le tecniche di gestione del traffico dati sono lunghe e complesse e non saranno trattate. Se vuoi approfondire l’argomento puoi farlo qui
UDP - User Datagram Protocol
UDP, come TCP è un protocollo di livello 4 solitamente utilizzato insieme al protocollo IP ma, a differenza del TCP, l’UDP è un protocollo di tipo connectionless, inoltre non gestisce il riordinamento dei pacchetti né la ritrasmissione di quelli persi, ed è perciò generalmente considerato di minore affidabilità. In compenso è molto rapido (non c’è latenza per riordino e ritrasmissione) ed efficiente per le applicazioni “leggere” o time-sensitive. In genere è utilizzato per le applicazioni per le quali un pacchetto in ritardo ha validità nulla, per esempio la trasmissione audio-video in tempo reale (streaming o VoIP sono gli usi più comuni), oppure la trasmissione di altre informazioni sullo stato di un sistema, per esempio i giochi multiplayer online.
Infatti, visto che le applicazioni in tempo reale richiedono spesso un bit-rate minimo di trasmissione, 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 loro caratteristiche. Nel caso della telefonia via Internet (VoIP), un pacchetto riordinato è inutile perché risale a un tempo passato, mentre un pacchetto non ricevuto causa lo stallo del sistema fino al suo arrivo, per cui si sentirebbe un lungo silenzio seguito da tutti i pacchetti non arrivati in tempo.
L’UDP fornisce soltanto i servizi basilari del livello di trasporto, ovvero:
multiplazione delle connessioni, ottenuta attraverso il meccanismo di assegnazione delle porte;
verifica degli errori (integrità dei dati) mediante una checksum, inserita in un campo dell’intestazione (header) del pacchetto, mentre TCP garantisce anche il trasferimento affidabile dei dati, il controllo di flusso e il controllo della congestione.
L’UDP è un protocollo stateless, ovvero non tiene nota dello stato della connessione dunque ha, rispetto al TCP, meno informazioni da memorizzare: un server dedicato ad una particolare applicazione che scelga UDP come protocollo di trasporto può supportare quindi molti più client attivi.
Struttura di un datagramma UDP
Un datagramma (o pacchetto) UDP è così strutturato:
+
Bit 0-15
16-31
0
Source Port (optional)
Destination Port
32
Length
Checksum (optional)
64+
Data
Header:
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 in bytes del datagramma UDP (header+dati);
Checksum [16 bit] - contiene il codice di controllo del datagramma (header + dati + pseudo-header, quest’ultimo comprendente gli indirizzi IP di sorgente e destinazione). L’algoritmo di calcolo è definito nell’RFC del protocollo;
Payload:
Data - contiene i dati del messaggio
Modelli di condivisione delle risorse
I modelli client server e peer to peer sono modelli di condivisione delle risorse. Sebbene esistano tra i due modelli alcune differenze anche sull’aspetto della comunicazione il punto centrale è la localizzazione delle risorse e il modo in cui vengono condivise.
Modello Client-Server
Nel modello client server le risorse da condividere risiedono tutte su un host definito server (in inglese servitore) che le mette a disposizione di tutti gli altri che quindi vengono definiti client (clienti). Essere client o server quindi non è una caratteristica intrinseca di un determinato host, ma solo il suo ruolo in una relazione di condivisione di risorse. Un computer può essere client per quanto riguarda un servizio e server per un altro. Esistono però alcuni computer che vengono tenuti in esecuzione con l’unico scopo di offrire un servizio e per questo vengono chiamati server dedicati.
Il modello client server è un modello di gestione delle risorse centralizzato poichè appunto accentra le risorse in un unico punto. Questa caratteristica ha il vantaggio di rendere la ricerca delle risorse molto semplice e abbastanza efficiente, ma ha anche lo svantaggio che se il server smette di condividere la risorsa per un qualsiasi motivo, la risorsa diventa totalmente irreperibile.
Modello Peer to Peer
Nel modello peer to peer, spesso abbreviato in P2P, le risorse non risiedono tutte su un unico server ma sono distribuite su host differenti. In questo modello quindi non esiste un solo computer che funge da server ma tanti host che condividono tra loro le loro risorse in una relazione tra pari (peer).
Nel modello client server la chiusura del server eliminava completamente la possibilità di reperire le risorse, in un modello distribuito invece la chiusura di un nodo della rete non influisce sul funzionamento di tutto il resto della rete, vengono perse solo le risorse presenti esclusivamente su quel nodo, eventualità comunque molto rara in una rete P2P.
Nel modello client server le cose sono molto semplici, ai client basta conoscere l’indirizzo IP del server per reperire tutte le risorse disponibili. Nelle reti peer to peer invece le cose sono molto più complicate infatti:
quando un peer vuole connettersi ad una rete P2P non conosce gli indirizzi dei peer che in quel momento sono collegati alla rete;
non si sa in un determinato momento quali risorse siano condivise nella rete nè quali siano i peer che le stanno condividendo.
Per risolvere questi problemi sono state sviluppate tre architetture differenti:
Il P2P Puro non ha server centrale e tutti i Peer hanno lo stesso ruolo. Ogni nodo si occupa di individuare i Peer, le risorse e la condivisione di queste.
Il P2P con Discovery Server possiede un server centrale chiamato, appunto, Discovery, al quale l’utente (ovvero il Peer che in questo caso funge da client) comunica la propria esistenza al momento dell’avvio e riceve in risposta una lista con gli altri nomi della rete. Con essa l’utente può interrogare qualunque partecipante per conoscerne i contenuti. Quindi, quando l’utente necessita di un contenuto, prima contatta il server individualmente, poi inoltra la richiesta.
Il P2P con Discovery e Lookup Server: in questa architettura l’utente non solo si registra presso il Discovery Server, ma spedisce anche una lista dei propri contenuti ad intervalli regolari. Così, quando la richiesta successiva viene mandata, il server fornisce una lista dei partecipanti alla rete insieme ai relativi contenuti, tagliando richieste infruttuose e ottimizzando i tempi.
La presenza di server semplifica enormemente il coordinamento tra i peer, ma è anche un punto debole della rete poichè lo spegnimento del server compromette il funzionamento della rete. Esistono però delle reti P2P ibride in cui un certo numero di peer, detti super-nodi o super-peer che hanno anche funzione di indicizzazione.
Il funzionamento delle reti P2P ibride e soprattutto quello delle reti P2P pure è molto complesso e non è trattato in questa sede. Se desideri approfondire l’argomento puoi farlo qui.
è comunque importate fare un’osservazione cioè che nelle reti peer to peer, soprattutto in quelle pure, viene generata una grande quantità di traffico che serve esclusivamente a coordinare la rete e reperire le risorse. Tutto questo traffico, che potremmo far rientrare nella definizione di overhead, non è affatto trascurabile rispetto al traffico generato dal trasferimento di dati vero e proprio e può generare quello che viene definito flooding (allagamento in italiano) della rete. Per questo motivo il protocollo di livello 4 utilizzato nelle reti P2P per il coordinamento dei peer è il protocollo UDP che consente di minimizzare l’overhead. Per il trasferimento delle risorse che deve essere affidabile invece si utilizza TCP.
Spesso viene associato al termine peer to peer il termine pirateria. É vero che in molti casi le reti P2P vengono usate per la condivisione di file protetti da diritto d’autore ma di per sé il peer to peer è una pratica assolutamente legittima. Il motivo per cui questo modello è quello preferito per la condivisione illegale di file è che la natura distribuita della rete ne impedisce il controllo o la censura. Mentre è molto semplice controllare ed eventualmetne spegnere un server causando la totale interruzione del servizio offerto, è praticamente impossibile chiudere una rete P2P soprattuto una pura o ibrida.