用于传输文件的两种传输协议包括: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 文件夹中找到客户端请求的文件。
计算机网络自顶向下方法