se um cliente tcp enviar um pacote, com número de sequência de 10000 a 20000, para um servidor tcp. o tcp responderá com um ACK com seq_ack 20001.
se eu interceptar o pacote TCP do cliente e dividir o pacote em 2 segmentos tcp, um com seq de 10000 a 15000 e outro com seq de 15001 a 20000. E esses dois segmentos TCP serão enviados ao servidor TCP. Suponha que o segundo segmento esteja perdido no caminho. O servidor TCP responderá um ACK com seq_ack 15001.
Agora, como o cliente TCP envia um pacote integral com seq 10000 a 20000, mas recebe um ACK com 15001, do ponto de vista do cliente, isso é estranho. Como isso vai reagir? Em teoria, o cliente deve retransmitir os bytes da seq 15001 a 20000, ou seja, o cliente transmitirá novos pacotes da seq 15001. Mas e quanto à prática, na implementação da pilha TCP, é a mesma da teoria?
Eu acho que no buffer de envio TCP, quando um segmento TCP é enviado, o segmento ainda permanece lá até o ACK. Quando o ACK chega, esses bytes para o segmento são limpos do buffer. Há um ponteiro no buffer de envio. Quando um ACK chega, o ponteiro aponta para o local em que o ack_seq corresponde. Os bytes que estão abaixo do ack_seq são limpos. Dessa forma, o segmento inteiro não precisa ser retransmitido?
fonte
Os tamanhos dos segmentos podem (e mudam) durante a vida útil de uma conexão. Felizmente, o TCP não precisa registrar o tamanho do segmento com o qual os pacotes individuais foram enviados anteriormente. Portanto, ele fará o seguinte:
Ambas as operações são realizadas independentemente do tamanho do segmento em que esses bytes foram originalmente enviados. Portanto, a teoria deve corresponder à maioria das implementações.
Deixe-me dar uma explicação para explicar:
O TCP usa bytes ou segmentos? Para o aplicativo, o TCP expõe uma interface de fluxo de bytes. Além disso, todos os campos do cabeçalho e variáveis internas estão em bytes. No entanto, para transmitir informações, o TCP as divide em segmentos, pois o envio de bytes um por um seria um grande desperdício :-). O uso de contadores de bytes em qualquer lugar tem a vantagem de que o tamanho do segmento não precisa permanecer constante durante a vida útil da conexão:
BTW: SACK não é a resposta aqui, pois o receptor (normalmente) só usará o SACK se reconhecer um furo no fluxo de bytes (ou seja, se um pacote for perdido, mas um pacote seguinte chegar).
fonte