Resumo

  • O reconhecimento cumulativo do TCP só avançava pela sequência contínua. Com SACK, o receptor podia anunciar blocos posteriores que já tinham chegado apesar da falta de um trecho anterior.
  • O RFC 2018 permitia ao receptor descartar dados antes anunciados por SACK. O emissor mantinha a cópia até o reconhecimento cumulativo alcançar aqueles bytes.

Chegam à repartição as páginas um, dois e quatro. O carimbo oficial para na segunda, porque a terceira sumiu no caminho. Um funcionário escreve à margem que a quarta está na mesa. Mais tarde, com a mesa cheia, pode retirá-la. Essa pequena liberdade administrativa foi uma das regras decisivas do reconhecimento seletivo no TCP.

O RFC 1072, de 1988, expôs o incômodo nas rotas com grande atraso e muita capacidade. Um buraco congelava o número cumulativo de reconhecimento. Quem enviava não sabia, por aquele número, quais segmentos posteriores tinham sido recebidos. Esperar outra viagem da informação custava tempo; retransmitir sem mapa custava largura de banda. A proposta seletiva faria o receptor descrever os pedaços presentes além do buraco. Era uma experiência proposta; o desenho definitivo da opção de TCP surgiu depois.

Em outubro de 1996, o RFC 2018 definiu o SACK. A outra ponta precisava anunciar SACK-Permitted no SYN de abertura antes que o receptor enviasse a opção. O campo tradicional de reconhecimento continuou no cabeçalho TCP, marcando a fronteira contínua. Os blocos SACK traziam os limites dos intervalos recebidos depois dela. O carimbo e a lista de páginas soltas passaram a viajar no mesmo envelope, cada um com função própria.

O envelope não era grande. O espaço de opções do TCP limitava a quantidade de blocos que cabia em um ACK. O RFC 2018 deu prioridade ao bloco que continha o segmento recém-chegado responsável pelo reconhecimento, salvo quando ele fazia o número cumulativo avançar. Recomendou ainda registrar outros intervalos distintos e repetir blocos recentes quando possível. Se um ACK desaparecesse, a repetição poderia entregar a notícia. O remetente recebia um retrato útil, sujeito a cortes e a perdas no próprio caminho de volta.

A seção 8 descreveu o momento em que a mesa é esvaziada. O receptor podia descartar dados fora de ordem já anunciados em SACK, especialmente sob pressão de memória. Esse comportamento recebeu o nome de reneging. Os anúncios seguintes não podiam continuar mostrando como presentes os blocos antigos abandonados. A regra do primeiro bloco ainda mostrava o segmento mais novo, mesmo quando o receptor pretendia descartá-lo. Receber e informar não obrigava a guardar até o fim.

Para o emissor, a instrução era firme: nenhum byte seria apagado antes de o reconhecimento cumulativo cobri-lo. A informação seletiva servia para escolher retransmissões e evitar repetir imediatamente os blocos que pareciam estacionados do outro lado. A cópia original permanecia disponível. Se a outra ponta limpasse sua fila antes da chegada do trecho faltante, o remetente ainda poderia reconstruir a sequência.

O RFC 2883, de julho de 2000 deu à mesma opção um uso adicional. D-SACK informava a chegada de dados duplicados. O sentido do campo cumulativo e o momento de enviar ACKs continuavam iguais. Um duplicado podia aparecer em apenas um ACK; a perda desse pacote apagava o aviso. Até um recibo mais expressivo dependia de chegar ao destino.

SACK ensinou o TCP a procurar o trecho faltante com mais informação. A regra de conservação impediu uma confusão cara: usar o bilhete na margem para planejar o próximo envio é inteligente; triturar o original antes do carimbo contínuo é pedir à rede que se lembre do que já esqueceu.