📜  滑动窗口协议|第 3 组(选择性重复)(1)

📅  最后修改于: 2023-12-03 15:11:08.868000             🧑  作者: Mango

滑动窗口协议 | 第 3 组(选择性重复)

概述

滑动窗口协议是计算机网络中常用的流量控制和错误恢复协议之一。第 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):])

以上是一个基本的滑动窗口协议的代码片段,实现了发送端和接收端的基本功能。程序员可以根据实际需求进行修改。