📅  最后修改于: 2023-12-03 15:11:08.868000             🧑  作者: Mango
滑动窗口协议是计算机网络中常用的流量控制和错误恢复协议之一。第 3 组滑动窗口协议采用了选择性重复的方式进行错误恢复,可以有效地解决网络传输中的错误问题。
滑动窗口协议的原理是,在发送端和接收端之间维护一个类似于缓冲区的窗口,窗口的大小表示发送方可以连续发送的数据包数量。如果数据包丢失或者损坏,接收端会发送一个 NAK(Negative Acknowledgement),发送端会重新发送该数据包。
在第 3 组滑动窗口协议中,发送方和接收方都维护了一个窗口。发送方限制了窗口内的数据包数量,如果窗口内的数据包都被确认收到,则窗口会向前滑动一段距离,发送方会发送新的数据包。接收方在收到数据包后,会将该数据包的编号发送给发送方,表示已经成功接收到该数据包。如果数据包损坏或丢失,则接收方会向发送方发送 NAK 消息,表示需要重传该数据包。发送方则会重新发送该数据包,知道接收方成功接收。
选择性重复是指,在接收方收到数据包后,不一定要立即进行确认操作,可以先存储起来,等待后续数据包的到来。如果一个或多个数据包丢失,则接收方只需要对这些已经收到但尚未确认的数据包发送 NAK 消息,发送方只需要重新发送这些数据包即可。
选择性重复的方式能够避免对已经正确接收的数据包再次进行传输,减小了网络带宽的浪费。滑动窗口协议能够保证数据的可靠传输和控制流量,使得网络传输更加高效和可靠。
def send_packet(packet):
# 发送数据包
pass
def receive_packet():
# 接收数据包
pass
def send_window(window):
# 发送窗口内的数据包
for packet in window:
send_packet(packet)
def receive_window(window):
# 接收窗口内的数据包
received_packets = []
for i in range(len(window)):
packet = receive_packet()
received_packets.append(packet)
# 确认已经接收到的数据包
acknowledged_packets = []
for packet in received_packets:
ack = receive_acknowledgement(packet)
if ack:
acknowledged_packets.append(packet)
# 发送 NAK 消息,请求重传数据包
missing_packets = [p for p in window if p not in acknowledged_packets]
for packet in missing_packets:
send_nak(packet)
retransmit_packet(packet)
# 滑动窗口,继续发送数据包
send_window(window[len(acknowledged_packets):])
以上是一个基本的滑动窗口协议的代码片段,实现了发送端和接收端的基本功能。程序员可以根据实际需求进行修改。