Programmazione su Reti Il livello trasporto di TCP/IP: TCP Giuseppe Persiano Dipartimento di Informatica ed Applicazioni Università degli Studi di Salerno http://www.dia.unisa.it/~giuper Fig. 18.3 18.5 18.10 19.3 19.4 19.6 19.8 (fino a nagle)
TCP: Transmission Control Protocol Orientato allo stream: non avendo una dimensione di segmento fissa, trasmette alla destinazione la sequenza identica (stream) di byte che il mittente ha fornito a TCP nella macchina di provenienza. Stream non strutturato: In TCP non è necessario nessun tipo di formattazione specifica della stream, quindi è demandata agli applicativi la corretta estrazione dei dati dai segmenti ricevuti. Simile ad un file del sistema Unix Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
TCP: Caratteristiche Connessione di circuito virtuale: La connessione è vista dagli applicativi come un circuito fisico dedicato, quindi TCP è capace di fornire servizi del tipo Connection Oriented mentre il protocollo IP su cui appoggia, è in grado di fornire servizi Connection Less. Connessione Full Duplex: TCP consente il trasferimento simultaneo in entrambe le direzioni per ogni connessione. Questo permette la trasmissione parallela di segmenti di dati in un senso e di segmenti di acknowledgement nell'altro. TCP richiede più banda e più CPU di UDP Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Bufferizzazione TCP suddivide lo stream in segmenti indipendenti dal programma applicativo che li ha generati. Dispone di un buffer dove immagazzinare la sequenza di byte. Al verificarsi di certe condizioni alcuni dei dati sono trasmessi attraverso la rete. La bufferizzazione consente una riduzione del traffico sulla rete "ottimizzando" in qualche modo il numero di segmenti da trasmettere. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Header TCP 4 10 16 19 24 32 Source Port Destination Port 4 10 16 19 24 32 Source Port Destination Port Sequence Number Acknowledgement Number TCP header length U R G A C K E O M R S T S Y N F I N Reserved Window Checksum Urgent Pointer Options Padding Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Header di TCP Flag: Per identificare il tipo di informazione contenuta nel segmento vengono impiegati i 6 bit di codice: URG (11): Il campo puntatore urgente è valido ACK (12): Il campo riscontro è valido PSH (13): Questo segmento richiede una “spinta” RST (14): Effettua il reset della connessione SYN (15): Sincronizza i numeri di sequenza FIN (16): Il trasmettitore ha raggiunto la fine della sua stream di byte Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Campi dell’header TCP HLEN: Porta (provenienza/destinazione): Contiene un numero intero che indica la lunghezza dell'intestazione TCP del datagramma. Questa informazione è necessaria perché il campo opzioni è di lunghezza variabile. Porta (provenienza/destinazione): Contengono i numeri di porta di protocollo TCP che identificano gli applicativi alle estremità della connessione. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Campi dell’header TCP Numero sequenziale: Numero di riscontro: questo campo identifica, nello stream di byte del trasmettitore, la posizione dei dati nel segmento. Questo valore è riferito alla stream che fluisce nella medesima direzione del segmento, mentre il Numero di Riscontro si riferisce alla stream che fluisce nella direzione opposta. Numero di riscontro: Contiene il numero sequenziale del byte successivo a quello correttamente ricevuto dalla destinazione. Tale campo è valido solo nei segmenti di riscontro, o nei segmenti utilizzanti la tecnica trasmissiva Piggy-backing, e fa riferimento allo stream di dati che fluisce nella direzione opposta a tale segmento. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Campi dell’header di TCP Nel datagramma di riscontro la destinazione comunica quale byte dello stream si aspetta di ricevere successivamente: I riscontri specificano sempre il numero sequenziale del primo byte non ancora ricevuto. Esempio: in uno stream di 1000 byte segmentato in blocchi di 100 byte, il primo riscontro conterrà il numero sequenziale 101. Questo metodo di riscontro cumulativo si ha il vantaggio che la perdita di un riscontro non blocca la trasmissione se confermato dal riscontro successivo. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Campi dell’header di TCP Nel datagramma di riscontro la destinazione comunica quale byte dello stream si aspetta di ricevere successivamente: I riscontri specificano sempre il numero sequenziale del primo byte non ancora ricevuto. Esempio: in uno stream di 1000 byte segmentato in blocchi di 100 byte, il primo riscontro conterrà il numero sequenziale 101. Questo metodo di riscontro cumulativo si ha il vantaggio che la perdita di un riscontro non blocca la trasmissione se confermato dal riscontro successivo. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Campi dell’header TCP Finestra: Puntatore urgente: Numero intero senza segno di 16 bit che specifica la dimensione del buffer che il TCP ha a disposizione per immagazzinare dati in arrivo. È utilizzato per la gestione dinamica della dimensione della finestra scorrevole. Puntatore urgente: Il TCP permette la trasmissione fuori banda di dati informativi ad alta priorità. Questi devono essere trasmessi il prima possibile, indipendentemente dalla loro posizione nella stream. Questo campo, se valido, conterrà un puntatore alla posizione nella stream, dei dati urgenti. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Campi dell’header TCP Checksum: Campo di 16 bit contenente un valore intero utilizzato dal TCP della macchina host di destinazione, per verificare l'integrità dei dati e la correttezza dell'intestazione. Questa informazione è di essenziale importanza perché il protocollo IP non prevede nessun controllo di errore sulla parte dati del frame. Per il calcolo del valore checksum il TCP ha bisogno di aggiungere una pseudointestazione al datagramma, per effettuare così un controllo anche sugli indirizzi IP di destinazione e provenienza. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
TCP: Protocollo di Connessione La parte richiedente (client) invia un segmento SYN e specifica la porta del server e il proprio initial sequence number (ISN). RFC793 specifica che ISN viene incrementato ogni 4 ms Il server risponde con un segmento contenente il proprio SYN e dà l’ack (riscontro) del SYN del client ponendo l’ack al valore dell’ ISN del client + 1 Il cliente dà riscontro al SYN del server spedendo un ACK per l’ISN del server + 1. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
TCP: Opzione MSS Il segmento di SYN contiene l’opzione Maximum Segment Size ogni parte annuncia la taglia del più grande segmento che si aspetta di ricevere una grossa MSS aumenta il throughput ma corre il rischio di frammentazione a livello IP. per connessioni locali MSS è sempre minore della MTU dell’interfaccia di uscita meno la lunghezza dell’header di TCP (1460 per Ethernet) per connessioni non locali MSS normalmente è posto uguale a 536 Figura 18.3, 18.5 Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Opzione Reset Segmento con bit Reset posto 1 è inviato in situazioni di errore richiesta di connessione a porta con nessuna applicazione legata (bind con i socket di Berkeley) il segmento di reset porta l’ack del ISN UDP usa ICMP port unreachable abortive release dati in buffer sono scartati La controparte riceve il segmento di reset e non deve farne l’ack Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Esempio di half-close E’ possibile per una delle due parti di una connessione TCP chiudere il proprio canale di output e ricevere dati sull’altro canale. La API dei socket di Berkeley prevede la system call shutdown Esempio: rsh remote_host sort < datafile Fig. 18.10 Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Esempio di half-close rsh bsdi sort < datafile rsh apre una connessione con il processo che esegue il sort sull’host bsdi. datafile è copiato sulla connesione. l’output della connessione è dato in output. sort non può iniziare fino a quando non sono arrivati tutti i dati. rsh effettua una half-close per segnalare la fine dei dati. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
TCP: Calcolo del checksum di TCP Lo pseudoheader viene creato e posto in testa al segmento TCP e sono aggiunti byte necessari per raggiungere un multiplo di 16 bit. Successivamente viene calcolata un checksum su tutto il messaggio così formato. Lo pseudoheader viene eliminato prima del passaggio a TCP. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Diagramma di transizione degli stati di TCP Figura tratta da: TCP/IP illustrated vol. 1 di Richard W. Stevens Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Stato TIME_WAIT MSL (maximum segment life) è la durata massima della vita di un segmento RFC793 raccomanda MSL = 2 minuti Quando TCP effettua una chiusura attiva, la connessione resta nello stato TIME_WAUT per una durata doppia all’MSL. Ciò per permettere di rispedire l’ack finale da inviare all’altra parte. Se ciò accade l’altra parte va in timeout e re-invia il FIN. Nell’API Berkeley Socket, una porta locale non può essere usata se la connessione è in TIME_WAIT opzione SO_REUSEADDR Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Opzioni TCP Campo opzioni in header TCP Opzione MSS 1 byte kind (MSS ha kind=2) 1 byte len 4 2 byte MSS Opzione End 1 byte kind=0 Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
TCP: Protocollo di terminazione Ogni connessione TCP è full-duplex i dati viaggiano nelle due direzioni indipendentemente e ciascuna deve essere chiusa indipendentemente Per chiudere una direzione di flusso viene spedito un segmento con bit di FIN ciò indica solo che non arriveranno più dati lungo questa direzione Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Riscontro e ritrasmissione Consiste nella ritrasmissione di un segmento se non è giunta conferma entro un tempo massimo (time-out). Time-Out: Al momento della trasmissione di ogni segmento, il TCP attiva una timer. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Time Out Time-Out: tempo massimo entro cui un segmento trasmesso deve avere riscontro. Se questo non avviene, si procede alla ritrasmissione. TCP, per stimare efficientemente il TIME-OUT di ogni connessione, utilizza l'algoritmo di Karn. È un algoritmo adattivo, ovvero al variare delle prestazioni della connessione corregge opportunamente il valore stimato in precedenza. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Retransmission TimeOut value TCP misura il tempo di andata e ritorno M per ogni pacchetto Calcola stima di andata e ritorno (Round Trip Time) R=a R + (1-a)M valore di a raccomandato .9 Il valore di timeout è posto RTO=bR valore di b raccomandato 2 Non riesce a gestire le fluttuazioni di velocità della connessione Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Algoritmo di Jacobson Per ogni segmento calcoliamo una stima del RTT otteniamo una misurazione del RTT RTO tiene conto di media e varianza Err = M - A (A stima del RTT -- M valore misurato) A = A + g Err (g=.125) D = D + h(|Err| - D) (h=.25) RTO = A + 4D Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Algoritmo di Karn Problema dell’ambiguità di ritrasmissione Le stime di RTT non sono aggiornate quando arriva l’ACK di dati ritrasmessi. Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Flusso di dati interattivi in TCP Esempi tipici di applicazioni interattive: RLOGIN, TELNET Ogni carattere viene inviato dal client al server un byte per volta. Inoltre ogni carattere viene normalmente re-inviato dal server al client per la visualizzazione. Quindi un byte genera 4 segmenti: byte di dati ack del byte echo del byte per visulalizzazione ack dell’echo Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Riscontro ritardato (delayed ack) Normalmente TCP non invia ACK subito dopo aver ricevuto un segmento. L’ack viene ritardato nella speranza che vi siano dei dati che viaggiano nella stessa direzione. La maggioranza delle implementazioni utilizza un ritardo di 200 ms. Fig. 19.3 200ms relativamente al kernel solo da un lato svr4 ha sempre dati pronti da inviare Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Algoritmo di Nagle In connessione interattive possiamo avere dei segmenti che contengono un solo byte di dati. L’overhead che paghiamo è di 40 byte (20 per IP + 20 per TCP) Algoritmo di Nagle una connessione TCP non può avere più di un segmento piccolo di cui non si è ricevuto l’ACK. Segmento piccolo di taglia minore di MSS Fig. 19.4 segmento 12 è un delayed ack non porta dati (il server di rlogin era busy) segmento 14-15 sembrano in contraddizione con nagle ma sono in risposta ad ack differenti: 14 in risposta a 12 e 15 in risposta a 13 ultimi due segmenti 17 e 18: 3 byte da c->s 1 byte da s->c ma ack di 3 Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.
Algoritmo di Nagle: Pro e Contro Self-clocking su una connessione veloce vengono inviati molti tinygram una connessione lenta invia pochi segmenti ciascuno con più byte di dati. Problemi con applicazioni molto interattive Esempio: function keys Disabilitato con opzione TCP_NODELAY Fig. 19.6 escape è echoed come due byte Fig. 19.8 un segmento si è perso spiegare come ce ne accorgiamo Programmazione su Reti -- G. Persiano -- Dipartimento di Informatica ed Appl.