Python Реализация протокола Go-back-N для передачи файлов с использованием связи клиент-сервер через UDP.
Клиент передает один файл в локальный каталог сервера по UDP в ОЧЕНЬ ненадежной сети. Он начинается с чтения фрагментов данных из файла и отправки их в виде пакетов (размером пакета < 1 КБ) на сервер, который подтверждает получение пакетов. Загвоздка в том, что клиентская программа может отправлять на сервер несколько пакетов, не дожидаясь подтверждения, но вынуждена поддерживать окно размера N в диапазоне порядковых номеров неподтвержденных пакетов. Нижняя граница «база» — это порядковый номер самого старого неподтвержденного пакета, а верхняя граница — общий размер окна. Он также поддерживает nextSeqnum, который определяется как порядковый номер отправляемого пакета. С другой стороны, серверная программа сохраняет только порядковый номер следующего по порядку пакета.
Для борьбы с ненадежностью сети этот протокол включает использование порядковых номеров, коммулятивных подтверждений, контрольных сумм и операции тайм-аута/повторной передачи.
Если пакет отброшен, дублирован или доставлен не по порядку, Seqnum полученных пакетов будет не по порядку, то есть несоответствие ожидаемого seqnum и полученного seqnum. Сервер отбрасывает неупорядоченный пакет и повторно отправляет ACK для последнего полученного правильного пакета. На Клиенте происходит событие тайм-аута, которое приводит к повторной передаче всех пакетов, которые были отправлены, но еще не подтверждены.
Если в пакете создается однобитовая ошибка, значение контрольной суммы указывает на то, что пакет поврежден. Клиентская программа вычисляет контрольную сумму данных с помощью хеш-библиотеки и добавляет вычисленное значение к отправленному пакету. Программа Сервера извлекает это значение контрольной суммы, пересчитывает контрольную сумму полученных данных и сравнивает два значения. Если пакет поврежден, сервер отбрасывает его и повторно отправляет последний ACK. Это приводит к повторной передаче поврежденного пакета со стороны клиента.