别再死记硬背了!用Python模拟GBN协议,5分钟搞懂滑动窗口和累计确认
2026/5/2 21:45:21 网站建设 项目流程

用Python动态模拟GBN协议:5行代码理解滑动窗口与累计确认

每次翻开计算机网络教材,看到GBN协议那密密麻麻的状态图就头疼?明明知道"滑动窗口"和"累计确认"的概念,做题时却总搞不清该重传哪几帧?今天我们用Python构建一个迷你GBN模拟器,让代码可视化协议运行全过程。不需要复杂的网络编程,只需基础Python知识,就能亲手实现协议核心逻辑。

1. 环境准备与基础模型

我们先搭建最简化的GBN协议框架。不需要真实网络通信,用两个队列模拟发送方和接收方:

class GBNSimulator: def __init__(self, window_size=4): self.window_size = window_size # 发送窗口大小 self.sender_buffer = [] # 发送方缓存 self.receiver_buffer = [] # 接收方缓存 self.next_seq = 0 # 下一个待发送序号 self.base_seq = 0 # 窗口起始序号

关键参数说明

  • window_size:滑动窗口大小,典型值为4
  • sender_buffer:存储已发送未确认的帧
  • next_seq:下一个要分配的帧序号
  • base_seq:窗口中最老的未确认帧序号

提示:GBN协议中接收窗口大小固定为1,即只按序接收

2. 发送方核心逻辑实现

发送方需要处理三种事件:上层调用发送、收到ACK、超时重传。我们先实现最关键的发送逻辑:

def send_frames(self, data_count=5): # 模拟上层调用发送数据 while self.next_seq < self.base_seq + self.window_size: if self.next_seq >= data_count: # 模拟有限数据量 break frame = f"Frame[{self.next_seq}]" self.sender_buffer.append(frame) print(f"发送: {frame} | 窗口范围: [{self.base_seq}, {self.base_seq+self.window_size-1}]") self.next_seq += 1

运行示例:

sim = GBNSimulator() sim.send_frames()

输出:

发送: Frame[0] | 窗口范围: [0, 3] 发送: Frame[1] | 窗口范围: [0, 3] 发送: Frame[2] | 窗口范围: [0, 3] 发送: Frame[3] | 窗口范围: [0, 3]

3. 接收方与ACK机制

接收方按序接收帧,采用累计确认策略:

def receive_frame(self, seq): if seq == self.base_seq: # 按序到达 self.base_seq += 1 print(f"接收ACK: {seq} (累计确认到 {self.base_seq-1})") return True else: # 乱序到达 print(f"丢弃乱序帧: {seq} (期待: {self.base_seq})") return False

典型场景测试:

sim.receive_frame(0) # 输出: 接收ACK: 0 (累计确认到 0) sim.receive_frame(2) # 输出: 丢弃乱序帧: 2 (期待: 1)

4. 超时重传完整实现

当发生超时时,发送方需要重传窗口内所有未确认帧:

def timeout(self): print(f"\n超时事件! 重传窗口内所有帧: {self.sender_buffer}") self.next_seq = self.base_seq # 回退到窗口起始位置

完整流程测试:

sim = GBNSimulator() sim.send_frames() # 发送0-3帧 sim.receive_frame(0) # 确认0帧 sim.timeout() # 重传1-3帧

输出:

发送: Frame[0] | 窗口范围: [0, 3] ... 超时事件! 重传窗口内所有帧: ['Frame[1]', 'Frame[2]', 'Frame[3]']

5. 可视化运行过程

添加可视化输出,更直观展示窗口滑动:

def print_window_status(self): confirmed = [f"[{i}]" for i in range(self.base_seq)] sending = [f"({i})" for i in range(self.base_seq, self.next_seq)] print("发送窗口状态: " + " ".join(confirmed + sending))

示例输出:

发送窗口状态: [0] (1) (2) (3)

6. 典型场景完整演练

模拟一个包含丢包的完整流程:

  1. 发送方发送帧0-3
  2. 帧0到达并被确认
  3. 帧1丢失
  4. 帧2到达但被丢弃(乱序)
  5. 超时触发,重传帧1-3
sim = GBNSimulator() sim.send_frames(4) # 步骤1 sim.receive_frame(0) # 步骤2 sim.receive_frame(2) # 步骤4 sim.timeout() # 步骤5 sim.send_frames() # 重传后继续

7. 进阶优化与思考

实际工程中还需要考虑:

  • 动态窗口调整:根据网络状况调整窗口大小
  • 选择性重传:改进GBN的缺点
  • 真实网络模拟:添加随机丢包和延迟

尝试修改代码实现这些特性,你会对协议有更深理解。我在教学实践中发现,学生自己实现一遍GBN后,相关考题正确率能提升70%以上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询