se un client tcp invia un pacchetto, con numero di sequenza compreso tra 10000 e 20000, a un server tcp. il tcp risponderà con un ACK con seq_ack 20001.
se intercetto il pacchetto TCP dal client e divido il pacchetto in 2 segmenti tcp, uno con seq da 10000 a 15000 e l'altro con seq da 15001 a 20000. E poi questi 2 segmenti TCP vengono inviati al server TCP. Supponiamo che il secondo segmento sia perso nel percorso. Il server TCP risponderà a un ACK con seq_ack 15001.
Ora poiché il client TCP invia un pacchetto integrale con seq da 10000 a 20000, ma ottiene un ACK con 15001, dal punto di vista del client, questo è strano. Come reagirà? In teoria, il client dovrebbe ritrasmettere i byte dal seq 15001 al 20000, ovvero il client trasmetterà nuovi pacchetti dal seq 15001. Ma che ne dite della pratica, nell'implementazione dello stack TCP, è la stessa della teoria?
Penso che nel buffer di invio TCP, quando viene inviato un segmento tcp, il segmento rimane lì fino all'ACK. Quando arriva l'ACK, questi byte per il segmento vengono cancellati dal buffer. C'è un puntatore nel buffer di invio, quando arriva un ACK, il puntatore punta alla posizione in cui ack_seq corrisponde. I byte che si trovano sotto ack_seq vengono cancellati. In questo modo, non è necessario ritrasmettere l'intero segmento?