Python UDP を介したクライアント サーバー通信を使用したファイル転送のための Go-back-N プロトコルの実装。
クライアントは、非常に信頼性の低いネットワーク上の UDP 経由で単一のファイルをサーバーのローカル ディレクトリに転送します。これは、ファイルからデータのチャンクを読み取り、それらをパケット (パケットサイズ < 1KB) としてサーバーに送信し、サーバーが受信したパケットを確認することから始まります。問題は、クライアント プログラムは確認を待たずに複数のパケットをサーバーに送信できるものの、確認されていないパケットのシーケンス番号の範囲にわたってサイズ N のウィンドウを維持するように制約されることです。下限の「base」は最も古い未確認パケットのシーケンス番号で、上限は合計 windowSize です。また、送信されるパケットのシーケンス番号として定義される nextSeqnum も維持します。一方、サーバー プログラムは、次の順序のパケットのシーケンス番号のみを維持します。
ネットワークの信頼性の低さに対処するために、このプロトコルにはシーケンス番号、共通確認応答、チェックサム、およびタイムアウト/再送信操作の使用が組み込まれています。
パケットがドロップされたり、複製されたり、順序が狂って配信された場合、受信されたパケットの Seqnum は順序が狂います。つまり、期待される Seqnum と受信された Seqnum が一致しません。サーバーは、順序が乱れたパケットを破棄し、最後に受信した順序どおりのパケットに対する ACK を再送信します。タイムアウト イベントがクライアントで発生すると、送信されたもののまだ確認されていないすべてのパケットが再送信されます。
パケット内でシングル ビット エラーが発生した場合、チェックサムの値はパケットが破損していることを示します。クライアント プログラムは、ハッシュ ライブラリを使用してデータのチェックサムを計算し、計算された値を送信されるパケットに追加します。サーバー プログラムはこのチェックサム値を抽出し、受信したデータのチェックサムを再計算し、2 つの値を比較します。パケットが破損している場合、サーバーはパケットを破棄し、最後の ACK を再送信します。これにより、クライアント側から破損したパケットが再送信されます。