📜  滑动窗口协议 |第 2 组(接收方)(1)

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

滑动窗口协议 |第 2 组(接收方)

本文将介绍滑动窗口协议在接收方的实现。滑动窗口协议是一种网络通信协议,用于确保数据的可靠传输。本文中涉及的滑动窗口是指一定范围内的数据包。当接收方收到数据包时,它会确认该数据包已成功接收,然后它会向发送方发送一个确认消息。

滑动窗口协议的工作原理

滑动窗口协议通过将接收方的缓存分为一个固定大小的、连续的窗口,实现了流量控制和可靠性传输。它的主要工作流程如下:

  1. 发送方将数据分成若干个数据包,并对每个数据包进行编号。
  2. 发送方将数据包发送给接收方。
  3. 接收方收到数据包后,确认该数据包已成功接收,并向发送方发送一个确认消息。
  4. 发送方在接收到确认消息后,将下一批数据包发送给接收方。

滑动窗口协议中,发送方和接收方都有一个滑动窗口。发送方的滑动窗口表示还可以发送多少数据包,而接收方的滑动窗口表示还可以接收多少数据包。

滑动窗口协议的实现

滑动窗口协议在接收方的实现比较简单。接收方需要维护以下数据结构:

  1. 接收缓冲区:用于存储接收到的数据包。
  2. 已接收的数据包编号:表示已经成功接收的数据包编号。
  3. 窗口大小:表示接收方的滑动窗口大小。
  4. 下一次期望接收的数据包编号:表示下一次期望接收的数据包的编号。

接收方的主要工作步骤如下:

  1. 接收数据包。
  2. 如果接收到的数据包的编号等于下一次期望接收的数据包编号,则将该数据包存入接收缓冲区,并将下一次期望接收的数据包编号加1。
  3. 发送确认消息,确认已成功接收到该数据包。
  4. 接收方会在接收到 ACK 消息之后,将已接收的数据包编号更新为确认消息中的编号。
  5. 如果接收到的数据包的编号小于下一次期望接收的数据包编号,则说明这个数据包已经被接收过,不需要再次确认。

下面是一个具体的例子,使用Python实现。此处只是简化的展示实现的主要部分。

class Receiver(object):
    def __init__(self, window_size):
        self.window_size = window_size
        self.rcv_buffer = {}  # 接收缓存区
        self.next_seq_num = 0  # 下一个期望接收数据包的编号
        self.acked_seq_num = 0  # 已接收数据包的最大编号

    def receive(self, packet):
        """接收数据包"""
        seq_num, data = packet  # seq_num 表示数据包的编号,data 表示数据内容
        if seq_num >= self.next_seq_num and (self.next_seq_num + self.window_size) > seq_num:
            # 如果当前接收到的数据包是期望接收的数据包,并且接收窗口还有空间
            self.rcv_buffer[seq_num] = data  # 存储数据到接收缓冲区
            self.send_ack(seq_num)  # 发送确认消息
            self.next_seq_num += 1  # 更新期望接收的数据包编号
            # 将接收缓存区中连续的数据包移动到已接收数据包列表中
            while self.acked_seq_num + 1 in self.rcv_buffer:
                self.acked_seq_num += 1
                del self.rcv_buffer[self.acked_seq_num]

    def send_ack(self, ack_num):
        """发送确认消息"""
        pass # 省略具体实现
总结

滑动窗口协议是一种广泛使用的可靠传输协议。它通过将接收方的缓存分为一个固定大小的、连续的窗口,实现了流量控制和可靠性传输。接收方的实现比较简单,只需要维护一个接收缓冲区和一些状态变量即可。