2012-03-30 11 views

risposta

7

La risposta breve è che ogni pacchetto contiene informazioni di offset (mascherate come numero di sequenza), specificando dove nel flusso si trova il suo carico utile.

Diciamo che si è verificato quanto segue: il pacchetto 1 è ricevuto, il pacchetto 2 non viene ricevuto e il pacchetto 3 e 4 sono ricevuti. A questo punto ricevere lo stack TCP sa dove copiare il contenuto dei pacchetti 3 e 4 sul buffer e sa che non ha ancora ricevuto i dati precedenti, quindi renderà i dati del pacchetto 1 disponibili per la lettura, ma non lo farà pacchetto 3 o 4 dati disponibili fino al ricevimento del pacchetto 2.

La trasmissione dello stack TCP in genere non attende i riconoscimenti per alcun singolo pacchetto prima di inviare il successivo, ma se non riceve un riconoscimento per un determinato pacchetto (e gli ACK possono e sono raggruppati insieme in un unico pacchetto per l'efficienza), lo ritrasmetterà fino a quando non viene ricevuto un ACK.

La sequenza esatta di eventi dipende dalle condizioni della rete, dall'implementazione dello stack TCP, dal criterio TCP selezionato, dalle opzioni socket e da altri fattori.

4

pacchetti TCP hanno numeri di sequenza (scostamenti di byte a partire dall'inizio, dalla memoria) ei messaggi ACK riconoscete che un offset specifico è stato ricevuto:

enter image description here

Così si potrebbe finire con una situazione come :

data 1 (10 bytes)   -> 
          <- ack (10, data1) 
data 2 (15 bytes)   -> 
data 3 (10 bytes)   -> 
data 4 (8 bytes)   -> 
          <- ack (25, data1/2/3) 
          <- ack (33, data1/2/3/4) 

in altre parole, il mittente può continuare a trasmettere indipendentemente riconoscimenti fino al punto in cui i buffer sono pieni (deve mantenere i pacchetti non riconosciuti in caso necessiti di ri-trasmettere).

Questa "disconnessione" tra le mandate e le conferme può velocizzare notevolmente il flusso di dati.

Alla fine della ricezione, i pacchetti possono arrivare fuori servizio e vengono conservati fino a quando qualcosa può essere consegnato ai livelli superiori in ordine.

Ad esempio, se data 3 arrivato prima data 2, all'estremità ricevente dovrebbe tenere su di esso fino data 2 arrivato, allora entrambi verrebbe mandata verso l'alto per la consegna.