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?
risposta
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.
L'ACK finale della stretta di mano non è di per sé ACK, tuttavia. –
ACKando un ACK renderebbe impossibile la trasmissione di dati reali. –
Ho capito il punto. Grazie! – ZHOU
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".
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. –
@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'. –
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. " –
- 1. Cosa succede se JWT viene rubato?
- 2. Cosa succede se un servizio viene avviato più volte?
- 3. quando viene il flag PUSH trova nel segmento TCP
- 4. come riassemblare il segmento tcp?
- 5. Cosa succede se viene lanciata un'eccezione durante la finalizzazione()
- 6. Cosa succede se una scrittura su localStorage viene cancellata?
- 7. Cosa succede se un costruttore lancia un'eccezione?
- 8. Cosa succede se nuovo fallisce?
- 9. Cosa succede se un'operazione di TableBatchOperation fallisce?
- 10. Cosa succede se un costruttore di shared_ptr non riesce?
- 11. Cosa succede alla connessione TCP sulla commutazione tower 3G?
- 12. Cosa succede se un finalizzatore rende un oggetto raggiungibile?
- 13. Operatori di assegnazione composta, cosa succede se il valore viene modificato (nel frattempo)?
- 14. Cosa succede quando viene assegnato un tipo contenente un lambda?
- 15. Cosa succede quando viene chiamato "return" da un blocco "using"?
- 16. Cosa succede se System.exit viene chiamato da un hook di chiusura?
- 17. Cosa succede se un lancio; la dichiarazione viene eseguita al di fuori del blocco catch?
- 18. Cosa succede se il compilatore inline una funzione che viene chiamata tramite un puntatore di funzione
- 19. Cosa succede dopo che un metodo viene chiamato in Java
- 20. Cosa succede se un oggetto trattenuto da un puntatore intelligente viene cancellato altrove?
- 21. Cosa succede se dimentico di chiudere un set?
- 22. Cosa succede se chiamo jQuery.post() con un url vuoto?
- 23. Cosa succede se call_user_func deve restituire false?
- 24. Cosa succede se Zookeeper fallisce completamente?
- 25. Cosa succede se I ReleaseMutex() due volte?
- 26. Cosa succede a un database Sqlite quando l'app viene rimossa
- 27. Cosa succede se chiudi una connessione chiusa?
- 28. C++ 11 auto: cosa succede se ottiene un riferimento costante?
- 29. Cosa succede se un oggetto ridimensiona il proprio contenitore?
- 30. Cosa succede se reimpostare uno std :: shared_ptr a se stesso
https://tools.ietf.org/rfc/rfc793.txt spiegherà cosa succede. –
@EdHeal: puoi indicare una parte specifica? – skrtbhtngr