UDP를 통한 클라이언트 서버 통신을 사용하여 파일 전송을 위한 Go-back-N 프로토콜의 Python 구현입니다.
클라이언트는 매우 신뢰할 수 없는 네트워크에서 UDP를 통해 단일 파일을 서버의 로컬 디렉터리로 전송합니다. 이는 파일에서 데이터 청크를 읽고 이를 수신된 패킷을 확인하는 서버에 패킷(패킷 크기 < 1KB)으로 보내는 것으로 시작됩니다. 문제는 클라이언트 프로그램이 승인을 기다리지 않고 여러 패킷을 서버에 보낼 수 있지만 승인되지 않은 패킷의 시퀀스 번호 범위에 걸쳐 크기 N의 창을 유지하도록 제한된다는 것입니다. 하한 '기본'은 가장 오래된 확인되지 않은 패킷의 시퀀스 번호이고 상한은 전체 windowSize입니다. 또한 전송할 패킷의 시퀀스 번호로 정의된 nextSeqnum을 유지 관리합니다. 반면, 서버 프로그램은 다음 순서의 패킷의 시퀀스 번호만 유지합니다.
네트워크의 불안정성을 해결하기 위해 이 프로토콜은 시퀀스 번호, 상호 승인, 체크섬 및 시간 초과/재전송 작업의 사용을 통합합니다.
패킷이 삭제, 복제 또는 순서 없이 전달되면 수신된 패킷의 Seqnum이 순서에 맞지 않게 됩니다. 즉, 예상된 seqnum과 수신된 seqnum이 일치하지 않습니다. 서버는 순서가 잘못된 패킷을 버리고 가장 최근에 수신된 순서대로 패킷에 대한 ACK를 다시 보냅니다. 전송되었지만 아직 확인되지 않은 모든 패킷의 재전송으로 이어지는 시간 초과 이벤트가 클라이언트에서 발생합니다.
패킷 내에서 단일 비트 오류가 생성되면 체크섬 값은 패킷이 손상되었음을 나타냅니다. 클라이언트 프로그램은 해시 라이브러리를 사용하여 데이터의 체크섬을 계산하고 계산된 값을 전송된 패킷에 추가합니다. 서버 프로그램은 이 체크섬 값을 추출하고 수신된 데이터에 대한 체크섬을 다시 계산한 후 두 값을 비교합니다. 패킷이 손상된 경우 서버는 패킷을 삭제하고 마지막 ACK를 다시 보냅니다. 이로 인해 클라이언트 측에서 손상된 패킷이 재전송됩니다.