TCP: apertura della connessione Prima dello scambio dati, sender e receiver si "stringono la mano": Concordano sull aprire la connessione Concordano su alcuni parametri A livello trasporto, la richiesta del client genera un segmento TCP di richiesta connessione La sottorete di comunicazione può perdere o duplicare i pacchetti Sono necessari protocolli sofisticati per attivare la connessione Apertura connessione (handshake) La richiesta del client è un segmento SYN (SYN bit posto a 1) che indica il numero di sequenza iniziale Se sul server un processo è in attesa di richieste sulla porta destinazione specificata nel segmento il server alloca buffer e variabili per la connessione invia un segmento di controllo SYNACK che contiene SYN bit posto a 1, riscontro per SYN ricevuto, e numero di sequenza iniziale per il server Se non esiste processo in attesa il server invia segmento con RST=1 Il client riceve SYNACK e alloca buffer e variabili per la connessione. Invia ACK con SYN bit posto a 0 (può contenere dati) Ogni segmento con SYN=1 conta come un singolo byte 1
Apertura della connessione client state LISTEN SYNSENT choose init seq num, x send TCP SYN msg received SYNACK(x) indicates server is live; send ACK for SYNACK; this segment may contain client-to-server data SYNbit=1, Seq=x SYNbit=1, Seq=y ACKbit=1; ACKnum=x+1 ACKbit=1, ACKnum=y+1 choose init seq num, y send TCP SYNACK msg, acking SYN received ACK(y) indicates client is live server state LISTEN SYN RCVD TCP 3-way handshake: FSM closed Socket connectionsocket = welcomesocket.accept(); SYN(x) SYNACK(seq=y,ACKnum=x+1) create new socket for communication back to client L listen Socket clientsocket = newsocket("hostname","port number"); SYN(seq=x) SYN rcvd SYN sent ACK(ACKnum=y+1) L SYNACK(seq=y,ACKnum=x+1) ACK(ACKnum=y+1) 2
Chiusura connessione Rilascio asimmetrico: dati in transito potrebbero essere persi Chiusura della connessione Rilascio simmetrico: le due entità devono concordare prima di rilasciare l intera connessione Da A a B: io sono pronto a chiudere, e tu? Da B a A: anch io sono pronto. Da A a B: ok, arrivederci Ogni direzione è rilasciata indipendentemente dall altra: una entità continua a ricevere dati anche dopo aver chiesto la chiusura 3
Chiusura connessione Three way handshake con timeout; non è infallibile ma considerato adeguato Client (chi chiude la connessione) invia segmento di controllo FIN, con FIN bit posto a 1: entra in stato d attesa per ACK (FIN_WAIT_1) ricevuto ACK, rilascia la connessione ed entra in stato d attesa per FIN (FIN_WAIT_2) ricevuto FIN invia ACK ed entra in stato TIME_WAIT Server riceve FIN e risponde con ACK Invia FIN a client e fa partire timer (CLOSE_WAIT) riceve ACK, rilascia la connessione TCP: chiusura connessione client state server state FIN_WAIT_1 FIN_WAIT_2 clientsocket.close() can no longer send but can receive data wait for server close FINbit=1, seq=x ACKbit=1; ACKnum=x+1 can still send data CLOSE_WAIT TIME_WAIT timed wait for 2*max segment lifetime FINbit=1, seq=y ACKbit=1; ACKnum=y+1 can no longer send data LAST_ACK CLOSED CLOSED 4
State CLOSED LISTEN SYN RCVD SYN SENT LISHED FIN WAIT 1 FIN WAIT 2 TIME WAIT CLOSING CLOSE WAIT LAST ACK Description No connection is active or pending The server is waiting for an incoming call A connection request has arrived; wait for ACK The application has started to open a connection The normal data transfer state The application has said it is finished The other side has agreed to release Wait for all packets to die off Both sides have tried to close simultaneously The other side has initiated a release Wait for all packets to die off The states used in the TCP connection management finite state machine. TCP trasferimento affidabile Pipelining dei segmenti ACK cumulativi Timer unico per la ritrasmissione (RFC 6298) Il receiver invia un ACK, che può essere a piggyback di un segmento contenente anche dati Ritrasmissione in seguito a: timeout ACK duplicati 5
Receiver TCP (RFC 1122, RFC 5681) Arrivo di un segmento in ordine, tutti i segmenti già riscontrati: attesa massima di 500 ms di un altro segmento in ordine e invio di ACK (delayed ACK) Arrivo di un segmento in ordine, con numero di sequenza atteso e un segmento in attesa di trasmissione di ACK: invio ACK cumulativo Arrivo di segmento fuori ordine: invio ACK duplicato. Il segmento non viene scartato Arrivo di segmento che chiude un buco nella sequenza dei dati ricevuti, alla base della finestra: invio immediato di ACK cumulativo Sender TCP semplificato No ACK duplicati, no controllo flusso, no controllo congestione Eventi: dati passati dal livello applicativo: TCP crea segmento, lo passa a livello IP. Se non attivo, il timer viene avviato timeout: il TCP ritrasmette il segmento che ha causato l evento di timeout e riavvia il timer arrivo di un riscontro: un riscontro conferma tutti i byte precedenti il byte di riscontro. Se ci sono segmenti non riscontrati, riavvia il timer 6
Sender TCP (semplificato) L NextSeqNum = InitialSeqNum SendBase = InitialSeqNum wait for event ACK received, with ACK field value y data received from application above create segment, seq. #: NextSeqNum pass segment to IP (udt_send) NextSeqNum = NextSeqNum + length(data) if (timer currently not running) start timer timeout if (y > SendBase) { SendBase = y /* SendBase 1: last cumulatively ACKed byte */ if (there are currently not-yet-acked segments) start timer else stop timer } retransmit not-yet-acked segment with smallest seq. # start timer Sender TCP - Ritrasmissione veloce La perdita di segmenti viene dedotta da ACK duplicati: Il sender spesso invia tanti segmenti Se un segmento è perso, ci saranno molti ACK duplicati Al terzo ACK duplicato per lo stesso segmento, il sender deduce che il segmento successivo è andato perso ritrasmissione veloce (fast retransmit): ritrasmissione del segmento prima del timeout 7