1. 为什么我们需要连续ARQ协议?
在计算机网络的数据链路层中,错误控制是保证可靠传输的核心机制。想象一下你正在给朋友发一长串短信,如果每次发送后都要等待对方回复"收到"才能发下一条,这种"发一条等一次"的方式效率有多低下?这就是最基本的停止等待协议(Stop-and-Wait ARQ)的工作方式。
我在实际网络调试中发现,当网络延迟较高时(比如跨洋通信),这种简单协议的吞吐量会急剧下降。有次在调试中美服务器间的数据传输时,RTT(往返时间)高达300ms,即使信道带宽有100Mbps,实际有效吞吐量却不到1Mbps——99%的时间信道都处于空闲状态!
连续ARQ协议正是为了解决这个根本性效率问题而诞生的。它允许发送方在未收到确认的情况下连续发送多个数据帧,就像快递员可以一次带多个包裹出门,而不必每送一个就回站点报到一次。根据实现方式的不同,连续ARQ又分为回退N帧(Go-Back-N)和选择重传(Selective Repeat)两种主要变体。
关键区别:停止等待协议每次只能有一个未确认帧在空中传输,而连续ARQ通过滑动窗口机制允许同时存在多个传输中的帧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 连续ARQ的核心工作机制
2.1 滑动窗口:协议的心脏
滑动窗口是连续ARQ的灵魂所在。发送窗口(Sender Window)和接收窗口(Receiver Window)就像两个协同工作的闸门:
- 发送窗口大小(Ws)决定了能连续发送的未确认帧最大数量
- 接收窗口大小(Wr)决定了接收方能缓存的乱序帧数量
在Go-Back-N中,Wr固定为1,意味着接收方只能按顺序接受帧。任何乱序到达的帧都会被直接丢弃,导致发送方必须回退重传整个窗口。而Selective Repeat允许Wr>1,接收方可以缓存乱序帧,只需请求重传特定丢失帧。
我在实验室用Wireshark抓包分析时,曾看到这样的序列:
code复制发送方: 帧1 | 帧2 | 帧3 | 帧4 | 帧5
接收方: ACK1 | 帧2丢失 | ACK3(被丢弃) | 超时后重传帧2-5
这就是典型的Go-Back-N行为——尽管帧3到达了,但因为帧2丢失,整个窗口都要回退。
2.2 序列号空间的数学约束
序列号位数(n)与窗口大小存在严格数学关系:
- Go-Back-N要求 Ws ≤
