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

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

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非法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Python编程可以实现GBN(Go-Back-N)协议SR(Selective Repeat)协议,并且可以模拟丢包现象。下面是一个简单的示例: GBN协议实现: 在GBN协议中,发送方可以连续发送多个数据包,并等待确认。如果数据包被丢弃或确认丢失,发送方需要重新发送前面未确认的数据包。 1. 首先,我们可以创建一个发送方和一个接收方的函数来模拟协议的行为。 ```python def sender(window_size): base = 0 next_seq_num = 0 while base < window_size: packet = create_packet(next_seq_num) send(packet) next_seq_num += 1 while True: ack = receive_ack() if ack == base: base += 1 packet = create_packet(next_seq_num) send(packet) next_seq_num += 1 def receiver(): expected_seq_num = 0 while True: packet = receive() if packet.seq_num == expected_seq_num: send_ack(expected_seq_num) expected_seq_num += 1 ``` 2. 我们可以在发送方模拟丢包现象。在发送函数中,添加一个随机数生成器来模拟丢包的情况。 ```python import random def send(packet): if random.random() < 0.2: # 模拟20%的丢包概率 return # 发送数据包的实现 ``` SR协议实现: 在SR协议中,发送方一次只发送一个数据包,并等待相应的确认。如果数据包或确认丢失,发送方会在超时后重新发送该数据包。 1. 同样,我们可以创建一个发送方和一个接收方的函数来模拟SR协议的行为。 ```python def sender(): next_seq_num = 0 while True: packet = create_packet(next_seq_num) send(packet) ack = receive_ack() if ack == next_seq_num: next_seq_num += 1 def receiver(): expected_seq_num = 0 while True: packet = receive() if packet.seq_num == expected_seq_num: send_ack(expected_seq_num) expected_seq_num += 1 ``` 2. 同样,在发送方模拟丢包现象。在发送函数中,添加一个随机数生成器来模拟丢包的情况。 ```python import random def send(packet): if random.random() < 0.2: # 模拟20%的丢包概率 return # 发送数据包的实现 ``` 通过在发送方模拟丢包现象,我们可以测试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、付费专栏及课程。

余额充值