TCP-parte1
Transcript
TCP-parte1
TCP (1) Protocollo TCP Gestione connessione AA 2009/2010 agenda ● Parte prima ■ ● Parte seconda ■ ● Protocollo TCP, macchina a stati finiti per gestione connessione Parte terza ■ ● Protocollo UDP politiche di trasmissione e di controllo della congestione Parte quarta ■ versioni del protocollo e implementazioni commerciali AA 2009/2010 2 Livello di trasporto: scopi ● ● ● Fornisce un servizio affidabile ed efficiente da applicazione a applicazione (end-to-end tipicamente da processo a processo) al livello applicazione Usa il network layer Solitamente è di tipo connect ma non necessariamente ■ vedremo UDP ... AA 2009/2010 3 AA 2009/2010 4 TCP ● ● Fornisce un servizio affidabile end-to-end al di sopra della rete IP non affidabile Attività: ■ ■ ■ ■ ■ ■ accettare dati (byte stream) dal livello application; spezzarli in segmenti, il nome usato per i TPDU (dimensione massima 64 Kbyte, tipicamente circa 1500 byte); consegnarli al livello network; ricevere segmenti dal livello network; rimetterli in ordine, eliminando buchi e doppioni; consegnare i dati, in ordine, al livello application. AA 2009/2010 5 TCP ● byte stream orientation ■ ■ ● ● ● no message stream stream non strutturato connessione preventiva con negoziazioni trasferimento bufferizzato connessione full-duplex e point-to-point ■ ■ ■ trasferimento concorrente nei due sensi piggybacking ogni connessione ha esattamente due punti estremi ● ● no multi/broadcast RFC: 793, 1122, 1323, 2018, 2581 AA 2009/2010 6 indirizzamento ● ● I servizi di TCP si ottengono creando connessione di livello transport identificata da una coppia di punti d'accesso detti (TCP) socket. Ogni socket ha un socket number che consiste della coppia: ■ ● ( IP address , Port number ) I port number hanno 16 bit. Quelli minori di 1024 sono i cosidetti well-known port, riservati per i servizi standard. Port number 7 20 21 23 80 AA 2009/2010 Servizio Echo Ftp (control) Ftp (data) Telnet Http 7 connessioni ● TCP è costruito sull’ astrazione di connessione; gli oggetti da identificare sono circuiti virtuali non porte singole ● connessione ■ una coppia di end-point ● ● [ ( IP_host-a , porta-a ) , ( IP_host-b , porta-b ) ] più connessioni possono condividere uno stesso endpoint ■ un server che accetta connessioni da più client ... AA 2009/2010 8 connessioni ● Le connessioni TCP trasportano un flusso di byte, non di messaggi ■ ● ● Ad esempio, se il processo mittente (di livello application) invia 4 blocchi di 512 byte quello destinatario può ricevere: ■ ■ ■ ● i confini fra messaggi non sono né definiti né preservati. 8 "pezzi" da 256 byte; 1 "pezzo" da 2.048 byte; ecc. Ci pensano le entità TCP a: ■ ■ ■ suddividere il flusso del livello application in segmenti a trasmetterli e a ricombinarli in un flusso che viene consegnato al livello application di destinazione. AA 2009/2010 9 TCP ● ● Il ricevente non sa nulla del modo nel quale il mittente spezza lo stream Il mittente normalmente non sa quando i byte che ha dato a TCP verranno inviati ■ ● una flag particolare (PUSH) forza l’invio immediato Un meccanismo simile (URGENT DATA) permette di forzare l’invio immediato e di interrompere il ricevente ■ sta al ricevente trovare nello stream di byte l’eventuale ragione dell’interruzione AA 2009/2010 10 TCP, protocollo ● ● ● Ogni byte del flusso TCP è numerato con un numero d'ordine a 32 bit, usato sia per il controllo di flusso che per la gestione degli ack; un segmento TCP non può superare i 65.535 byte; un segmento TCP è formato da: ■ header, a sua volta costituito da: ● ● ■ ● una parte fissa di 20 byte; una parte opzionale; dati da trasportare; TCP usa un meccanismo di sliding window di tipo go-back-n con timeout. ■ Se questo scade, si ritrasmette il segmento AA 2009/2010 11 realizzazioni Il protocollo lascia alcune scelte sostanzialmente libere, ossia permette diverse realizzazioni tra loro comunque interoperabili. Questo in particolare per quanto concerne – Strategia di trasmissione (immediata o ritardata) – Strategia di inoltro – Strategia di accettazione (Go-Back-N, o Selective repeat) – Strategia di ritrasmissione – Strategia di riscontro (ACK singolo o cumulativo) AA 2009/2010 12 variante TCP di sliding window tre funzioni base: ● ● ● inoltro affidabile dei dati dati consegnati nell’ordine corretto controllo del flusso tra mittente e destinatario inoltre: ● controllo della congestione AA 2009/2010 13 TCP, protocollo ● ● le dimensioni della finestra scorrevole e i valori degli ack sono espressi in numero di byte, non in numero di segmenti Le dimensioni del segmento dipendono dall’MTU del network layer ■ ■ ■ MSS = MTU - Intestazione TCP - Intestazione IP MSS = MTU – 40 (valore tipico) ad esempio per Ethernet: MTU = 1500 ; MSS = 1460 AA 2009/2010 14 Finestre scorrevoli ● ● Il meccanismo di sliding window opera a livello di byte i byte sono numerati in sequenza ■ ■ Il sequence number (32 bit) viene incrementato per ciascun byte inviato a 10 Mbps ci vuole più di un’ora per causare un “wrap-around” ● ● ● una finestra per Mittente e una per Ricevente comunicazione full duplex ■ ● ma a 1 Gbps … ??? 4 finestre in tutto la dimensione delle finestre possono variare nel tempo ■ ogni pacchetto Ack indica: ● ● ■ quanti byte sono stati ricevuti contiene inoltre un valore finestra-suggerita (campo window size) che specifica quanti byte il ricevente è pronto ad accettare si realizza così un flow-control end-to-end AA 2009/2010 15 Politiche di ack ● Il ricevente R manda sempre il riscontro (ack) della più lunga sottosequenza iniziale del flusso ricevuta correttamente ● schema di ack cumulativi ■ R informa sempre su quanto flusso consecutivo ha accumulato AA 2009/2010 16 TCP: scenari Host A X =1 ACK 00 loss Seq=9 2, 8 bytes data lost ACK scenario AA 2009/2010 2, 8 b ytes d ata Seq= 100, 20 by tes d at a 0 10 = K 120 = C K A AC Seq=9 2, 8 bytes data 20 1 = K AC =100 ACK time Host B Seq=9 Seq=100 timeout Seq=92 timeout Seq=9 2, 8 b ytes d ata timeout Host A Host B time premature timeout, cumulative ACKs 17 TCP, header ● ● ● Parte fissa e parte variabile Flag servono a codificare TPDU di controllo AckNumber e WindowSize sono separati: la gestione buffer è separata dalla gestione acknowledge AA 2009/2010 18 TCP header ● ● ● ● Sequence number: numero d’ordine del primo byte contenuto nel campo dati Ack number: il numero d’ordine del prossimo byte aspettato Checksum: simile a quello di IP, ma calcolato su tutto il segmento Header Length: lunghezza dell’intestazione (4 bit), misurata in parole di 32 bit ■ Ma quanto è lungo un pacchetto? AA 2009/2010 19 TCP header, Flags ● URG ■ ● ACK ■ ● dati urgenti da trasmettere senza aspettare che il buffer si riempia RST ■ ● AckNumber valido (ACK=1) PSH ■ ● il campo Urgent Pointer è usato (URG=1) richiesta di Reset della connessione SYN , FIN ■ usati nelle fasi di Setup/Release della connessione AA 2009/2010 20 TCP header, opzioni ● ● Negoziazione del max payload (MSS) ( >= 536) Moltiplicazione delle dimensioni della finestra, definizione di un fattore di scala ■ ■ ad esempio shift di 16 bit su WindowSize a 44 Mbps ci vogliono solo 12 ms per riempire una finestra da 64KB ● ● Uso di selective repeat invece che go back ■ ● con delay di 50ms --> utilizzo del .25% Opzioni SACK (selective acknowledgment) Uso di NAK AA 2009/2010 21 Il problema dei due (tre) eserciti ● ● ● R1+R2 vince contro B R1 perde contro B R2 perde contro B AA 2009/2010 ● ● R può inviare dei messaggeri B può catturarli 22 TCP, connection management ● ● ● ● ● Protocollo a tre passi Due tentativi di connessione iniziati simultaneamente dai due host portano a una sola connessione finale Il sequence number iniziale è preso da un clock con periodo di 4 microsecondi Il tempo di reboot di un host non può essere inferiore al tempo massimo di vita dei pacchetti (120 sec) Le connessioni sono terminate separatamente per ciascuna direzione ■ timer permettono di superare il three-army problem AA 2009/2010 23 Schema setup (1) ACTIVE OPEN: Client invia un segmento con • SYN bit settato • x: Initial Sequence Number (ISN) del Cliente ack (2) PASSIVE OPEN: Server responde con un segmento • SYN , ACK bit settati • y: Initial Sequence Number del Server • x+1 : ACK per ISN del Cliente (3) Client riscontra inviando un segmento con • ACK bit settato • y+1 : ACK per ISN del Server Lo standard sottolinea che nelle fasi (1) e (2) non possono essere inviati dati AA 2009/2010 24 Rilascio di una connessione ● Il rilascio della connessione avviene considerando la connessione full-duplex come una coppia di connessioni simplex indipendenti: ■ quando una delle due parti non ha più nulla da trasmettere, invia un FIN; ■ quando esso viene confermato, la connessione in uscita viene rilasciata; ■ quando anche l'altra parte completa lo stesso procedimento e rilascia la connessione nell'altra direzione, la connessione fullduplex termina. ● Per evitare il problema dei 3 eserciti si usano i timer, impostati al doppio della vita massima di un pacchetto ■ il mittente di FIN, allo scadere del timeout, rilascia la connessione AA 2009/2010 25 Closing a connection Step 1: client sends TCP FIN control segment to server Step 2: server receives FIN, replies with ACK. Closes connection, sends FIN client 1 close ACK ● ■ runs for 2MSL seconds will respond with ACK to received FINs Step 4: server, receives ACK. Connection closed AA 2009/2010 close FIN 3 timed wait Enters “timed wait” F IN 2 Step 3: client receives FIN, replies with ACK ■ server ACK 4 closed 26 Macchina a stati finiti ● Il protocollo di gestione delle connessioni si rappresenta comunemente come una macchina a stati finiti. ● Questa è una rappresentazione molto usata nel campo dei protocolli, perché permette di definire, con una certa facilità e senza ambiguità, protocolli anche molto complessi. AA 2009/2010 27 TCP states 2MSL = due volte il tempo massimo di vita di un segmento (30 – 120 sec) AA 2009/2010 28 stati ● ● ● ● ● LISTEN - represents waiting for a connection request from any remote TCP and port SYN-SENT - represents waiting for a matching connection request after having sent a connection request. SYN-RECEIVED - represents waiting for a confirming connection request acknowledgment after having both received and sent a connection request. ESTABLISHED - represents an open connection, data received can be delivered to the user. The normal state for the data transfer phase of the connection. FIN-WAIT-1 - represents waiting for a connection termination request from the remote TCP, or an acknowledgment of the connection termination request previously sent. AA 2009/2010 29 Stati (2) ● ● ● ● ● ● FIN-WAIT-2 - represents waiting for a connection termination request from the remote TCP. CLOSE-WAIT - represents waiting for a connection termination request from the local user. CLOSING - represents waiting for a connection termination request acknowledgment from the remote TCP. LAST-ACK - represents waiting for an acknowledgment of the connection termination request previously sent to the remote TCP (which includes an acknowledgment of its connection termination request). TIME-WAIT - represents waiting for enough time to pass to be sure the remote TCP received the acknowledgment of its connection termination request. CLOSED - represents no connection state at all. AA 2009/2010 30 il ciclo di vita di una connessione client AA 2009/2010 server 31 TCP automa: opening a connection AA 2009/2010 32 Chiusura connessione ● ● ● Il processo applicativo su entrambi i lati della connessione può decidere, in modo indipendente, di chiudere la connessione. Se solo un lato chiude la connessione, allora vuol dire che non ha più dati da inviare ma è ancora disponibile a riceverli. Questo complica il diagramma, si deve tenere in conto la possibilità che le due parti invochino l’operazione di close allo stesso tempo, come anche la possibilità che prima una parte invochi la chiusura e poi, in un momento successivo, l’altra parte invochi la chiusura. AA 2009/2010 33 TCP automa: closing a connection active close AA 2009/2010 34 Sequenze di azioni tre combinazioni di transizioni che portano una connessione dallo stato established allo stato closed: 1) il lato client chiude per primo: fin_wait_1-->fin_ wait_2-->time_wait-->closed 2) il lato server chiude per primo e il client evolve: close_wait-->last_ack-->closed 3) entrambi i lati chiudono allo stesso tempo e il client evolve: fin_wait_1-->closing-->time_wait-->closed c’è una quarta (rara) sequenza di transizioni che portano a closed: fin_wait_1 --> time_wait --> closed AA 2009/2010 35 Time Wait ● una connessione che si trova nello stato time wait non può spostarsi nello stato closed fino a quando non ha aspettato due volte la massima quantità di tempo di vita di un datagramma IP (ovvero, 120 secondi) ■ ■ ● mentre la parte locale della connessione ha inviato un segmento con il flag ACK impostato ad 1 in risposta al segmento dell’altro lato con il flag FIN impostato ad 1, non sa se questo segmento è stato consegnato con successo l’altro lato potrebbe ritrasmettere un altro segmento con il flag FIN impostato ad 1 e questo secondo segmento potrebbe essere ritardato nella rete. Se la connessione potesse spostarsi direttamente nello stato closed, allora un’altra coppia di processi applicativi potrebbe aprire la stessa connessione (ovvero, usare la stessa coppia di porte) ed il segmento con il flag FIN impostato ad 1 che era in ritardo darebbe immediatamente inizio alla terminazione della seconda incarnazione della connessione AA 2009/2010 36 lsof: processi attivi su num-di-porta LiSt Open Files (LSOF) is an utility that allows you to view current network connections and the files associated with them. Provides verbose output and is useful in tracking down all sorts of information. For example, it allows you to see what program is operating on an open port, which daemons have established connections, and what ports are open on your server. very useful for working out which processes "own" network connections that netstat or tcpdump have identified. Esempi: lsof -i tcp:10203 (tcp connections on port 10203) lsof –i :587 (connections listening or established on port 587) lsof –i :smtp (connections associated with the well-known service SMTP) lsof –i @lab.remote.net (connections coming from or going to the host lab.r em ot e.net ) AA 2009/2010 37 import SocketServer class EchoRequestHandler(SocketServer.BaseRequestHandler ): def setup(self): print self.client_address, 'connected!' self.request.send('hi ' + str(self.client_address) + '\n') def handle(self): data = 'dummy' while data: data = self.request.recv(1024) self.request.send(data) if data.strip() == 'bye': return def finish(self): print self.client_address, 'disconnected!' self.request.send('bye ' + str(self.client_address) + '\n') #server host is a tuple ('host', port) server = SocketServer.ThreadingTCPServer(('', 50008), EchoRequestHandler) 38 AA 2009/2010 AA 2009/2010 server.serve_forever()