第一次接触连续ARQ协议是在大学网络实验室,当时用两台老旧主机搭建点对点通信,传输大文件时频繁卡顿。教授指着抓包数据说:"看这里,传统停等协议就像用滴管接水,而连续ARQ是开了水龙头。"这个比喻让我记到现在。
连续自动重传请求(Automatic Repeat reQuest)协议是数据链路层的流量控制核心机制,解决了停等协议信道利用率低下的痛点。想象高速公路收费站:停等协议是每过一辆车就放下栏杆确认,而连续ARQ允许N辆车连续通过后再批量确认。这个"N"就是著名的滑动窗口大小,它直接决定了信道的吞吐量。
发送窗口和接收窗口就像配合默契的装卸工人。发送方维护一个发送窗口(通常用环形缓冲区实现),窗口内的帧可以连续发送而不需等待确认。接收方则通过接收窗口控制缓存空间,用ACK确认帧的正确接收。
窗口大小需要精心设计:
**回退N帧(GBN)**就像严厉的老师:发现第5题错了,就要从第5题开始全部重做。具体实现:
**选择重传(SR)**则更智能化:
实测对比:在1%丢包率的100Mbps链路上,SR比GBN吞吐量高30%以上,但实现复杂度也显著增加。
每个发送帧都需要独立的超时计时器?那会耗尽系统资源。工程实践中常用:
c复制struct sk_buff {
u32 retransmit_timeout;
struct timer_list retransmit_timer;
};
我曾调试过一个诡异bug:传输大文件时每隔255MB就崩溃。原因竟是:
解决方案参考TCP的32位序列号,或使用时间戳扩展(如TSN)。
| 现象 | 可能原因 | 排查工具 |
|---|---|---|
| 吞吐量周期性下降 | 窗口尺寸设置不当 | Wireshark统计窗口变化 |
| 重复帧大量出现 | ACK丢失导致超时重传 | 抓包分析ACK序列 |
| 接收方内存泄漏 | 缓存未释放的失序帧 | valgrind内存检测 |
动态窗口调整:根据RTT和带宽乘积计算最优窗口
python复制# 简化的BDP计算
optimal_window = (bandwidth * rtt) / frame_size
延迟ACK优化:不是每个帧都立即回复ACK,而是:
选择性确认:在Linux下开启SACK:
bash复制sysctl -w net.ipv4.tcp_sack=1
802.11ac无线协议采用混合ARQ机制,结合了:
在5G URLLC场景中,ARQ时延要求严苛到1ms级,这催生了: