Il TCP: un protocollo del livello di trasporto. Appunti di Sistemi per la classe V sez. H A cura del prof. ing. Mario Catalano Sul TCP Il protocollo TCP (Trasmission Control Protocol) fu progettato per fornire un flusso affidabile ( end-to-end) a partire da un un’internet non affidabile.E' quindi un protocollo "orientato alla connessione“. Esso fu progettato per adattarsi dinamicamente alle proprietà di Internet (diverse topologie, ritardi, capacità...) e per essere robusto nei confronti di molte tipologie di guasto. Come funziona il TCP Ogni macchina che supporta TCP possiede un’entità di trasporto TCP, che gestisce i flussi di dati TCP e si interfaccia con il livello IP; può essere un processo utente, oppure far parte del nucleo. Un’entità TCP riceve flussi di dati dai processi locali, li spezza in unità lunghe al più 64KB (tipicamente 1500, 3000byte) e spedisce queste unità come datagram IP separati. IP e TCP Siccome il livello IP non fornisce alcuna garanzia sulla consegna dei datagram, toccherà al TCP ritrasmetterli quando necessario, ed è proprio per questo che TCP è un protocollo affidabile mentre IP no. (IP non sa cosa sia una CONNESSIONE: i pacchetti vengono inviati uno alla volta). In altre parole TCP deve fornire l' AFFIDABILITA' CHE IP NON POSSIEDE!!! Il modello di servizio del TCP Il protocollo TCP si ottiene mediante la creazione di punti di accesso chiamati socket, ognuno dei quali è caratterizzato da un indirizzo IP dell’host e di un numero a 16bit rappresentante l’indirizzo locale dell’host detto port. Per indicare uno dei processi in esecuzione su un dato calcolatore si usa il port number. Un port corrisponde al terminale di un canale di comunicazione virtuale che TCP/IP mette a disposizione del processo. Per ottenere un servizio TCP si deve creare una connessione fra socket della macchina mittente e socket della macchina ricevente. È importante dire che un socket può essere utilizzato da più connessioni contemporaneamente. Le porte inferiori a 256 sono dette porte ben note e sono dedicate a servizi standard. Tutte le connessioni TCP sono full-duplex e punto-a-punto. Il TCP non supporta il multicasting e il broadcasting. Una connessione TCP consiste in un flusso di dati e non di messaggi. Esempi di well-known port Echo – port n.7 FTP (controllo) – port n. 20 FTP (dati) – port n. 21 Telnet – port n. 23 SMTP – port n. 25 HTTP – port n. 80 POP3 – port n. 110 NNTP – port n. 119 DNS – port n. 53 Un esempio… Quando un’applicazione passa i dati a TCP questo può spedirli immediatamente oppure salvarli in un buffer: per forzare l’output dei dati si può utilizzare il flag PUSH per indicare a TCP di non ritardare la comunicazione. Un’ultima caratteristica saliente riguarda i dati urgenti: l’applicazione mittente può utilizzare il flag URGENT per forzare TCP a smettere di accumulare dati e trasmettere subito tutto. I pacchetti del TCP 1. Ogni byte di una connessione TCP possiede il proprio numero di sequenza a 32 bit. I numeri di sequenza vengono utilizzati sia per il meccanismo degli ack, sia per quello delle finestre, inseriti in campi separati dal preambolo da 32 bit. 2. Mittente e ricevente si scambiano i dati sotto forma di segmenti. Un segmento consiste in un preambolo fisso a 20 byte seguito da zero o più byte di dati, la dimensione dei segmenti viene decisa da TCP. 3. Sliding Window con ACK di risposta e timer per la ritrasmissione: la conferma si ha quando si riceve una sequenza corretta. Il compito di risolvere eventuali problemi dovuti a errori, duplicazioni o perdite sta a TCP. Ci sono però due limiti sulla dimensione dei segmenti ovvero ogni segmento incluso il preambolo TCP deve entrare in un pacchetto IP di 65.536 byte e ogni rete possiede un MTU(unità massima di trasferimento) e ogni segmento deve entrare in un MTU, l’MTU è lungo generalmente poche migliaia di byte e quindi definisce il limite superiore della dimensione del segmento; nel caso in cui un pacchetto attraversa una serie di reti senza essere frammentato e quindi arriva a una in cui MTU è inferiore alla dimensione del segmento, il router al confine frammenta il segmento in due o più segmenti più piccoli. Il preambolo 32 bit Source port Ogni segmento inizia con un preambolo fisso di 20byte, esso può essere seguito da opzioni di preambolo, dopo le opzioni possono seguire fino a 65535 -20 -20 = 65495 byte di dati dove i primi 20 si riferiscono al preambolo IP e i secondi al preambolo TCP. Destination port Sequence number Ack. number UA P R S F R CS SY I GK HT N N TCP header len. Checksum Window size Urgent pointer Options (zero o più parole di 32 bit) Dati (opzionali) I campi del preambolo Source port e Destination port = estremi locali della connessione; Sequence number = numero di sequenza; Acknowledgement number = numero di ack specifica il prossimo byte atteso; TCP header lenght = lunghezza del preambolo; Campi NON usati URG = flag urgente: il mittente manda al destinatario un messaggio urgente. Alcuni dati vengono inseriti nel pacchetto TCP e il flag URG=1. Il ricevitore interrompe quello che sta facendo e legge i dati inviati. I campi del preambolo (2) ACK serve per ignorare o meno l’ACK number (ACK=1 campo valido riscontrato) PSH indica dati di tipo PUSH, cioè all'applicazione remota si richiede di consegnare i dati in arrivo il piu' presto possibile evitando che siano salvati in code di attesa. Ha il significato di spinta alla consegna. RST per reinizializzare la connessione; può essere usato come REJ di un segmento non valido o per rifiutare la connessione. I campi del preambolo (3) SYN = per creare le connessioni, la richiesta di connessione viene caratterizzata da SYN=1 e ACK=0; (risposte SYN=1, ACK=1) FIN = per chiudere una connessione; Window = finestra, indica quanti byte possono essere spediti, si può utilizzare questo campo per fare il controllo di flusso ponendolo uguale a 0; I campi del preambolo (4) Checksum = verifica del preambolo e dati. Options = eventuali opzioni (ad es. negoziazione del max. segmento TCP dell'host, negoziazione della massima finestra, ripetizione selettiva di uno o più segmenti.) Data = dati veri e propri. Gestione delle connessioni in TCP In TCP le connessioni vengono create utilizzando il protocollo Three-Way handshake. Per stabilire una connessione il server aspetta passivamente una connessione utilizzando le primitive LISTEN e ACCEPT, specificando una sorgente specifica oppure nessuna in particolare. Il client esegue una primitiva di CONNECT specificando l’IP e la porta a cui si vuole connettere, la dimensione accettabile massima dei segmenti TCP e opzionalmente i dati utente. Gestione delle connessioni in TCP (2) La CONNECT invia un segmento TCP con ACK spento e SYN acceso e attende una risposta. Appena questo arriva a destinazione l’entità TCP verifica l’esistenza di un processo che ha eseguito una LISTEN sulla porta identificata da Destination Port. A questo punto può accettare o rifiutare la connessione: se accetta invia un segmento ACK. Per terminare una connessione entrambe le parti possono inviare un segmento TCP con FIN acceso indicando che non si hanno più dati da trasmettere. Gestione del trasporto Il Server aspetta passivamente una connessione in arrivo eseguendo una ListenAccept specificando o meno una particolare sorgente. Client esegue una primitiva CONNECT con IP le porte di collegamento, la dim. max del segmento TCP . Sono trasmessi il num. di sequenza (num. di byte trsmessi) e la grandezza della finestra che determina quanti byte possono ancora essere trasmessi (anche se riceve win=0, il mittente può comunque inviare: dati urgenti, richieste di reinvio dell'ultimo ack spedito). Gestione del trasporto L’idea di fondo è che la destinazione informa il mittente di volta in volta, con la conferma dell’arrivo dei segmenti, quanti altri byte possono essere spediti la prossima volta. Si imposta un valore di default, ad esempio 4k: se c’è una coda, la destinazione riduce a 2k il prossimo segmento (altrimenti resta a 4k), se la coda peggiora, si riduce a 1k (altrimenti si resta a 2k, oppure, se migliora, si passa a 4k). Se invece si sta congestionando, si passa a 0. Il protocollo UDP Il livello transport fornisce anche un protocollo non connesso e non affidabile, utile per inviare dati senza stabilire connessioni (ad esempio per applicazioni client-server). Lo header di un segmento UDP è molto semplice. La funzione di calcolo del checksum può essere disattivata, tipicamente nel caso di traffico in tempo reale (come voce e video) per il quale è in genere più importante mantenere un'elevato tasso di arrivo dei segmenti piuttosto che evitare i rari errori che possono accadere. 32 bit Source port Destination port UDP length UDP checksum Fine