GBN(Go-Back-N)协议的python本机模拟实现-计算机网络
warning:
这篇文章距离上次修改已过191天,其中的内容可能已经有所变动。
import random
def go_back_n_receiver(window_size):
"""
实现GBN接收方的模拟
:param window_size: 接收窗口大小
:return: 输出丢失的分组序号和重传的分组序号
"""
expected_sequence = 0 # 期望的下一个序号
received_packets = [] # 已接收的分组序号列表
lost_packets = [] # 丢失的分组序号列表
retransmitted_packets = [] # 重传的分组序号列表
while True:
sequence = random.randint(0, window_size - 1) # 模拟收到的分组序号
if sequence not in received_packets: # 如果分组未重复
received_packets.append(sequence) # 加入接收列表
received_packets.sort() # 排序以便于处理
# 如果序号正确,输出信息
if sequence == expected_sequence:
print(f"Received packet: {sequence}")
expected_sequence = (expected_sequence + 1) % (window_size + 1)
else:
# 如果序号不正确且不在接收窗口内,则为丢失分组
if sequence not in range(expected_sequence, expected_sequence + window_size):
lost_packets.append(sequence)
print(f"Lost packet: {sequence}")
# 如果是重复分组,则为重传分组
else:
retransmitted_packets.append(sequence)
print(f"Retransmitted packet: {sequence}")
return lost_packets, retransmitted_packets
# 使用示例
lost_packets, retransmitted_packets = go_back_n_receiver(window_size=5)
print(f"Lost packets: {lost_packets}")
print(f"Retransmitted packets: {retransmitted_packets}")
这段代码模拟了GBN协议中接收方的行为。它随机生成分组序号,并将其与期望的序号进行比较。如果序号正确,输出接收信息;如果序号不正确且不在接收窗口内,则记为丢失分组;如果是重复分组,则记为重传分组。最后返回丢失的分组序号和重传的分组序号。
评论已关闭