Resumo

  • O ACK cumulativo confirma uma sequência sem lacunas. Se o primeiro segmento faltar, o número não avança, ainda que o receptor já tenha armazenado tudo o que veio depois.
  • O SACK negocia um pequeno conjunto de blocos não contíguos. Ele melhora a informação disponível ao emissor sem mudar o ACK básico nem entregar ao receptor a decisão de retransmitir.
  • A informação é limitada e pode ser desfeita. O emissor preserva os dados, respeita o congestionamento e espera o avanço cumulativo antes de considerar a entrega final.

Uma lacuna, sete chegadas e o mesmo ACK

Imagine que o receptor aguarde o byte 5000. O segmento que começa ali se perde, mas os sete seguintes chegam e formam uma faixa de 5500 a 9000. O ACK continua em 5000. Isso não nega as chegadas posteriores; apenas se recusa a afirmar que o fluxo está completo até 9000.

Essa recusa protege a ordem dos bytes, mas deixa o emissor com poucas pistas. Repetições de 5000 não revelam se só o primeiro segmento falta ou se há várias perdas. Reenviar todo o voo ocupa o caminho com cópias. Descobrir uma perda por tempo de ida e volta torna a recuperação cara em enlaces longos.

A RFC 793 definiu a promessa cumulativa: ACK X reconhece todos os octetos abaixo de X e aponta o próximo esperado. É uma fronteira forte o bastante para permitir a liberação posterior dos buffers. Justamente por ser forte, não pode saltar uma ausência para relatar dados parciais.

A primeira especificação não bastou

Em 1988, a RFC 1072 propôs SACK-Permitted no SYN e uma opção SACK nas confirmações seguintes. O receptor poderia descrever blocos descontínuos já recebidos e enfileirados. Um endpoint antigo continuaria usando o ACK cumulativo.

O formato não se tornou uma implantação comum. A RFC 2018 registra divergência sobre a interação com a escala de janela. A publicação de uma regra não instalou código nem resolveu a interoperabilidade. O desenho precisava voltar ajustado e encontrar implementações dispostas a conversar.

Em 1996, a revisão manteve a negociação no SYN e passou a usar bordas completas de 32 bits. A borda esquerda é o primeiro byte presente; a direita é o número logo após o último. Assim, o ACK 5000 pode carregar também SACK [5500, 9000). Uma afirma a continuidade; o outro descreve a ilha.

O relatório cabe em poucos blocos

As opções de TCP têm quarenta bytes. O cabeçalho da opção SACK usa dois e cada bloco usa oito. Cabem quatro blocos quando ela está sozinha; com timestamps, normalmente cabem três. O receptor pode conhecer mais intervalos do que consegue colocar em uma resposta.

A prioridade vai para o bloco alterado pela chegada mais recente, e blocos anteriores são repetidos. ACKs também se perdem. Ao reunir várias mensagens, o emissor monta uma imagem mais estável do que qualquer pacote isolado.

O limite evita confundir interoperabilidade com exposição completa de estado. O receptor não publica toda a fila nem seu modelo de memória. Sistemas diferentes concordam apenas sobre como nomear duas bordas de sequência.

Informação consultiva, confirmação definitiva

O SACK é consultivo. O receptor pode descartar depois um bloco que havia relatado, prática chamada reneging. O emissor pode deixar esse bloco fora de uma retransmissão normal, mas não deve apagar sua própria cópia antes que o ACK cumulativo avance.

Quando o temporizador expira, o emissor precisa admitir que as marcações antigas talvez não valham mais e garantir de novo o dado a partir da borda esquerda. O fallback protege a diferença entre uma fotografia momentânea e um recibo final.

Também preserva a responsabilidade. O emissor mantém a fila, combina blocos e escolhe o próximo segmento. A RFC 6675 formalizou um scoreboard do lado do emissor e um cálculo conservador do que ainda pode estar na rede. O relato recebido influencia a ação, mas não a comanda.

Precisão não é licença para congestionamento

SACK melhora a seleção de retransmissões; não aumenta o direito de ocupar o enlace. A RFC 2018 exige preservar o controle de congestionamento. Uma única chegada fora de ordem não prova perda, a recuperação continua limitada e a janela deve cair diante de sinais adequados.

Essa é a fronteira em relação ao colapso de 1986. O controle de congestionamento define quanto enviar. O SACK indica quais bytes merecem esse espaço. Um diagnóstico mais exato não cria capacidade coletiva.

O D-SACK, especificado em 2000, passou a indicar dados duplicados. Ele ajuda a reconhecer reordenação, ACK perdido, replicação ou timeout precoce. A RFC 2883 não escolhe uma reação única e lembra que o emissor não pode confiar automaticamente no receptor. A extensão amplia evidência, não autoridade.

Fontes e limites da evidência

A semântica cumulativa vem da RFC 793. A primeira proposta está na RFC 1072 e a revisão na RFC 2018. A RFC 2883 define D-SACK; a RFC 5681 preserva o limite de congestionamento; a RFC 6247 registra o status histórico da proposta antiga; e a RFC 6675 descreve recuperação conservadora.

Os RFCs demonstram formatos, obrigações e limites, não uma data mundial de adoção nem ganho idêntico em todas as rotas. Um bloco SACK não prova onde ou por que um pacote se perdeu e não autentica quem o enviou.