Implementación en Python del protocolo Go-back-N para la transferencia de archivos mediante comunicación cliente-servidor a través de UDP.
El cliente transfiere un único archivo al directorio local del servidor a través de UDP en una red MUY poco confiable. Comienza leyendo fragmentos de datos de un archivo y enviándolos como paquetes (tamaño de paquete <1 KB) al servidor que acusa recibo de los paquetes recibidos. El problema es que el programa cliente puede enviar múltiples paquetes al servidor sin esperar un reconocimiento, pero está obligado a mantener una ventana de tamaño N en un rango de números de secuencia de paquetes no reconocidos. El límite inferior 'base' es el número de secuencia del paquete más antiguo no reconocido y el límite superior es el tamaño de ventana total. También mantiene el nextSeqnum que se define como el número de secuencia del paquete que se enviará. Por otro lado, el programa servidor mantiene únicamente el número de secuencia del siguiente paquete en orden.
Para combatir la falta de confiabilidad de la red, este protocolo incorpora el uso de números de secuencia, acuses de recibo acumulativos, sumas de verificación y una operación de tiempo de espera/retransmisión.
Si un paquete se descarta, se duplica o se entrega fuera de orden, el número de secuencia de los paquetes recibidos estará desordenado; es decir, el número de secuencia esperado y el número de secuencia recibido no coinciden. El servidor descarta el paquete fuera de servicio y reenvía un ACK por el paquete en orden recibido más recientemente. Se produce un evento de tiempo de espera en el Cliente que conduce a la retransmisión de todos los paquetes que se han enviado pero que aún no han sido reconocidos.
Si se crea un error de un solo bit dentro de un paquete, el valor de Checksum indica que el paquete está dañado. El programa Cliente calcula la suma de verificación de los datos utilizando la biblioteca hash y agrega el valor calculado al paquete enviado. El programa del servidor extrae este valor de suma de verificación, vuelve a calcular la suma de verificación de los datos recibidos y compara los dos valores. Si el paquete está dañado, el servidor lo descarta y reenvía el último ACK. Esto conduce a la retransmisión del paquete dañado desde el lado del cliente.