por chipselect » 13 Dez 2006 18:13
gibim
Infelizmente o material sobre esse algoritmo você vai encontrar mais em literaturas sobre redes de computadores, prinicpalmente no protocolo TCP.
O que eu fiz foi pegar o algoritmo, simplificar no máximo e implementar numa CPU Toshiba de 16 bits.
Agora estou simplificando mais ainda para por num 89C52.
Você não precisa implementar toda a janela deslizante no 8051, basta implementar a comunicação com pacotes e o sistema de confirmação de dados.
Janela deslizante define a transmissão de dados por pacotes de dados e confirmação do recebimento desses pacotes, sendo que esses pacotes são numerados sequencialmente, tanto no sentido disp1 -> disp2 como no sentido disp2 -> disp1.
Quando um dispositivo quer transmitir, ele fica enviando o(s) pacote(s) de dados até obter a cofirmação de recebimento de todos os pacotes. O número de pacotes que o transmissor pode enviar antes de receber a confirmação do primeiro pacote é o tamanho da janela. O transmissor enviou o número de pacotes máximo (janela), e não recebeu nenhuma confirmação ainda, o transmissor "espera" um tempo pra ver se recebe alguma coisa, e se não receber, ele retransmite tudo de novo.
Somente após receber a confirmação do primeiro pacote que o transmissor inclui o próximo pacote ainda não transmitido na janela, removendo da janela o pacote confirmado.
O dispositivo que recebe os pacotes, verifica a integridade (checksum) do pacote e, se tudo estiver ok, processa o pacote e envia uma confirmação que o pacote foi recebido. Obviamente isso acontece se a integridade do pacote estiver ok e se o pacote estiver na sequencia correta de numeração que o transmissor estava enviando.
O receptor não precisa enviar um pacote de "Go back(n)" ou de erro para pacotes inválidos ou com checksum inválidos. O pacote que foi perdido nessa situação será retransmitido pelo transmissor, já que ele não receberá uma confirmação do pacote. Isso irrá acontecer até o receptor receber direito o pacote ou o transmissor "se cansar" de enviar o pacote.
O numero de sequencia do pacote enviado pelo transmissor permite que o receptor identifique se o pacote já foi recebido, se é o pacote esperado ou se é um pacote que está na frente do pacote esperado.
No caso de receber pacotes que já foram recebidos, o receptor envia a confirmação dos pacotes recebidos sem reprocessar o pacote, obviamente. No caso de receber um pacote na frente do que realmente deveria receber (pulou un(s) pacotes, por exemplo), o receptor manda um pacote de "Go back(n)" onde o "n" permite definir o número de pacote que deveria receber. Nesse caso o transmissor volta a transmitir a partir desse tal "n".
O "Go back(n)" pode ser opcional, uma vez que o transmissor irá retransmitir todos os pacotes cuja confirmação ele não recebeu após um intervalo de tempo.
Obviamente os pacotes enviados do receptor ao transmissor também são numerados. Você pode fazer a confirmação e a numeração de pacotes de muitas maneiras. Por exemplo, pacotes de confirmação não precisariam respeitar a numeração de sequencia, mas conteriam o número de pacote recebido com sucesso da mesma forma.
Para iniciar a comunicação, a numeração dos pacotes tem que começar com algum valor, e se no meio da comunicação, uma falha grave ocorrer, os dois dispositivos devem ter suas numerações de pacotes "ressincronizados". Para isso eu uso um pacote especial que não precisa obedecer o sequenciamento de pacotes, e ele causa o cancelamento de qualquer comunicação para reiniciar uma nova, sincronizando a numeração de pacotes.