可靠UDP-GBN
声明:以下内容包括代码均为个人记录分享学习历程,受限于个人水平,仅供参考
PS:评论区总是被默认关闭 搞不明白
书接上文,将停等机制改成基于滑动窗口的流量控制机制,采用固定窗口大小,支持累积确认,完成给定测试文件的传输。
协议设计变动:


滑动窗口(GBN):


累计确认+超时重传:
服务器端采用累计确认,并选择不对失序后的报文进行缓存。服务器对客户端做出的回复ACK=n,代表已经收到了包括序号n在内的及其之前的所有报文。服务器端重传主要在主函数内,每次收到报文会进行有效性检查,通过有效性检查的报文将检查Seq是否为预期Seq。维护一个计数器countReAck,每当出现非预期Seq报文时,计数器countReAck递增,当计数器递增到countReAck %4==0时触发ACK重传。这样设计的目的是因为累计重传会一次性传回Base之后所有报文,但实际上服务器只需要某一个报文,因此利用计数器来减少冗余回传。
为了展示超时重传,特别在当服务器接收到第一个STR时令主线程暂时休眠2.5S,这个时间超过了客户端超时时间2S,将会触发超时重传。
线程:


服务器端线程十分简单,不多介绍。
差错检验:校验和与有效位检查,略
握手挥手:不变
文件传输:
客户端,相较于上次,读取文件无变化;将文件发送函数替换为了文件入队函数,不再负责发送文件,并且新增参数ifCont表示是否复用连接。

服务器端,收到报文后将会自动由服务器接收线程把数据段从接收队列转存到接收缓存区。当所有报文确认传输无误后后调用文件写入函数,把数据写入给定路径内。
套接字初始化:不变
运行细节补充:


日志打印:略
代码:见 https://github.com/BluesPizza/ComputerNetworks