O protocolo GBN permite que o remetente potencialmente “encha a rede” com pacotes na Figura 3.17, evitando, assim, os problemas de utilização de canal observados em protocolos do tipo pare e espere. Há, contudo,
casos em que o próprio GBN sofre com problemas de desempenho. Em especial, quando o tamanho da janela e
o produto entre o atraso e a largura de banda são grandes, pode haver muitos pacotes pendentes na rede. Assim,
um único erro de pacote pode fazer com que o GBN retransmita um grande número de pacotes — muitos deles
desnecessariamente. À medida que aumenta a probabilidade de erros no canal, a rede pode ficar lotada com essas
retransmissões desnecessárias. Imagine se, em uma conversa, toda vez que uma palavra fosse pronunciada de
maneira truncada as outras mil que a circundam (por exemplo, um tamanho de janela de mil palavras) tivessem
de ser repetidas. A conversa sofreria atrasos devido a todas essas palavras reiteradas.
Como o próprio nome sugere, protocolos de repetição seletiva (selective repeat — SR) evitam retransmissões
desnecessárias porque fazem o remetente retransmitir somente os pacotes suspeitos de terem sido recebidos com
erro (isto é, que foram perdidos ou corrompidos) no destinatário. Essa retransmissão individual, somente quando
necessária, exige que o destinatário reconheça individualmente os pacotes recebidos de modo correto. Uma janela
de tamanho N será usada novamente para limitar o número de pacotes pendentes não reconhecidos dentro da
rede. Contudo, ao contrário do GBN, o remetente já terá recebido ACKs para alguns dos pacotes na janela. A
Figura 3.23 mostra a visão que o protocolo de SR remetente tem do espaço do número de sequência. A Figura
3.24 detalha as várias ações executadas pelo protocolo SR remetente.
O protocolo SR destinatário reconhecerá um pacote corretamente recebido esteja ele ou não na ordem certa.
Pacotes fora de ordem ficam no buffer até que todos os pacotes faltantes (isto é, os que têm números de sequência menores) sejam recebidos, quando então um conjunto de pacotes poderá ser entregue à camada superior na
ordem correta. A Figura 3.25 apresenta as várias ações realizadas pelo protocolo SR destinatário.
A Figura 3.26 apresenta um exemplo de operação do protocolo SR quando ocorre perda de pacotes. Note
que, nessa figura, o destinatário inicialmente armazena os pacotes 3, 4 e 5 e os entrega juntamente com o pacote
2 à camada superior, quando o pacote 2 é finalmente recebido.
Eventos e ações do protocolo SR remetente
1. Dados recebidos de cima. Quando são recebidos dados de cima, o protocolo SR remetente verifica o
próximo número de sequência disponível para o pacote. Se o número de sequência está dentro da
janela do remetente, os dados são empacotados e enviados; do contrário, eles são armazenados ou
devolvidos à camada superior para transmissão posterior, como acontece no GBN.
2. Esgotamento de temporização. Novamente são usados temporizadores para proteção contra perda
de pacotes. Contudo, cada pacote agora deve ter seu próprio temporizador lógico, já que apenas
um pacote será transmitido quando a temporização se esgotar. Um único hardware de temporizador
pode ser usado para emular a operação de múltiplos temporizadores lógicos [Varghese, 1997].
3. ACK recebido. Se for recebido um ACK, o SR remetente marcará aquele pacote como recebido, contanto que esteja na janela. Se o número de sequência do pacote for igual a send_base, a base da janela
se deslocará para a frente até o pacote não reconhecido que tiver o menor número de sequência. Se
a janela se deslocar e houver pacotes não transmitidos com números de sequência que agora caem
dentro da janela, esses pacotes serão transmitidos.
É importante notar que na etapa 2 da Figura 3.25 o destinatário reconhece novamente (em vez de ignorar)
pacotes já recebidos com certos números de sequência que estão abaixo da atual base da janela. É bom que você
se convença de que esse reconhecimento duplo é de fato necessário. Dados os espaços dos números de sequência do remetente e do destinatário na Figura 3.23, por exemplo, se não houver ACK para pacote com número
send_base propagando-se do destinatário ao remetente, este acabará retransmitindo o pacote send_base,
embora esteja claro (para nós, e não para o remetente!) que o destinatário já recebeu esse pacote. Caso o destinatário não reconhecesse esse pacote, a janela do remetente jamais se deslocaria para a frente! Esse exemplo ilustra
um importante aspecto dos protocolos SR (e também de muitos outros). O remetente e o destinatário nem sempre
têm uma visão idêntica do que foi recebido corretamente e do que não foi. Para protocolos SR, isso significa que
as janelas do remetente e do destinatário nem sempre coincidirão.
A falta de sincronização entre as janelas do remetente e do destinatário tem importantes consequências
quando nos defrontamos com a realidade de uma faixa finita de números de sequência. Considere o que poderia
acontecer, por exemplo, com uma faixa finita de quatro números de sequência de pacotes (0, 1, 2, 3) e um tamanho de janela de três. Suponha que os pacotes de 0 a 2 sejam transmitidos, recebidos e reconhecidos corretamente
no destinatário. Nesse ponto, a janela do destinatário está sobre o quarto, o quinto e o sexto pacotes, que têm os
números de sequência 3, 0 e 1, respectivamente. Agora, considere dois cenários. No primeiro, mostrado na Figura.
Eventos e ações do protocolo SR destinatário
1. Pacote com número de sequência no intervalo [rcv_base, rcv_base+N–1] foi corretamente recebido.
Nesse caso, o pacote recebido cai dentro da janela do destinatário e um pacote ACK seletivo é devolvido ao remetente. Se o pacote não tiver sido recebido anteriormente, irá para o buffer. Se esse pacote
tiver um número de sequência igual à base da janela destinatária (rcv_base na Figura 3.22), então ele,
e quaisquer outros pacotes anteriormente armazenados no buffer e numerados consecutivamente
(começando com rcv_base), serão entregues à camada superior. A janela destinatária é então deslocada para a frente de acordo com o número de pacotes entregues à camada superior. Como exemplo,
considere a Figura 3.26. Quando um pacote com número de sequência rcv_base=2 é recebido, ele e os
pacotes 3, 4 e 5 podem ser entregues à camada superior.
2. Pacote com número de sequência em [rcv_base-N, rcv_base-1] é recebido. Nesse caso, um ACK deve ser
gerado mesmo que esse pacote já tenha sido reconhecido anteriormente pelo destinatário.
3. Qualquer outro. Ignore o pacote 3.27(a), os ACKs para os três primeiros pacotes foram perdidos e o remetente retransmite esses pacotes. Assim,
o que o destinatário recebe em seguida é um pacote com o número de sequência 0 — uma cópia do primeiro
pacote enviado.
No segundo cenário, mostrado na Figura 3.27(b), os ACKs para os três primeiros pacotes foram entregues
corretamente. Assim, o remetente desloca sua janela para a frente e envia o quarto, o quinto e o sexto pacotes
com os números de sequência 3, 0 e 1, respectivamente. O pacote com o número de sequência 3 é perdido, mas
o pacote com o número de sequência 0 chega — um pacote que contém dados novos.
Agora, na Figura 3.27, considere o ponto de vista do destinatário, que tem uma cortina imaginária entre o
remetente e ele, já que o destinatário não pode ‘ver’ as ações executadas pelo remetente. Tudo o que o destinatário
observa é a sequência de mensagens que ele recebe do canal e envia para o canal. No que concerne a ele, os dois
cenários da Figura 3.27 são idênticos. Não há nenhum modo de distinguir a retransmissão do primeiro pacote da
transmissão original do quinto pacote. Fica claro que um tamanho de janela que seja igual ao tamanho do espaço de numeração sequencial menos 1 não vai funcionar. Mas qual deve ser o tamanho da janela? Um problema
ao final deste capítulo pede que você demonstre que o tamanho da janela pode ser menor ou igual à metade do
tamanho do espaço de numeração sequencial para os protocolos SR.
No Companion Website, você encontrará um applet que anima a operação do protocolo SR. Tente realizar
os mesmos experimentos feitos com o applet GBN. Os resultados combinam com o que você espera?
Com isso, concluímos nossa discussão sobre protocolos de transferência confiável de dados. Percorremos um
longo caminho e apresentamos numerosos mecanismos que, juntos, proveem transferência confiável de dados. A
Tabela 3.1 resume esses mecanismos. Agora que já vimos todos eles em operação e podemos enxergar ‘o quadro
geral’, aconselhamos que você leia novamente esta seção para perceber como esses mecanismos foram adicionados pouco a pouco, de modo a abordar modelos (realistas) de complexidade crescente do canal que conecta o
remetente ao destinatário ou para melhorar o desempenho dos protocolos.
Encerraremos nossa explanação considerando uma premissa remanescente em nosso modelo de canal subjacente. Lembre-se de que admitimos que pacotes não podem ser reordenados dentro do canal entre o remetente e
o destinatário. Esta é uma premissa em geral razoável quando o remetente e o destinatário estão conectados por
um único fio físico. Contudo, quando o ‘canal’ que está conectando os dois é uma rede, pode ocorrer reordenação
de pacotes.
Uma manifestação da reordenação de pacotes é que podem aparecer cópias antigas de um pacote com número de sequência ou de reconhecimento x, mesmo que nem a janela do remetente nem a do destinatário contenham x. Com a reordenação de pacotes, podemos considerar que o canal essencialmente usa armazenamento
de pacotes e emite-os espontaneamente em algum momento qualquer do futuro.
Como números de sequência
podem ser reutilizados, devemos tomar um certo cuidado para nos prevenir contra esses pacotes duplicados. A
abordagem adotada na prática é garantir que um número de sequência não seja reutilizado até que o remetente
esteja ‘certo’ de que nenhum pacote enviado anteriormente com número de sequência x está na rede. Isso é feito
admitindo que um pacote não pode ‘viver’ na rede mais do que um certo tempo máximo fixado.
As extensões do
TCP para redes de alta velocidade [RFC 1323] usam um tempo de vida máximo de pacote de aproximadamente
três minutos. [Sunshine, 1978] descreve um método para usar números de sequência tais que os problemas de
reordenação podem ser completamente evitados.
Resumo de mecanismos de transferência confiável de dados e sua utilização
| Mecanismo | Utilização, Comentários |
| Soma de verificação | Usada para detectar erros de bits em um pacote transmitido. |
| Temporizador | Usado para controlar a temporização/retransmitir um pacote, possivelmente porque o pacote (ou seu ACK) foi perdido dentro do canal. Como pode ocorrer esgotamento de temporização quando um pacote está atrasado, mas não perdido (esgotamento de temporização prematuro), ou quando um pacote foi recebido pelo destinatário mas o ACK remetente-destinatário foi perdido, um destinatário pode receber cópias duplicadas de um pacote. |
| Número de sequência | Usado para numeração sequencial de pacotes de dados que transitam do remetente ao destinatário. Lacunas nos números de sequência de pacotes recebidos permitem que o destinatário detecte um pacote perdido. Pacotes com números de sequência duplicados permitem que o destinatário detecte cópias duplicadas de um pacote. |
| Reconhecimento | Usado pelo destinatário para avisar o remetente que um pacote ou conjunto de pacotes foi recebido corretamente. Reconhecimentos normalmente portam o número de sequência do pacote, ou pacotes, que estão sendo reconhecidos. Reconhecimentos podem ser individuais ou cumulativos, dependendo do protocolo. |
| Reconhecimento negativo | Usado pelo destinatário para avisar o remetente que um pacote não foi recebido corretamente. Reconhecimentos negativos normalmente portam o número de sequência do pacote que não foi recebido corretamente. |
| Janela, paralelismo | O remetente pode ficar restrito a enviar somente pacotes com números de seqüência que caiam dentro de uma determinada faixa. Permitindo que vários pacotes sejam transmitidos, ainda que não reconhecidos, a utilização do remetente pode ser aumentada em relação ao modo de operação pare e espere. Em breve veremos que o tamanho da janela pode ser estabelecido com base na capacidade do destinatário receber e fazer buffer de mensagens ou no nível de congestionamento na rede, ou em ambos. |
Comentários
Postar um comentário