欢迎光临散文网 会员登陆 & 注册

可靠UDP-GBN

2023-04-19 11:26 作者:澄一喵  | 我要投稿

声明:以下内容包括代码均为个人记录分享学习历程,受限于个人水平,仅供参考

PS:评论区总是被默认关闭 搞不明白

    书接上文,将停等机制改成基于滑动窗口的流量控制机制,采用固定窗口大小,支持累积确认,完成给定测试文件的传输。 

议设计变动:

图1 协议设计

图2 部分全局定义含义

动窗口(GBN):

图3 客户端GBN
图4 服务器端GBN


计确认+超时重传:

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

    为了展示超时重传,特别在当服务器接收到第一个STR时令主线程暂时休眠2.5S,这个时间超过了客户端超时时间2S,将会触发超时重传。


线程:

图5 客户端线程1
图6 客户端线程2

    服务器端线程十分简单,不多介绍。


错检验:校验和与有效位检查,略

手挥手:不变

件传输:

    客户端,相较于上次,读取文件无变化;将文件发送函数替换为了文件入队函数,不再负责发送文件,并且新增参数ifCont表示是否复用连接。

    服务器端,收到报文后将会自动由服务器接收线程把数据段从接收队列转存到接收缓存区。当所有报文确认传输无误后后调用文件写入函数,把数据写入给定路径内。


接字初始化:不变


行细节补充:

图8 客户端运行细节
图9 服务器端运行细节

志打印:略

代码:见 https://github.com/BluesPizza/ComputerNetworks 

可靠UDP-GBN的评论 (共 条)

分享到微博请遵守国家法律