파일 전송에 사용되는 두 가지 전송 프로토콜에는 TCP와 UDP가 있습니다. UDP는 신뢰할 수 없는 프로토콜인 반면 TCP는 신뢰성, 흐름 제어 및 혼잡 제어를 제공하지만 일부 응용 프로그램에서는 바람직하지 않을 수 있는 명시적인 연결 설정 단계를 갖습니다. 이 프로젝트의 목표는 연결 설정 단계 없이 TCP의 모든 좋은 기능을 갖춘 파일 전송 애플리케이션을 설계하고 구현하는 것입니다.
UDP 서버 및 클라이언트는 다음 헤더 형식을 사용합니다.
서버는 클라이언트로부터 파일 요청을 받습니다. 요청에서 파일 이름을 추출하고 버퍼에 있는 파일의 내용을 가져옵니다. 그런 다음 헤더에서 지원하는 대로 파일을 1450바이트 크기의 청크로 분할합니다.
고려해야 할 두 가지 창 크기가 있습니다.
서버는 혼잡 창 크기와 알려진 창 크기의 최소값까지 파일 세그먼트 전송을 시작합니다. 창의 모든 세그먼트를 보낸 후 승인을 받기를 기다립니다. 전송될 다음 시퀀스 번호보다 작은 시퀀스 번호에 대한 승인이 수신되면 이전 세그먼트 중 일부가 올바르게 수신되지 않았으며 서버가 클라이언트로부터 3개의 중복 승인을 수락했음을 의미합니다. 그런 다음 수신된 승인을 기반으로 다음 시퀀스 번호를 설정합니다. 누적 승인을 받은 후 다음 창에서 세그먼트 전송을 계속합니다. 중복 승인이 수신되면 서버는 올바르게 수신되지 않은 패킷에서 세그먼트를 보내기 시작합니다.
클라이언트가 수신할 패킷과 서버가 수신한 승인에 대한 왕복 시간(RTT)을 추정하기 위한 Jacobson/Karel의 알고리즘을 구현했습니다. 서버가 RTT 내에서 승인을 받지 못하면 해당 패킷을 다시 전송합니다.
의사 코드:
Estimated_RTT = (1-α) Estimated RTT + (α) Sample_RTT
In the original TCP Specification, α=.0125
Jacobson/Karels included a variation component to the calculation for the Estimated_RTT
Estimated_RTT = Estimated_RTT + δ (Sample_RTT-Estimated_RTT)
Deviation = Deviation + δ (|Sample_RTT- Estimated_RTT|- Deviation)
Timeout = μ * Estimated_RTT + φ * Deviation
Typically φ=4, μ = 1, δ is between 0 and 1
서버는 1개의 세그먼트를 전송하여 시작됩니다. 그런 다음 혼잡 제어의 2단계를 따릅니다.
느린 시작: 세그먼트 크기는 제한 시간 내에 수신자가 올바르게 승인할 때까지 기하급수적으로 증가하며 혼잡 창 크기는 64000바이트로 설정된 ssthresh보다 작습니다.
혼잡 회피: 혼잡 창 크기가 ssthresh보다 크거나 같게 되면 혼잡 창 크기가 1 세그먼트 크기만큼 선형적으로 증가합니다.
시간 초과: 위에 제공된 Jacobson/Karel 알고리즘을 사용하여 계산됩니다. 시간 초과가 발생하면 ssthresh는 혼잡 창 값의 절반으로 설정되고 혼잡 창은 1 세그먼트 크기로 재설정됩니다.
vagrant up
그러면 서버와 클라이언트 시스템이 모두 부팅됩니다.
vagrant ssh reliableUDPServer
vagrant ssh reliableUDPClient
make
./Server port advertised_window
서버는 다음 명령줄 인수를 허용합니다.
port : 통신에 사용할 포트 번호
Advertising_window: 승인을 기다리기 전에 서버가 보낼 수 있는 바이트 수
./Client server_host_name port file_name advertised_window
클라이언트는 다음 명령줄 인수를 허용합니다.
포트 및 광고 창: 서버와 동일
server_host_name: 서버의 호스트 이름
file_name: 클라이언트가 요청한 파일 이름
코드가 성공적으로 실행되면 ReliableUDPClient 폴더에서 클라이언트가 요청한 파일을 찾을 수 있습니다.
컴퓨터 네트워킹-하향식 접근 방식