HDLC(High-level Data Link Control,高级数据链路控制)一个数据链路层的面向比特的协议,能够实现点对点和点对多的网络通信,拥有高效、可靠、透明等特点
不过标准 HDLC 协议已逐渐退出主流应用场景,在广域网点对点链路中,HDLC 协议主要被 PPP 协议所取代。不过PPP协议身上仍然有HDLC的影子
1. 理论概念
1.1 ARQ协议
ARQ (Automatic Repeat reQuest, 自动重传请求) 这是HDLC实现可靠传输的技术之一
!{tip}
不过ARQ协议只是个框架被广泛应用在需要可靠传输的地方,例如TCP/IP协议簇中的TCP协议也利用了ARQ协议
ARQ协议中有三种实现策略,分别是 停止等待(SW)、回退N (GBN) 和 选择重传(SR)
停止等待(Stop and Wait, SW)
发送方在发送一个数据包后,必须等待接收方的确认。如果在设定的超时期限内未收到确认,发送方会重新发送该数据包。这种机制就导致了线路的利用率是非常低的,大部分时间都花在了非必要的等待上,不过好在这种方式实现非常简单
回退N(Go Back N, GBN)
如果接收方发现丢失了某个数据包,它会丢弃该数据包之后接收的所有数据包,并要求发送方从丢失的数据包开始重新发送。这种机制提升了线路的利用率,但是如果有数据包丢失了那么仍然会产生不必要的冗余传输,这种方式适合用在稳定线路上
!{tip 提示}
上面介绍的两种策略属于连续ARQ,接下来将介绍选择重传ARQ
选择重传(Selective Repeat, SR)
选择重传ARQ则只重传那些确实出错或丢失的数据包。发送方和接收方都会维护一个窗口,用于控制可以发送和接收的数据包的数量和编号。这种方法可以减少不必要的重传,提高传输效率,不过接收端需缓存乱序帧复杂度比上面两种策略都高
1.2 站点和链路
站点类型
HDLC 中的站点分为 主站(Primary)、从站(Secondary) 和 复合站(Combined)
- 主站:整个链路的管理者,拥有控制权,能够主动发送数据和链路管理命令,负责链路的控制和调度
- 从站:没有控制权,不能主动发起通信,必须在主站轮询后才能发送数据,只能响应主站命令
- 复合站: 同时具备主站和从站的能力,既能主动发起通信,也能响应对方命令,在平衡模式下可实现对等通信
链路的配置模式
分为平衡配置和非平衡配置
-
平衡配置: 指站点和站点之间是平等的,例如 异步平衡模式(ABM,Asynchronous Balanced Mode) 就属于平衡配置
在 异步平衡模式(ABM) 中,双方都是复合站,链路控制权平等,且通信是异步的,即无需严格的轮询或时间同步,双方可以随时全双工发送数据
-
非平衡配置: 指站点和站点之间是不平等的,例如 异步响应模式 (ARM, Asynchronous Response Mode) 和 普通响应模式 (NRM, Normal Response Mode)
在 异步响应模式(ARM) 中,主站能够发送控制数据(I/S/U帧),从站能应答控制(S帧)和主动发送数据(I帧)
普通响应模式(NRM) 和 异步响应模式(ARM) 的区别就是 从站 不能主动发送任何帧,必须等待主站的轮询帧后,才能发送数据和应答控制
2. 帧结构
光看图片你可能会有点懵,不过问题不大,我马上就解释
2.1 其他字段
- 标志位(Flag): 是一个定值
01111110
(16进制为:0x7E
) 用来确定一个帧的开头和结尾 - 地址(Address): 用于区分链路上的不同站点,长度为8bit(标准HDLC最多256个站点),在扩展HDLC中可支持16位地址
!{warning 注意}
HDLC的地址既不是IP地址也不是MAC地址,这个地址是由管理员手动分配的
- 数据(Information): 字面意思指的就是这个帧所承载的数据,在标准的HDLC中并没有规定帧的MTU理论上可以是任意长度(不过一般不建议太长,否则重传成本会特别高)
- 校验和(FCS):从地址到数据字段的CRC-16校验和
!{tip 拓展}
教材上可能会说CRC不能实现纠错,不过实际上CRC是可以做到纠错的
这个我会在文章末尾讲解
不过各种考试上面就不要说CRC能纠错了,分还是要拿的!我们自己知道就行了😎
2.2 控制字段(Control)
控制字段开头1~2个比特能确定帧类型,如果第一个比特为0则为 信息帧(I帧) 否则看第二个比特如果是0则为 监控帧(S帧) 否则为 无编号帧(U帧)
-
信息帧(I帧): 信息帧的控制字段中包含三个有实际含义的字段,分别是 N(S)、N(R)和F/P
- N(S): 发送序号,用于标识这是第几帧数据,便于接收端按序重组
- N(R): 接收端期望接收的下一帧编号
-
监控帧(S帧): 主要负责应答控制M字段为S帧对应的类型如下表
M字段(二进制) | 帧名称 | 含义 |
---|---|---|
00 | RR (Receive Ready) | 表示准备就绪可以接收消息 |
01 | REJ (Reject) | 和N(R)字段一起组合使用实现 ARQ的回退N(GBN) |
10 | RNR (Receive Not Ready) | 表示接收端没有准备好暂停接收消息 |
11 | SREJ (Selective Reject) | 和N(R)字段一起组合使用实现 ARQ的选择重传(SR) |
- 无编号帧(U帧): 主要负责控制链路和管理
U帧比较复杂,且迄今为止我没有找到任何一个详细介绍U帧的资料 (我英语不好再加上ISO的标准文档写的有点晦涩难懂和比较神经的机翻结果,我尽力了😭)
如果未来我搞清楚了我将会补齐文章内容
3. 拓展
3.1 HDLC如何实现透明传输?
HDLC采用零比特的方式实现透明传输,也就是如果遇到了5个连续的1就在后面插入一个0 也就是用011111010
来表示01111110
在接受数据时反之遇到5个连续的1就将后面的0删除
3.2 CRC如何实现纠错
以CRC-3为例,生成多项式: $G(x)=x³+x²+1$,校验位长度 R=3(就是生成多项式的最高次幂)
假设数据为 10011
,其CRC校验码为 011
,发送帧为 10011011
。
若传输中低位第2位出错,接收端重新做CRC除法得到余数 010
(十进制=2);若低位第4位出错,余数则为 100
(十进制=4)。若无错误则余数为 000
。
因此,当数据长度$≤ (2^R - R)$ 时,CRC的余数与出错位唯一对应,可实现单比特纠错
!{warning 警告}
- CRC设计目的是检错,纠错只是特殊情况下的附加性质
- 当数据长度 $> (2^R-R)$ 或出现多比特错误时,CRC不能用于纠错
- 考试中绝对不能说“CRC有纠错能力”!