📜  停止并等待 ARQ(1)

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

停止并等待 ARQ

停止并等待 ARQ(Stop-and-Wait Automatic Repeat Request)是一种简单、可靠的传输协议,通常用于低速传输环境,比如串口通信、红外线通信等。

在停止并等待 ARQ 中,发送方每次只发送 1 个数据包,并等待接收方确认收到后再发送下一个数据包。若接收方未能正确接收数据包,则回复一个 NAK(Negative Acknowledgement)信号,发送方将重新发送相同的数据包。若接收方正确接收数据包,则回复一个 ACK(Acknowledgement)信号,发送方将继续发送下一个数据包。

停止并等待 ARQ 的优点是实现简单,不需要高级的错误控制算法,适用于传输并不频繁的小型数据包。然而它的缺点也很显然,每次只能发送 1 个数据包,效率低下,而且容易被网络延迟、噪声等因素影响,造成等待时间过长或重复发送的情况。

下面是一个简单的停止并等待 ARQ 的 Python 代码示例:

import socket

server_address = ('localhost', 10000)
data_payload = 2048
max_retry = 3

def send_packet(packet, expected_ack):
    tries = 0
    while tries < max_retry:
        sock.sendto(packet, server_address)  # 发送数据包
        sock.settimeout(1.0)  # 设置接收超时时间
        try:
            ack, address = sock.recvfrom(data_payload)  # 接收 ACK 信号
            if ack == expected_ack:  # 收到正确的 ACK 信号
                sock.settimeout(None)  # 取消接收超时时间
                return True
        except socket.error:  # 接收超时或其他错误
            pass
        tries += 1
    sock.settimeout(None)  # 取消接收超时时间
    return False

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

with open('data.bin', 'rb') as f:
    data = f.read()

seq_num = 0
while data:
    packet = bytes([seq_num]) + data[:data_payload]  # 构造数据包
    if send_packet(packet, bytes([1 - seq_num])):  # 发送数据包并等待 ACK 信号
        seq_num = 1 - seq_num
        data = data[data_payload:]  # 发送成功,继续发送下一个数据包

这个代码示例使用了 Python 的 socket 模块,通过 UDP 协议发送数据包和接收 ACK 信号,并设置了最大重试次数和超时时间,以保证传输的可靠性和正确性。我们可以根据这个示例来实现自己的停止并等待 ARQ 协议。