1. Introdução
Protocolos de Janela Deslizante ou Sliding
Window são recursos usados na camada de enlace de dados do modelo
OSI, bem como no protocolo TCP (equivalente à camada de transporte do
modelo OSI). Janela deslizante é uma característica de alguns
protocolos que permite que o remetente transmita mais que um pacote de
dados antes de receber uma confirmação. Depois de receber a
confirmação para o primeiro pacote enviado, o remetente desliza a
janela e manda outra confirmação. O número de pacotes transmitidos
sem confirmação é conhecido como o tamanho da janela; aumentando o
tamanho da janela melhora-se a vazão.
2. Por que Janelas Deslizantes?
Em sistemas distribuídos, supõe-se
que uma mensagem enviada por um nó chegue integralmente ao seu destino,
e que a ordem dos pacotes de informação é preservada entre os dois
nós num meio de comunicação ideal. Entretanto, perdas de pacotes e
erros de comunicação ocorrem no meio de comunicação real.
Entretanto, protocolos que enviam um frame e aguardam sua confirmação
são ineficientes do ponto de vista de um canal de comunicação full
duplex. Com o uso de um sistema de janelas deslizantes esse problema
pode ser contornado. O emissor mantém uma janela de transmissão dos
frames enviados mas, ainda, não confirmados. Assim, é possível ao
transmissor enviar um número maior de frames enquanto aguarda a
confirmação do receptor. Essa técnica de retardar temporariamente as
confirmações e enviá-las junto com o próximo quadro de dados é
conhecida pelo nome de piggybacking (superposição).
À medida que o receptor recebe os
frames, envia para o emissor a confirmação até qual frame recebeu
corretamente. Com base nas informações recebidas do receptor, o
emissor desloca a janela de envio os frames já confirmados e transmite
novos frames. Entretanto, o emissor deve manter um controle de timeout para cada frame transmitido. Esse timeout define o limite de
tempo em que a confirmação deve chegar do receptor. Se a confirmação
não chegar dentro desse tempo, o emissor assume que o frame não foi
enviado ou não chegou ao seu destino.
3. TCP e Janelas Deslizantes
O TCP é um protocolo orientado à
conexão que permite a entrega sem erros de um fluxo de bytes originados
de uma determinada máquina para qualquer outra máquina da inter-rede.
Esse protocolo atua na camada de transporte oferecendo um serviço de
transferência de bytes fim a fim, de modo confiável, em uma inter-rede
não-confiável.
Considerando que na camada de rede o
IP não oferece qualquer garantia de que os datagramas serão entregues
da forma apropriada, cabe ao protocolo TCP administrar os temporizadores
e retransmitir os datagramas sempre que necessário. Os datagramas
também podem chegar fora de ordem e o TCP também terá de
reorganizá-los em mensagens na seqüência correta. Resumindo, o TCP
deve fornecer a confiabilidade que o IP não oferece.
O protocolo básico utilizado pelas
entidades TCP é o protocolo de janelas deslizantes usado para manter um
registro do quadro de sequências enviadas e os respectivos
reconhecimentos recebidos pelos usuários. Nas transmissões com
controle de fluxo, temos uma janela de duração variável, a qual
permite que um remetente possa transmitir determinado número de
unidades de dados antes que uma confirmação seja recebida ou que um
evento especificado ocorra. Consequentemente, o objetivo da janela
deslizante é aumentar a taxa de transferência de pacotes melhorando a
utilização do meio de transmissão.
No TCP, o protocolo da janela
deslizante é usado para envio de arquivos de dimensão superior ao
pacote (Max ≈ 64KB). O emissor numera cada pacote, guardando os
números do último pacote enviado e reconhecido. Para cada pacote
enviado, a largura da janela aumenta. Se a distância for superior à
largura da janela, o emissor suspende o envio de pacotes. A solução
consiste no envio e recebimento do sinal de ACK (Acknowledge),
sinal eletrônico de reconhecimento usado em transmissões de dados para
informar o status de recebimento dos pacotes. O emissor envia um número
de pacotes w que representa o tamanho da janela, ou seja,
o número de pacotes que podem ser enviados sem qualquer ACK do
receptor. O tamanho de janela é conhecido tanto pelo emissor como pelo
receptor, até porque este último tem de reservar inicialmente um buffer com capacidade para os w pacotes que espera receber. O receptor usa um buffer finito para armazenar temporariamente os dados até que as camadas
superiores possam processá-los.
Como se trata de um buffer finito sempre existe a probabilidade de este atingir sua capacidade
máxima, com consequente "estouro" e perda de dados. Para
evitar esta situação o receptor deve informar ao emissor o estado do
seu buffer através de um mecanismo simples de controle de
fluxo conhecido por stop & wait:
O emissor envia um pacote de cada
vez, e espera pela confirmação (ACK) do receptor; só após essa
confirmação é que pode enviar outro pacote;
O receptor só envia o ACK ao
emissor se possui espaço suficiente no buffer de recepção.
Para garantir o funcionamento do
mecanismo das janelas deslizantes, tanto os pacotes como os ACK são
numerados de 0 a w, isto evita que o receptor tenha
de enviar ACK individuais para todos os pacotes. Quando um pacote é
enviado, o transmissor aciona um temporizador e quando esse pacote chega
ao destino, a entidade TCP receptora retorna um segmento (com ou sem
dados, de acordo com as circunstâncias) com um número de confirmação
igual ao próximo número de seqüência que espera receber. O
transmissor cria uma espécie de tabela, onde cada posição é uma
janela, em que são gravadas todas as mensagens que foram enviadas.
Por exemplo, se o receptor envia ACK-8
quer dizer que já retirou do buffer todos os pacotes até o 8º
pacote; nesta situação o emissor sabe que pode manter sem ACK os w pacotes depois do pacote de número 8 (PAC-8). Se o temporizador do
transmissor expirar antes de a confirmação ser recebida, o segmento
será retransmitido.
A principal vantagem dessa técnica de
superposição em relação ao envio de quadros de confirmação
distintos é a melhor utilização da largura de banda disponível para
o canal. O campo ACK do cabeçalho de quadro precisa de apenas alguns
bits, enquanto um quadro separado precisaria de um cabeçalho, da
confirmação e de um total de verificação. Além disso, um número
menor de quadros enviados significa menor quantidade de interrupções
de "chegada de quadro", e menor quantidade de buffers no receptor, dependendo da forma como o software do receptor está
organizado.
3.1. Janelas Deslizantes
Os Protocolos de janelas deslizantes
são usados para a entrega confiável e ordenada de mensagens. Trata-se
de protocolos orientados a conexão (primeiro garante que a conexão
está ativa, para depois iniciar o envio das mensagens) que garantem que
todas as mensagens enviadas serão entregues aos destinatários
integralmente e na ordem correta de envio.
Uma das principais características
das janelas deslizantes é que o transmissor mantém um conjunto de
números de seqüência que indicam os quadros, reunidos na janela de
transmissão, que este pode enviar (janela de transmissão). O receptor
também possui um conjunto de números de seqüência que correspondem
aos quadros que espera receber (janela de recepção).
O protocolo prevê o controle de fluxo
dos quadros enviados e recebidos de uma estação para outra. Cada
quadro enviado contém um número de seqüência, que varia de 0 a um
valor máximo. O valor máximo, geralmente vai até 2n -1, de
forma que o número possa caber em um campo de n bits. Da mesma
forma, o receptor mantém uma janela de recepção correspondente aos
dados aptos a serem aceitos.
A Figura 1 mostra as janelas do
transmissor e do receptor com índices de 0 a 7. Os próximos quadros
reutilizarão os índices a partir de 0. Neste caso, o tamanho máximo
da janela é 23-1, que é 4, pois são utilizados 3 bits para
representar os números de seqüência.
Figura 1 - Janelas
deslizantes do transmissor e do receptor
Em (a) é mostrada a
representação da perspectiva do transmissor. O retângulo sombreado
diz respeito aos quadros a serem enviados. Cada vez que um quadro é
enviado, o retângulo sombreado diminui da esquerda para a direita.
Quando ocorre o reconhecimento (ACK) de um quadro recebido pelo
receptor, o retângulo aumenta da esquerda para a direita. Os quadros
antes da barra vertical são os quadros enviados e confirmados, não
necessitando de armazenamento em buffer. O quadro de índice 3,
após a barra vertical, indica o quadro transmitido, mas ainda não
confirmado e que precisa estar em buffer caso precise ser reenviado.
Em (b) é mostrada a
perspectiva do receptor. O retângulo sombreado representa os quadros a
serem recebidos. À medida que os quadros são reconhecidos (ACK), o
retângulo diminui da esquerda para a direita. À medida que os quadros
são recebidos, o retângulo aumenta da esquerda para a direita.
4. Implementação de Protocolos de
Janelas Deslizantes
A essência de todos os protocolos de
janelas deslizantes é o fato de que, em qualquer instante, o
transmissor mantém um conjunto de números de seqüência
correspondentes a quadros que ele pode enviar. Os protocolos seguintes
são bidirecionais e pertencem à classe de protocolos de janelas
deslizantes. Os três apresentam diferenças em termos de eficiência,
complexidade e requisitos de buffer:
4.1. Janela Deslizante de Um Bit
ou "stop-and-wait"
O protocolo de janela deslizante stop-and-wait utiliza n = 1, restringindo os números de seqüência a 0 e 1. Este
protocolo é assim chamado porque o tamanho máximo da janela é de um
bit, ou seja, só são aceitos os valores 0 ou 1. Ele envia um quadro e
aguarda a confirmação para enviar o seguinte. Versões mais
sofisticadas podem usar um valor arbitrário de n.
Outra característica é que não há
combinação de erros no pacote ou por estouro de tempo que resultem na
duplicação ou chegada de pacotes fora de ordem para a camada de rede.
Figura 2 - Janela
Deslizante de Um Bit
A Figura 2 mostra um exemplo de janela
deslizante de tamanho máximo igual a 1 bit, com um número de
seqüência de 3 bits. Inicialmente, não há quadros pendentes e a
borda inferior e superior da janela do transmissor são iguais, mas, à
medida que o tempo passa, a situação se desenvolve da maneira
mostrada: Em (a) a condição inicial. Em (b) depois que o primeiro
quadro é enviado. Em (c) depois que o primeiro quadro é recebido. Em
(d) depois que a primeira confirmação é recebida.
4.2. Janela Deslizante Volte a N
ou "go back n"
O protocolo de janela deslizante de um
bit possui um problema de desempenho, visto que o canal de comunicação
fica ocioso enquanto não chegar uma confirmação do receptor. Para tal
situação, o protocolo de "volte a n" possibilita o
transmissor enviar n quadros antes que o primeiro seja confirmado. Este
valor será proporcional ao tempo em que se podem enviar quadros
completos antes que a janela fique esgotada.
Neste protocolo, todos os quadros
enviados, após um quadro com erro, serão descartados. O receptor
simplesmente descarta todos os quadros subseqüentes ao erro e não
envia qualquer confirmação desses quadros descartados. Essa
estratégia corresponde a uma janela de recepção de tamanho 1. Em
outras palavras, a camada de enlace de dados se recusa a aceitar
qualquer quadro, exceto o próximo quadro que ela tem de entregar à
camada de rede.
Se a janela do transmissor for
totalmente preenchida antes do timer encerrar a contagem, o buffer
começará a se esvaziar. Conseqüentemente, o transmissor interromperá
a transmissão e retransmitirá todos os quadros não confirmados em
ordem, começando pelo quadro danificado ou perdido. Convém salientar
que essa abordagem poderá desperdiçar uma grande quantidade de largura
de banda se a taxa de erros do canal for alta.
Figura 3 - Janela
Deslizante Volte a N
Na Figura 3 temos o caso em que a
janela do receptor é grande. Os quadros 0 e 1 são corretamente
recebidos e confirmados. Porém, o quadro 2 está danificado ou perdido.
O transmissor, desavisado desse problema, continua a enviar quadros até
expirar o temporizador correspondente ao quadro 2. Em seguida, ele volta
até o quadro 2 e começa tudo de novo a partir dele, enviando mais uma
vez os quadros 2, 3, 4 etc.
4.3. Janela Deslizante com
Retransmissão Seletiva ou "selective
repeat"
Uma estratégia para lidar com os
erros é permitir que o receptor aceite e armazene os quadros
subseqüentes a um quadro danificado ou perdido. O protocolo com
retransmissão seletiva não descarta quadros apenas porque um quadro
anterior foi danificado ou perdido.
Figura 4 - Janela
Deslizante com Retransmissão Seletiva
Na Figura 4, os quadros 0 e 1 são
recebidos e confirmados corretamente, e o quadro 2 é perdido. Quando o
quadro 3 chega ao receptor, a camada de enlace de dados do receptor
percebe que perdeu um quadro e envia de volta um NAK (No AcKnowledge),
correspondente ao quadro 2, mas armazena no buffer o quadro 3.
Quando os quadros 4 e 5 chegam, eles também são inseridos no buffer pela camada de enlace de dados, em vez de serem repassados à camada de
rede.
Eventualmente, o NAK do quadro 2 volta
ao transmissor, que retransmite de imediato o quadro 2. Quando esse
quadro chega, a camada de enlace de dados fica com os quadros 2, 3, 4 e
5, e pode repassar todos à camada de rede na ordem correta. Ela também
pode confirmar todos os quadros até o quadro 5, inclusive, como mostra
a figura. Se o NAK se perder, o transmissor chegará ao timeout correspondente ao quadro 2 e o enviará (e apenas esse quadro) por sua
própria iniciativa, mas isso pode acontecer um pouco mais tarde. Na
realidade, o NAK acelera a retransmissão de um quadro específico.
Bibliografia:
STALLINGS, W. Redes e Sistemas de
Comunicação de Dados. Rio de Janeiro: Campus, 2004.
TANENBAUM, Andrew S. Redes de
Computadores, 4 ed. Rio de
Janeiro: Campus, 2003.
PETERSON, Larry L.; DAVIE, Bruce S. Computer Networks:
A System Approach, 3 ed. USA: Morgan Kaufmann Publishers, 2003. |