tcp coda di ritrasmissione

1

Sto cercando di capire come funziona la coda di ritrasmissione tcp in modo che possa essere implementata nella mia applicazione che utilizza TCAP su SCTP. Quello che ho capito dalla coda TCP è che ogni messaggio viene salvato nella coda di ritrasmissione con un tempo, quando il timer raggiunge 0 il messaggio verrà inviato di nuovo.

La mia domanda è come controllare l'ora su quel messaggio, è come un thread che controlla costantemente la coda di ritrasmissione o è qualcos'altro?

    
posta poly 22.05.2012 - 22:47
fonte

2 risposte

1

Ecco come funziona la coda di ritrasmissione TCP:

Ogni pacchetto ha un numero di sequenza. Dopo che A invia uno o più pacchetti a B , B risponde con un pacchetto di conferma e l'ultimo numero di sequenza che è stato ricevuto correttamente. A inizia quindi a inviare dal numero di sequenza successivo. Non è necessario conservare altri pacchetti che B ha già riconosciuto. Ecco un esempio:

  1. A - > B pacchetti 1,2,3,4,5
  2. B - > A Ack 5
  3. A - > Pacchetti B 6,7,8,9
  4. Il pacchetto 8 mancava (o era in errore), quindi B - > A Ack 7. (B scarta anche il pacchetto 9)
  5. A - > B 8,9,10,11

Ecc. Questo garantisce la consegna in sequenza.

Il time to live (TTL) è un contatore decrementato ogni volta che il pacchetto viene ritrasmesso. Dopo che TTL è decrementato a "0", il pacchetto non viene più inoltrato.

I numeri di sequenza vengono riavvolti dopo 32767. Quando si chiude una porta di ascolto, per assicurarsi che non ci siano pacchetti vaganti che potrebbero arrivare a una porta di ascolto in errore, il sistema operativo contrassegnerà normalmente una porta di ascolto come [TIMEWAIT] per 2 minuti perché il TTL dovrebbe andare a "0" per tutti i pacchetti in entrata per quella porta da allora.

    
risposta data 13.07.2012 - 18:34
fonte
1

A differenza di alcuni protocolli precedenti che utilizzavano numeri di sequenza di pacchetti, le connessioni TCP utilizzano numeri di sequenza di byte. Ogni pacchetto dice in sostanza "Ho ricevuto il flusso di dati da te fino a ma non includendo il byte A, sarei interessato a vedere fino a W byte oltre a questo. Qui ci sono N byte da me che iniziano con il numero di sequenza T". I numeri di sequenza di byte sono 32 bit e sono inizializzati su un valore arbitrario quando viene aperta una connessione e si spostano da 0xFFFFFFFF a 0; quando si confrontano i numeri di sequenza, si dovrebbe generalmente sottrarre usando valori non firmati, e poi guardare il risultato come un valore senza segno.

In genere, un'implementazione tiene traccia del numero di sequenza del prossimo byte che si aspetta, il numero di sequenza più alto per il quale ha ricevuto un riconoscimento, il numero di sequenza dell'ultimo byte trasmesso, quanto tempo deve attendere per un riconoscimento prima di ritrasmettere, e per quanto tempo dovrebbe attendere altri dati prima di riconoscere ciò che ha.

Ogni volta che i dati hanno dati da inviare a cui l'altra unità sarebbe interessata, dovrebbero inviarlo e impostare il timer per aspettarsi una conferma se non è già in esecuzione. Ogni volta che riceve un riconoscimento per alcuni ma non tutti i dati che ha inviato, dovrebbe resettare quel timer. Ogni volta che il timer scade senza aver ricevuto un riconoscimento per tutti i dati, l'unità deve caricare il suo numero di sequenza "ultimo byte trasmesso" con il numero di sequenza più alto per il quale ha ricevuto un riconoscimento.

Se i dati arrivano con i pacchetti in arrivo, l'unità dovrebbe impostare un timer per confermarli. Alla scadenza del timer, l'unità deve inviare un pacchetto anche se non ha alcun proprio proprio da inviare. Se l'unità invia un pacchetto per qualsiasi altro motivo, può confermare tutti i dati ricevuti fino a quel momento e quindi annullare il timer di riconoscimento.

Si noti che è possibile riconoscere il valore di molti pacchetti di dati da un singolo riconoscimento di reso; è anche possibile che i dati inviati come pacchetti multipli possano essere ritrasmessi come un pacchetto più grande. Le unità dovrebbero aspettarsi di ricevere un pacchetto contenente una combinazione di vecchi e nuovi dati; dovrebbero semplicemente elaborare i nuovi dati e ignorare il vecchio. Si noti che le unità dovrebbero riconoscere i dati che ricevono indipendentemente dal fatto che siano o meno "nuovi"; il riconoscimento dovrebbe indicare il numero di sequenza del prossimo byte atteso, indipendentemente da quali dati erano nel pacchetto riconosciuto.

TCP è per molti aspetti un protocollo abbastanza semplice, sebbene le più recenti implementazioni includano un sacco di rughe "opzionali". In generale, dispositivi come i microcontrollori embedded possono ottenere con l'implementazione di un piccolo sottoinsieme delle funzionalità che è probabile che includano i PC completi.

    
risposta data 14.07.2012 - 00:18
fonte

Leggi altre domande sui tag