用於傳輸檔案的兩種傳輸協定包括:TCP 和 UDP。 UDP 是一種不可靠的協議,而 TCP 提供可靠性、流量控制和擁塞控制,但它具有明確的連接建立階段,某些應用程式可能不希望這樣做。該專案的目標是設計和實現一個文件傳輸應用程序,該應用程式具有 TCP 的所有良好功能,而無需連接建立階段。
UDP 伺服器和用戶端使用下列標頭格式:
伺服器接收來自客戶端的文件請求。它從請求中提取檔案名稱並獲取緩衝區中的檔案內容。然後,它將檔案分割成標頭支援的 1450 位元組大小的區塊。
有兩種視窗大小需要考慮:
伺服器開始傳送文件段,直到擁塞視窗大小和通告視窗大小中的最小值為止。發送視窗中的所有段後,它等待接收確認。當收到的確認的序號小於要傳送的下一個序號時,則表示先前的某段未正確接收,且伺服器接受來自用戶端的 3 個重複確認。然後它根據收到的確認設定下一個序號。收到累積確認後,它在下一個視窗中繼續發送分段。當收到重複的確認時,伺服器將開始發送未正確接收的資料包中的分段。
實作了 Jacobson/Karel 演算法,用於估計客戶端接收的資料包和伺服器接收的確認的往返時間 (RTT)。如果伺服器在 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 個資料段。然後,擁塞控制分為兩個階段:
慢啟動:段大小呈指數增加,直到在超時時間內被接收方正確確認且擁塞視窗大小小於設定為 64000 位元組的 ssthresh。
壅塞避免:當壅塞視窗大小變得大於或等於 ssthresh 時,壅塞視窗大小線性增加 1 個段大小。
超時:使用上面給出的 Jacobson/Karel 演算法計算。當發生逾時時,ssthresh 設定為擁塞視窗值的一半,並將擁塞視窗重設為 1 個段大小。
vagrant up
這將啟動伺服器和客戶端計算機
vagrant ssh reliableUDPServer
vagrant ssh reliableUDPClient
make
./Server port advertised_window
伺服器接受以下命令列參數:
port:用於通訊的連接埠號
Advertisingd_window:伺服器在等待確認之前允許發送的位元組數
./Client server_host_name port file_name advertised_window
客戶端接受以下命令列參數:
port和advertisement_window:與伺服器相同
server_host_name:伺服器的主機名
file_name:客戶端請求的檔案名
程式碼成功運行後,您將在 ReliableUDPClient 資料夾中找到客戶端請求的檔案。
電腦網路自頂向下方法