📅  最后修改于: 2023-12-03 15:36:43.972000             🧑  作者: Mango
停止并等待 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 协议。