2013-04-28 16 views
15

Nell'handshake TCP a 3 vie, verranno inviati 3 segmenti (SYN, SYN ACK, ACK). Cosa succede se il terzo segmento (ACK) viene perso? Il mittente sta per inviare nuovamente il segmento o rinunciare a stabilire la connessione? E in che modo i due host sanno che il segmento è perso?Cosa succede se un segmento di handshake TCP viene perso?

+1

https://tools.ietf.org/rfc/rfc793.txt spiegherà cosa succede. –

+0

@EdHeal: puoi indicare una parte specifica? – skrtbhtngr

risposta

16

TCP ha un numero di sequenza in tutti i pacchetti. Quindi è facile sapere se un pacchetto è stato perso o meno. Se un host non ottiene un ACK su un pacchetto, lo invia nuovamente.

Nella maggior parte dei casi, anche se l'ACK è stato perso, non ci sarà alcun invio per un motivo molto semplice. Subito dopo l'ACK, è probabile che l'host che ha aperto il protocollo TCP inizi a inviare dati. Questi dati avranno, come tutti i pacchetti TCP, un numero ACK, quindi il destinatario otterrebbe un ACK in quel modo. Quindi, il mittente del SYN-ACK dovrebbe ragionevolmente non preoccuparsi che non ha ottenuto l'ACK, perché ottiene un ACK "implicito" nel seguente pacchetto.

La re-invio di SYN-ACK è necessaria solo in assenza di dati ricevuti.

Update: Ho trovato il posto nella RFC che specifica esattamente questo:

Se il nostro SYN è stato riconosciuto (forse in questo segmento in arrivo) il livello di precedenza del segmento in arrivo deve partita il livello di precedenza locale esattamente, se non è necessario un reset deve essere inviato.

In altre parole, se l'ACK viene eliminato ma il pacchetto successivo non viene eliminato, tutto va bene. In caso contrario, la connessione deve essere ripristinata. Il che ha perfettamente senso.

+2

L'ACK finale della stretta di mano non è di per sé ACK, tuttavia. –

+8

ACKando un ACK renderebbe impossibile la trasmissione di dati reali. –

+0

Ho capito il punto. Grazie! – ZHOU

1

Non sono un esperto in questa particolare situazione, ma sospetto che ciò che accadrà è che il client penserà che sia connesso ma il server no. Se il client tenta di inviare dati al server, il server lo rifiuterà e invierà un pacchetto RST al client in modo che possa ripristinare la sua "connessione".

+0

Il server vede la connessione stabilita durante l'invio di SYN-ACK. Ma questo potrebbe essere un dettaglio di implementazione, non ho trovato le specifiche effettive su cosa fare in questo caso. Forse non ce ne sono. –

+0

@LennartRegebro: secondo [RFC 793 Sezione 3.4] (http://tools.ietf.org/html/rfc793#section-3.4), il server non entra nello stato 'ESTABLISHED' finché non riceve l'ACK finale. Quando invia il 'SYN + ACK', è ancora nello stato' SYN-RECEIVED'. Il client entra nello stato 'ESTABLISHED' quando riceve' SYN + ACK'. –

+3

Trovato: "Se il nostro SYN è stato riconosciuto (forse in questo segmento in entrata) il livello di precedenza del segmento in entrata deve corrispondere esattamente al livello di precedenza locale con lo , se non è necessario inviare un ripristino." In altre parole, se l'ACK e * solo * l'ACK vengono eliminati, la connessione viene stabilita. Se più cose vengono eliminate, c'è un reset. " –

Problemi correlati