GBN协议和SR协议关于窗口大小的分析

文章探讨了GBN(Go-Back-N)和SR(Stop-and-Wait)协议在不同窗口大小设置下的行为。当GBN协议中WT等于2^n时,可能会导致重复帧的错误接收。而在SR协议中,通常假设WT等于WR,但如果WT大于2^n-1,接收方可能接收到重复帧,造成传输错误。在没有大前提的情况下,WR+WT大于2^n也是非法的,因为会导致帧识别问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章最新内容请移步原文地址

n表示用于帧编号的比特数

GBN协议

结论

1<WT<=2n-1,WR=1

WT=2n会怎么样

假设此时n为3,WT=8,W=1,若此时发送窗口[0,1,2,3,4,5,6,7],接收窗口[0];

接收窗口成功接收到了帧编号0~7共计7个数据帧,接收方窗口向前移动为7个帧单位变为又变为了[0],接收方发送这7个数据帧相对应的确认帧;

但是由于某种原因,发送方没有收到这7个确认帧,于是在定时器超时之后发送方选择重传这7个数据帧;

接收方在再次收到这7个数据帧时,由于帧(1,2,3,4,5,6,7)落在接收窗口外于是被拒绝,而帧(0)被再次接受,于是会错误的接收这1个重复帧,导致传输出错。

SR协议

在讨论SR协议的窗口大小时,我们一般会定义一个大前提:接收方窗口和发送方窗口的大小通常是相同的。(做题时一般默认有大前提,除非题目给定了WT>2n-1
接下来我们根据有无这个大前提来分析一下SR协议下发送窗口和接收窗口的尺寸大小问题

有大前提

结论

WT=WR<=2n-1

大于2n-1会怎么样

在有大前提的情况下,发送窗口尺寸WT和接收窗口尺寸WR总是相同,假设此时n为3,WT=WR=5,若此时发送窗口[0,1,2,3,4],接收窗口[0,1,2,3,4];

接收窗口成功接收到了帧编号0~4共计五个数据帧,接收方窗口向前移动为[5,6,7,0,1,2],接收方发送这五个数据帧相对应的确认帧;

但是由于某种原因,发送方没有收到这五个确认帧,于是在定时器超时之后发送方选择重传这五个数据帧;

接收方在再次收到这五个数据帧时,由于帧(0,1,2)落在接收窗口内,于是会错误的接收这三个重复帧,导致传输出错。

无大前提

结论

WR<=WT且WR+WT<=2n

WR>WT

接收窗口总有窗口资源被浪费

WR+WT>2n

已知WR>WT非法,因此我们只讨论WR<=WT下WR+WT>2n的情况。由于WR<=WT,若要WR+WT>2n,则WT>2n-1,结合有大前提情况下大于2n-1的分析,容易有也会出现接收方无法分辨新帧和旧帧的情况,因此WR+WT>2n非法。

### SR GBN 协议中的窗口大小 #### Go-Back-N (GBN) 的窗口大小 在Go-Back-N协议中,发送方可以连续发送多个帧而无需等待确认。然而,如果任何一个帧丢失或损坏,则必须重传该帧以及后续所有未被确认的帧。因此,在这种情况下,窗口大小决定了能够一次性发出多少个未经确认的数据包。 对于GBN而言,其窗口尺寸通常受到两个因素的影响: 1. **网络特性**:包括但不限于链路质量、传播延迟等; 2. **应用需求**:比如实时性要求较高的应用程序可能倾向于较小的窗口以减少潜在的重发数量;反之则可适当增大窗口提高吞吐量[^1]。 具体来说,为了最大化利用带宽并保持较低的平均往返时间(RTT),理想状态下的最大窗口长度应等于带宽延时乘积(BDP)除以单个报文段的最大传输单元(MTU)大小的结果向上取整后的值。 ```python import math def calculate_gbn_window_size(bandwidth_delay_product, mtu): """ 计算适合于给定BDP条件下的最优GBN窗口大小 参数: bandwidth_delay_product : float 带宽数值 * 往返延迟(s) mtu : int 最大传输单位(byte) 返回: window_size : int 推荐使用的GBN窗口大小 """ return math.ceil(bandwidth_delay_product / mtu) ``` #### Selective Repeat (SR) 的窗口大小 Selective Repeat允许接收者只请求重新传送那些确实已丢失的消息,并且维持一个滑动窗口用于跟踪哪些消息已被成功接收到。这使得它能够在处理丢包方面更加高效——即使某些中间位置出现了问题也只需针对这些特定部分执行修复操作即可。 关于SR协议下合理的窗口设定原则如下: - 发送端与接收端各自维护相同规模但相互独立的工作区间; - 此工作区间的宽度应当不超过可用缓冲空间的一半,从而确保即便最坏情形发生(即整个当前批次都需重试),仍留有足够的储备容量接纳新到来的信息流而不至于溢出; - 类似地,考虑到实际通信环境中的不确定性波动情况,建议依据预期峰值负载来规划这一参数的具体数值范围。 ```python def suggest_sr_window_boundaries(buffer_capacity): """ 提供适用于指定缓存能力的选择重播机制两端窗口界限指导方针 参数: buffer_capacity : int 总体存储上限 返回: tuple : 包含最小推荐值最大推荐值在内的元组形式结果集 """ min_recommendation = max(1, buffer_capacity // 4) max_recommendation = buffer_capacity // 2 return (min_recommendation, max_recommendation) ``` 综上所述,虽然两者都是通过调整各自的“视窗”来进行流量控制,但是由于它们对待错误恢复的不同策略导致了不同的设计考量点。相较于GBN简单粗暴式的全部回滚方式,SR显然提供了更为精细灵活的服务选项,尤其是在面对复杂多变的真实世界应用场景之时表现尤为突出。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

red-fox-yj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值