Confuso com reordenamento de pacotes

Aug 15 2020

Eu estava lendo um livro que diz sobre o protocolo TCP "Repetição seletiva":

Presumimos que os pacotes não podem ser reordenados dentro do canal entre o emissor e o receptor. Isso geralmente é uma suposição razoável quando o emissor e o receptor estão conectados por um único fio físico. No entanto, quando o “canal” que conecta os dois é uma rede, pode ocorrer um reordenamento de pacotes. A abordagem adotada na prática é garantir que um número de sequência não seja reutilizado até que o remetente tenha “certeza” de que quaisquer pacotes enviados anteriormente com o número de sequência x não estejam mais na rede. Isso é feito assumindo que um pacote não pode “viver” na rede por mais tempo do que um determinado período máximo de tempo.

Estou confuso e abaixo estão minhas duas perguntas.

Q1 - O que significa "o canal pode ser considerado essencialmente como um buffer de pacotes e a emissão espontânea desses pacotes em qualquer ponto no futuro." significar? Por que precisamos armazenar em buffer um pacote antigo? Não é melhor que o receptor simplesmente ignore?

Q2 - Digamos que o tamanho da janela seja 2 e o número de sequência disponível seja 0,1,2,3. O remetente primeiro envia o pacote 0, pacote 1, enquanto o pacote 0 é atingido de alguma forma e leva muito tempo para chegar, então ocorre o timeout e o remetente tem que enviar o pacote 0 novamente, mas desta vez o pacote 0 (novo) chega no horário. Em seguida, o remetente envia o pacote 2, o pacote 3, todos recebidos pelo receptor. E então o remetente está prestes a enviar o pacote 0 (novo) e o pacote 1 (novo), mas o pacote antigo 0 chega ao receptor agora, portanto, o recebimento não pode saber se esse pacote é o pacote antigo ou o novo. Portanto, como "presumir que um pacote não pode“ viver ”na rede por mais tempo do que um determinado período máximo de tempo" pode corrigir esse problema? Isso significa que o cabeçalho do pacote contém a hora em que foi enviado?

Respostas

2 Zac67 Aug 16 2020 at 07:31

O que significa "o canal pode ser considerado essencialmente como um buffer de pacotes e a emissão espontânea desses pacotes em qualquer ponto no futuro". significar? por que precisamos armazenar um pacote antigo? não é melhor que o receptor simplesmente ignore?

Essa é a natureza do enfileiramento e do armazenamento em buffer, que é uma parte essencial da comutação de pacotes - os pacotes recebidos são enfileirados / armazenados em buffer na entrada e excluídos da fila após serem encaminhados. O buffer é necessário, caso contrário, o link de saída sempre precisaria estar livre sempre que um pacote fosse recebido - isso não é possível para redes comutadas por pacotes, apenas para redes comutadas por circuito.

Digamos que o tamanho da janela seja 2 e o número de sequência disponível seja 0,1,2,3.

A janela não conta pacotes / datagramas, mas bytes . Além disso, o número de sequência só se repete quando seu campo de 32 bits transborda - isso acontece apenas após 4 GiB de dados. No entanto, esse limite significa que não pode haver mais de 4 Gib de dados "em vôo" para evitar ambigüidade. Como a maior janela possível é (perto de) 1 GiB, isso não é um problema.

Observe que com ACKs simples e cumulativos, o receptor não pode fazer ACK seletivamente em segmentos posteriores quando um segmento anterior ainda está faltando. Um ACK significa que todos os dados anteriores foram recebidos.

Por exemplo, com um tamanho de segmento de 1.000 e um tamanho de janela de 10.000, o remetente envia datagramas D00-D09 (sequência 0-9.999). D00 e D02-D09 são recebidos, mas D01 é perdido. O receptor ainda ACKs 1.000 (a próxima sequência de dados esperada) que faz com que o remetente mova D0 para fora da janela, avance para 1.000-10.999 e envie D10.

Enquanto isso, o receptor decidiu que há um problema, então ele ACK 1.000 novamente para sinalizar exatamente isso. O remetente recebe o ACK duplo e reenvia D01 (modo relutante) ou todos os dados a partir de D01 (modo agressivo). O receptor já tem D10 (10.000-10.999), então ele ACKs 11.000 que por sua vez move a janela do remetente para 11.000-20.999 (e aborta as retransmissões ainda pendentes, para o modo agressivo).

(Eu simplifiquei um pouco o processo, na realidade há mais sobreposição paralela e um atraso entre o envio e o recebimento, é claro).

EDIT: Como Jeff corretamente apontou (thx!), Suporte para confirmações seletivas (SACK) é quase um dado hoje. Usando essa opção, o receptor também pode SACK 2.000-9.999 (de D02-D09) imediatamente, para que o remetente não comece a retransmiti-los. Ele também pode começar a transmitir 11.000-20.999 mais cedo.