Implementação em Python do protocolo Go-back-N para transferência de arquivos usando comunicação cliente-servidor via UDP.
O cliente transfere um único arquivo para o diretório local do servidor através de UDP em uma rede MUITO não confiável. Ele começa lendo pedaços de dados de um arquivo e enviando-os como pacotes (tamanho do pacote <1 KB) para o servidor que reconhece os pacotes recebidos. O problema é que o programa cliente pode enviar vários pacotes ao servidor sem esperar por uma confirmação, mas é limitado a manter uma janela de tamanho N em um intervalo de números de sequência de pacotes não confirmados. O limite inferior 'base' é o número de sequência do pacote não reconhecido mais antigo e o limite superior é o tamanho total da janela. Ele também mantém o nextSeqnum que é definido como o número de sequência do pacote a ser enviado. Por outro lado, o programa servidor mantém apenas o número de sequência do próximo pacote em ordem.
Para combater a falta de confiabilidade da rede, este protocolo incorpora o uso de números de sequência, confirmações comulativas, somas de verificação e uma operação de tempo limite/retransmissão.
Se um pacote for descartado, duplicado ou entregue fora de ordem, o Seqnum dos pacotes recebidos estará fora de ordem - que é o seqnum esperado e a incompatibilidade do seqnum recebido. O servidor descarta o pacote fora de ordem e reenvia um ACK para o pacote fora de ordem recebido mais recentemente. Ocorre um evento de timeout no Cliente que leva à retransmissão de todos os pacotes que foram enviados, mas ainda não foram reconhecidos.
Se um erro de bit único for criado em um pacote, o valor de Checksum indica que o pacote está corrompido. O programa Cliente calcula a soma de verificação dos dados usando a biblioteca hash e anexa o valor calculado ao pacote enviado. O programa Servidor extrai esse valor da soma de verificação, recalcula a soma de verificação nos dados recebidos e compara os dois valores. Se o pacote estiver corrompido, o servidor descarta o pacote e reenvia o último ACK. Isto leva à retransmissão do pacote corrompido do lado do cliente.