12@ Semana-Redes de Computadores
12@ Semana-Redes de Computadores
12@ Semana-Redes de Computadores
Atividade: Resumo.
Protocolo rdt3.0
O que vimos até agora foi:
● Rdt1.0: um protocolo sobre um canal perfeitamente confiável;
● Rdt2.2: um protocolo mais real, onde há erro de bits.
Porém, há uma outra situação que normalmente ocorre em uma transferência de
arquivos e que precisa ser tratada: a perda de pacotes. Implementaremos então um
mecanismo para detectar um pacote perdido e retransmiti-lo. Tal mecanismo
consiste da utilização de um temporizador de contagem regressiva que será
acionado ao enviar cada pacote do remetente ao destinatário.
Uma ilustração do mecanismo apresentado é a seguinte:
● um pacote pkt0 é enviado ao destinatário, e o temporizador relativo a esse
pacote é acionado.
● pkt0 chega ao destinatário e este envia o ACK0.
● se ACK0 chegar ao remetente, o temporizador de pkt0 é parado e será
enviado o pkt1. Porém, caso o temporizador chegue a 0 antes do ACK0
ser recebido, pkt0 é reenviado, e os passos anteriores são novamente
repetidos.
Protocolo Go-Back-N
Para solucionar os problemas causados pelo comportamento pare e espere dos
protocolos anteriores, foi desenvolvido o protocolo Go-Back-N. Este permite o envio
de um determinado número de pacotes sem que os anteriores tenham sido
reconhecidos
É definido um número de pacotes que podem ser enviados sem que seja necessário
aguardar pelo reconhecimento de cada um deles. Esta quantidade de pacotes pode
ser vista como uma "janela". Os pacotes azuis são pacotes que já foram enviados,
mas ainda não foram reconhecidos, e os pacotes verdes são os próximos pacotes a
serem enviados, já que ainda estão dentro dos limites da janela. Os pacotes
vermelhos estão fora do limite da janela, logo não podem ser enviados ainda.
Nextseqnum é o número de sequência do próximo pacote a ser enviado. O pacote
base é o pacote não reconhecido com número de sequência mais antigo. Quando
este pacote for reconhecido, a janela irá se deslocar para a direita no espaço de
números de sequência dos pacotes, permitindo o envio de outros pacotes. A janela
"desliza", e com isso o protocolo Go-Back-N é também denominado protocolo de
janela deslizante.
O lado remetente deve ser capaz de responder a 3 situações:
● Dados recebidos da camada de cima
Antes de criar e enviar um pacote, o protocolo deve verificar se há espaço na janela.
Se não houver, os dados serão devolvidos, podendo ser enviados apenas quando
um espaço for liberado;
● Recebimento de um ACK
Receber um ACK com número de sequência n indica ao remetente que todos os
pacotes com número de sequência até n (inclusive) foram recebidos corretamente
pelo destinatário, e assim a janela desliza. O pacote com número de sequência n+1
se torna a base;
● Esgotamento de temporização
É usado um temporizador para o pacote base. Se um ACK chegar antes do
temporizador se esgotar, ele é reiniciado para o pacote seguinte. Se ele se esgotar,
todos os pacotes que foram enviados mas que ainda não foram reconhecidos são
reenviados.
O lado destinatário, ao receber um pacote com número de sequência n, que está na
ordem esperada, envia um ACK correspondente e entrega os dados à camada
superior. Caso o pacote recebido não esteja na ordem, ele será descartado e será
reenviado um ACK para o último pacote recebido corretamente.
Esta característica garante que os pacotes sejam recebidos em ordem, mas
descarta pacotes recebidos corretamente. Se por um lado isto gera um prejuízo na
necessidade de retransmissão de dados (que ainda podem ser perdidos, gerando
mais retransmissões), existe uma vantagem importante nesta opção: a simplicidade
nos buffers do destinatário. Não será preciso armazenar pacotes fora de ordem,
mas apenas o número de sequência esperado para o próximo pacote.
Repetição Seletiva
O protocolo o Go-Back-N ou GBN resolveu um problema de vital importância para a
transferência de dados, que é a questão do aproveitamento e da utilização do canal.
Com o GBN há envio de mais de um pacote sem a obrigatoriedade de confirmação
de recebimento do pacote anterior, ou seja, ele enche o canal com pacotes, N
pacotes (um numero finito), tendo assim um melhor aproveitamento do canal, da
largura de faixa do canal. Porém a forma como foi feito o GBN existem ainda
algumas questões que prejudicam a transferência eficiente de dados. Estas
questões são: o tamanho da janela grande e/ou o produto entre atraso e largura de
faixa também grande. Pensemos sobre a janela, que é o mesmo conceito de janela
do GBN. Vamos supor uma janela de tamanho para 100 pacotes. Se houver
qualquer erro, pode ser perda do pacote enviado ou perda do ACK enviado pelo
destinatário, terá que ser reenviado o pacote. O problema surge do fato que todos
os pacotes posteriores ao que foi perdido terão de ser também reenviados. Se
houver erro no 10º pacote, todos os 90 restantes juntamente com o 10º terão de ser
reenviados, ou seja, haverá muitos reenvios desnecessários, tendo desta forma
uma utilização também ineficiente, apesar de já ter melhorado. Imagine agora uma
janela com 1000 pacotes! Quanto maior a janela, mais o problema se agrava. Se,
também, o canal contiver uma taxa de erros alta, implica em maiores repetições.
Como sabemos, os canais reais não transmitem sem erros. Por mais que o canal
seja confiável e com baixa taxa de erros, esses erros existirão!