翻网络规划设计师真题的时候,你会发现一个很有意思的现象:数据链路层这块,HDLC 出现的频率一点不比以太网低。很多人第一反应是——这玩意儿不是上世纪的老协议吗?现在工作里哪还见得到?可试卷不这么想,上午题考帧结构、考零比特填充,下午案例偶尔拿它跟 PPP 一起分析。说实话,我第一次备考时也轻视过它,直到做错一道关于 N(R) 的题,才老老实实把协议规范捡起来重读。
这篇笔记就当一份可直接拿去对照复习的资料:HDLC 的帧结构、三种帧类型、三种传输模式、滑动窗口计算、透明传输原理,以及软考最爱挖坑的几个点,全部按考点笔记的形式拆开讲。不管你考的是网络规划设计师还是网络工程师,凡是复习到数据链路层,这几块内容都绕不开。工作中真正配置过 HDLC 的人确实不多,但考试考的是原理,原理搞透了,题目怎么变都能应对。
1. 先搞清楚:软考里的HDLC,为什么被归在"局域网"目录下
1.1 一个容易让人误会的分类
先说一个让不少考生蒙圈的目录问题。软考资料里经常写"局域网之 HDLC 协议",但翻主流教材时,HDLC 通常被放在广域网章节介绍,很多人因此觉得资料标错了。其实两边都不算错,关键在于你怎么理解"局域网"这个栏目。
在考纲的组织方式里,"局域网"经常是数据链路层的代称。局域网本身的技术核心就是数据链路层的介质访问控制、帧封装、差错控制这些东西,而 HDLC 恰好也是数据链路层协议,所以它跟以太网、PPP 会被归到同一个复习单元里。更准确地说,HDLC 是一个面向比特的同步链路控制协议,常用在路由器串口、SDH 链路、DDN 专线这类点对点场景;它跟以太网那种共享介质的局域网确实不是一回事,但两者在 OSI 模型里住在同一层,考点上被安排在一起很正常。
所以复习时不用纠结这个分类,你只需要记住一条:HDLC 属于数据链路层协议,核心考点是帧是怎么封装的、可靠传输是怎么做的、遇到标志字节怎么办。把它理解成"链路层的通用框架",后面所有知识点都顺了。
1.2 考点地位与考查方式
从历年题量看,HDLC 在软考上午题里几乎是稳定出现的,常驻考点包括:
- 帧结构中各字段的顺序和长度
- 标志字段的取值(0x7E)以及连续帧怎么共用标志
- 控制字段如何区分 I 帧、S 帧、U 帧
- 滑动窗口与信道利用率的计算
- 零比特填充的收发规则
- HDLC 与 PPP 的异同对比
下午题虽然不常单独出大案例,但经常把 HDLC 作为背景,跟 PPP、SDH、广域网接入放在一起考。如果只是死记字段表,碰到计算题和概念辨析题容易翻车;但如果能把"为什么这么设计"想明白,这些题其实都是送分题。
2. 帧结构逐字段拆解:七个字段,每个字段都对应一个考点
2.1 帧总览
HDLC 的帧结构不长,一个完整的帧由七个部分组成,考试时画出来就是一个经典的表格题:
| 字段 | 名称 | 默认长度 | 作用 |
|---|---|---|---|
| F | 标志字段 | 8 bit | 表示帧的开始和结束,固定为 01111110 |
| A | 地址字段 | 8 bit,可扩展 | 标识主站或从站地址 |
| C | 控制字段 | 8 bit,可扩展 | 区分帧类型,携带序号与确认信息 |
| Info | 信息字段 | 可变 | 承载上层数据,考试中常称为净荷 |
| FCS | 帧校验序列 | 16 bit 或 32 bit | 用 CRC 校验帧的完整性与正确性 |
| F | 标志字段 | 8 bit | 表示本帧结束,与帧头标志相同 |
这个顺序要背得非常熟。我之前见过有人把 FCS 放在信息字段前面,一画图就错,这种低级错误在考试里是最亏的。你可以用一句口诀辅助记忆:"标地控信校标"——标志、地址、控制、信息、校验、标志。
2.2 标志字段与帧边界的复用
标志字段固定是二进制 01111110,也就是十六进制 0x7E。它在链路中同时充当帧头和帧尾,意味着接收方只要在比特流中检测到这个模式,就认为一帧开始了或结束了。
这里有个易考点:相邻两帧之间的标志可以共享。比如前一帧的结束标志同时就是后一帧的开始标志,这样一来帧与帧之间不需要额外的空闲填充,链路上的开销能省一点。题目如果给你一段包含多帧的比特流,让你数有几帧,就要特别注意这种共用情况。
标志字段本身也是后来"透明传输"问题的根源所在:如果数据字段里恰好出现了和标志一样的 01111110,接收方就会误判帧边界。怎么解决?这就是后面要讲的零比特填充技术,这里先记住标志值和边界复用这个考点,后面自然能串起来。
2.3 地址字段的扩展逻辑
地址字段在不同场景下含义不同:主站发出的命令帧,地址字段填的是从站地址;从站返回的响应帧,地址字段填的是主站地址。所以它永远填"对方"的地址,而不是发送方自己的地址。这个细节经常被考生忽略,选择题特别喜欢在这里埋伏笔。
默认情况下地址字段占 8 bit,但 HDLC 支持地址扩展:当地址字段第一个字节的最低位为 0 时,表示后面还有地址字节;为 1 时,表示这是最后一个地址字节。这种逐字节续接的设计,让协议可以根据实际网络中站的多少决定地址长度,灵活但考试只需要知道它能扩展就行。
2.4 FCS字段与帧无效判定
FCS 是帧校验序列,HDLC 标准里允许用 16 位或 32 位的 CRC 校验。软考常默认按 16 位 CRC 对待,但选择题里如果明确说是扩展校验场景,可能对应 32 位。FCS 的计算范围覆盖地址字段、控制字段和信息字段,不包含标志字段。
接收方收到帧后,先做透明传输的反向处理,再对地址、控制、信息重新计算 CRC,和收到的 FCS 比对,不一致就判定帧出错。除了 CRC 错误,以下情况也被视为无效帧:
- 帧长度小于规定的最小值,HDLC 规定除标志外至少要有 32 bit
- 地址字段编码不合法
- 收到的比特流不满足"以标志开头、以标志结尾"的基本结构
这些无效帧判定规则也是选择题的高频选项,复习时不要只看帧结构,忽略后面的处理规则。
3. 控制字段深度解析:I帧、S帧、U帧各管一摊事
3.1 8位控制字段的读法
控制字段是 HDLC 里信息量最大的字段,因为它用前两位比特就区分出了三种帧类型。请看这个对照:
| 控制字段前两位 | 帧类型 | 全称 | 职责 |
|---|---|---|---|
| 0 | I 帧 | Information Frame | 传输数据,同时携带确认信息 |
| 10 | S 帧 | Supervisory Frame | 流量控制与差错控制,不带数据 |
| 11 | U 帧 | Unnumbered Frame | 链路建立、拆除、管理,不带序号 |
I 帧里的"N(S)"是发送序号,表示当前这一帧的编号;后面的"N(R)"是期望接收序号,表示发送方期望下一次从对方那里收到编号为 N(R) 的帧,等于告诉对方"你编号 N(R)-1 及之前的帧我都已经正确收到了"。一句话记住:N(R) 不是"我收到了什么",而是"我期待你下一帧的编号"。
S 帧不带数据,但它的 N(R) 同样起着确认作用。这样设计的好处是:当对方没有数据要发时,仍然可以单独发一个 S 帧来确认你发来的数据,不用干等。
3.2 I帧怎么用N(S)/N(R)做到捎带确认
捎带确认是 HDLC 可靠传输的灵魂。正常情况下,站点 A 给站点 B 发送数据帧,B 收到后需要告诉 A"我收到了"。如果 B 恰好也有数据要回传给 A,那么 B 可以在它发出的数据帧里,通过 N(R) 字段顺带完成确认。这就是"捎带":确认信息不单独占一个帧,而是藏在数据帧的控制字段里。
这个机制省去了大量独立确认帧,全双工通信时效率很高。考试常让人判断某条比特流的 N(R) 是否正确,比如 A 收到编号为 3 的帧后,回复的帧里 N(R) 应该填 4,而不是填 3。很多人在这里栽跟头,就是因为把 N(R) 理解成"刚收到的那一帧序号"。
3.3 S帧和U帧的关键类型
S 帧在控制字段的中间还有两个比特用来标识类型:
| S帧编码 | 名称 | 作用 |
|---|---|---|
| 00 | RR 接收就绪 | "我准备好接收 N(R) 起的帧" |
| 01 | RNR 接收未就绪 | "我暂时没空接收,别发了" |
| 10 | REJ 拒绝 | "N(R) 这一帧有问题,从这里往后全部重发" |
| 11 | SREJ 选择拒绝 | "只有 N(R) 这一帧有问题,只重发这一帧" |
注意 REJ 对应的是退回 N 帧重传策略,SREJ 对应的是选择重传策略。软考常考两者的区别:REJ 让发送方从出错的帧开始把后面所有帧都重发一遍;SREJ 只让发送方重发出错的那一帧。一个消耗简单但效率低,一个效率高但实现复杂。
U 帧是最容易被忽略的一类。它的 M 字段组合出了各种管理命令,考试里出现频率比较高的有:
- SABM:置异步平衡模式,建链时用
- UA:无编号确认,收到 SABM 或 DISC 后回复
- DISC:拆除链路
- FRMR:帧拒绝,表示收到无法正确处理的帧
这些命令长什么样不用死记二进制,但作用必须对应清楚,特别是 SABM 和 UA 的组合,几乎年年以不同的形式出现。
3.4 P/F位的作用
控制字段里还有一个特殊位,在 I 帧、S 帧和 U 帧里都出现,就是 P/F 位。主站发出命令帧时这个位叫 P(Polling,轮询位),从站回应时这个位叫 F(Final,结束位)。
它的典型用法是:主站发送带 P=1 的命令帧,强行要求从站立刻响应;从站收到后,只有在自己发回的最后一个响应帧里把 F 置 1,表示"这批回应结束了"。也就是说,P/F 位配合使用,实现了主站对从站发送权的控制。如果考到 NRM 模式下的通信流程,P/F 位几乎一定会出现在题目里,要格外留个心眼。
4. 链路建立与拆除:从SABM到UA,HDLC怎么握手
4.1 主站、从站、复合站与三种传输模式
HDLC 把通信站点分成了三类:主站负责控制链路,从站只能按主站的要求响应,复合站同时具有主站和从站能力,可以主动发送数据。这三类站点对应三种传输模式:
| 模式 | 全称 | 站点关系 | 特点 |
|---|---|---|---|
| NRM | 正常响应模式 | 主站 + 从站 | 从站收到主站轮询后才能发送 |
| ARM | 异步响应模式 | 主站 + 从站 | 从站可以主动发送,但链路仍由主站管理 |
| ABM | 异步平衡模式 | 复合站 + 复合站 | 双方对等,任意一方可主动发帧 |
软考复习重点在 NRM 和 ABM。NRM 对应传统的主从链路,比如一台计算机带一堆终端;ABM 对应现代路由器之间的点对点通信,PPP 在概念上也托了它的福。题目常把模式与站点角色交叉出题,比如"ABM 模式下双方是什么站"——答案一定是复合站。
4.2 建链和拆链的过程
以最常见的 ABM 模式为例,链路建立的过程是这样的:
- 站点 A 向站点 B 发送 SABM 命令帧,请求建立异步平衡模式链路
- 站点 B 收到后,若同意,则返回 UA 帧作为确认
- 站点 A 收到 UA 帧,链路正式进入数据传输阶段
这个过程和 TCP 三次握手很像,但比 TCP 简单,只有两帧就完成了。SABM 里的 P 位通常置 1,要求对方必须响应;UA 帧里的 F 位随之置 1,表示这是对 SABM 的直接回应。
拆链过程对称:任意一方发送 DISC 命令,对方回复 UA 帧,链路就释放了。FRMR 帧则用在异常场景,比如收到带错误序号或者根本无法识别的帧时,站点发送 FRMR 通知对方出了协议级错误。
建链和拆链的帧交换序列是下午案例题最爱画的过程题之一。复习时可以自己在纸上把 SABM、UA、I 帧、DISC、UA 的收发顺序画一遍,画一次比背十次都管用。
5. 滑动窗口与信道利用率计算:软考计算题的主战场
5.1 为什么需要滑动窗口
如果不做任何确认窗口,发送方发一帧就得停下来等确认,链路大部分时间都在空等,信道利用率非常低。HDLC 采用滑动窗口机制:发送方可以一次性连续发送多个帧,不必逐帧等待确认,只要未确认帧的数量不超过发送窗口大小就行。
HDLC 基本模式下序号字段只有 3 bit,编号范围是 0 到 7,发送窗口最大能做到 7 帧。为什么是 7 而不是 8?这是 Go-Back-N 重传策略的约束:发送窗口不能超过序号总数的一半少 1,否则当确认丢失时,发送方无法区分"新帧"和"重传帧"。扩展模式下序号字段 7 bit,窗口最大可以到 127 帧,卫星链路这类大时延场景就需要这么大窗口。
5.2 信道利用率的计算公式
做计算题前记住一个基本量:帧发送时间 T_f = 帧长(bit) / 链路速率(bps)。
在不考虑确认帧发送时间、站点处理时延的简化模型下,发送第一个帧到收到第一个确认,一个完整周期需要 T_f + RTT,其中 RTT 是往返传播时延。在这个周期内,发送窗口允许发 W 个帧,这 W 个帧的总发送时间是 W × T_f。
于是得到一个非常实用的结论:
- 如果 W × T_f < T_f + RTT,那么发送窗口耗尽后必须等待确认,信道利用率 = W × T_f / (T_f + RTT)
- 如果 W × T_f ≥ T_f + RTT,那么发送窗口还没耗尽,确认已经回来了,理论上链路可以做到满载,利用率按 100% 处理(简化模型下)
这个公式不用死背,理解"窗口撑不撑得住链路"就通了。
5.3 一道典型的软考式计算题
网上很多例题喜欢把参数设得特别凑巧,练的时候觉得简单,考场上数字一换就慌。我建议按下面的方式推一遍完整过程。
题目背景:某链路速率 100 kbps,帧长 1250 字节,单程传播时延 400 ms,HDLC 采用 3 bit 序号滑动窗口(Go-Back-N),求最大信道利用率。
第一步,求单帧发送时间:
T_f = 1250 × 8 / 100000 = 0.1 s
第二步,求往返传播时延:
RTT = 2 × 400 ms = 0.8 s
第三步,求窗口的发送能力:
W = 7,W × T_f = 7 × 0.1 = 0.7 s
第四步,与周期比较:
T_f + RTT = 0.1 + 0.8 = 0.9 s
因为 0.7 s < 0.9 s,所以窗口成为瓶颈,最大信道利用率为:
U = 0.7 / 0.9 ≈ 77.8%
这个题最大的意义在于演示流程:先算 T_f,再算 RTT,最后拿窗口总发送时间和周期比一比。如果把帧长加大、或者把序号扩展为 7 bit,让 W × T_f 超过 0.9 s,利用率就会变成理论上的 100%。很多考生直接背"利用率等于 7/(1+2a)"之类的变体公式,遇到窗口不满的情况就不知道怎么处理,根源就是没理解这个比较过程。
6. 零比特填充:最容易被忽略的透明传输考点
6.1 为什么要做透明传输
前面说过,HDLC 用 01111110 当帧边界标志。问题来了:数据字段是任意的比特序列,如果里面恰好也出现 01111110,接收方就会把它误认为帧结束,把数据拦腰截断,剩下没读完的比特全算无效。
链路层要解决这个问题,就必须让数据字段中出现任何比特模式都能"透明"地传输。HDLC 采用的方法是零比特填充,本质是:发送前破坏掉数据里可能冒充标志的连续 1 序列,接收后再恢复出来。
6.2 发送端填充和接收端删除规则
发送端的规则一句话:在地址、控制、信息、FCS 这些除了标志以外的所有字段中,只要发现连续 5 个 1,就立即在它们后面插入一个 0。
接收端的规则是逆向操作:
- 扫描比特流,连续收到 5 个 1 后查看下一个比特
- 如果下一个比特是 0,就把它删除,恢复出原始数据
- 如果下一个比特是 1,再看再下一个比特;01111110 这个完整的 8 位序列被识别为帧边界
- 如果出现连续 7 个以上的 1,则判定帧异常
举个例子,发送数据是二进制序列 1011111100,里面有一段连续 5 个 1,填充后变成 10111110100。接收端扫描到 111110 时,发现连续 5 个 1 后跟了 0,就把这个 0 删掉,恢复出 1011111100。
再比如全部是 1 的 10 个比特,发送端会在第 5 个 1 和第 10 个 1 后面各插入一个 0,变成 111110111110。接收端据此准确还原数据,不会误判边界。
6.3 出题角度与易错点
软考里零比特填充题一般是这么出的:
- 给一段待发送数据,问插入几个 0,或者问填充后的序列是什么
- 给一段接收到的比特流,问哪些 0 要被删除
- 把一段包含标志的数据放出来,问接收端会把它分成几帧
做这类题时最容易错的,是漏掉 FCS 字段里的 1。零比特填充覆盖的范围是除了标志以外的所有字段,FCS 作为帧的一部分同样需要填充,不是只填信息字段。题目如果给出完整帧结构,计算填充数量时一定要把 FCS 也考虑进去。
这个考点本身不难,难的是需要细致。我见过不少人在考场上数错连续 1 的组数,事后一对答案发现只是漏了一组。平时练习时养成"从低位往高位逐位扫描"的习惯,把每组连续的 5 个 1 都圈出来,基本就不会错了。
另外可以对比一下 PPP 的字节填充来理解:HDLC 是面向比特的协议,所以用插入 0 的方式;PPP 是面向字节的协议,遇到 0x7E 和 0x7D 时用转义字符处理。两种机制的思路完全一致,都是"让数据里不再出现边界标志",只是实现粒度不同。
7. HDLC和PPP到底是什么关系:对照着记,效率翻倍
7.1 从HDLC到PPP的演进逻辑
软考把 HDLC 和 PPP 放在一起考的次数太多了,以至于你不得不琢磨它们之间的关系。实际上,PPP 的同步链路帧格式正是借鉴了 HDLC 的"类 HDLC 成帧"设计,很多书都直接说 PPP 的帧格式基于 HDLC。
但 PPP 解决的痛点是 HDLC 没覆盖的:HDLC 面向比特,主要跑在同步链路上;PPP 则可以同时支持同步和异步链路,还增加了链路控制协议、网络控制协议和认证机制,能够协商链路参数、动态分配网络层地址、做用户身份认证。简单地说,PPP 在 HDLC 的"骨架"上加了更多管理能力,把这些能力抽象成了专门的子协议。
7.2 帧格式与功能对照表
对照表是最适合这个考点的复习工具:
| 对比项 | HDLC | PPP(同步链路) |
|---|---|---|
| 编址方式 | 地址字段有意义,区分主从站 | 地址字段固定为 0xFF,点到点不需要 |
| 控制字段 | 区分 I/S/U 帧,实现可靠传输 | 固定为 0x03,不做序号确认 |
| 协议字段 | 无,需要额外机制区分上层协议 | 有 2 字节协议字段,直接标识封装协议 |
| 透明传输 | 零比特填充 | 字节填充 / 转义 |
| 链路管理 | U 帧完成建链拆链 | LCP 子协议完成 |
| 认证功能 | 无内置 | PAP、CHAP 等 |
| 适用场景 | 路由器串口、SDH、分组交换网 | 拨号、PPPoE、专线接入 |
这张表背下来,考察对比的题基本可以秒选。考试里最爱考的点是"PPP 相比 HDLC 增加了什么",答案核心是协议字段、LCP/NCP 子协议、认证机制这几个词。
7.3 复习定位:把HDLC讲清楚的推荐步骤
如果你正在备考,我建议按这个顺序把 HDLC 过一遍:
- 先背帧结构图,把七个字段顺序和默认长度记住
- 再记三种帧类型和 SABM/UA 建链时序,这是链路层"状态机"的入门
- 然后练零比特填充,找真题里的填充题做三到五道
- 最后把滑动窗口计算题的系统性做法练会,注意区分窗口满不满两种情况
- 对照 PPP 帧格式做一次差异总结,两个考点一次解决
这套顺序的核心思路是从"记忆"到"计算",再到"对比",逐步深入。HDLC 这块在考试里不是最难的,但非常考察基础概念的扎实程度。很多人在上午题丢分,不是题目有多深,而是帧结构、N(R) 含义、填充规则这些基本功有漏洞。你肯花半天时间把上述逻辑完整推一遍,考场上遇到 HDLC 的题基本可以保证稳定拿分。
最后分享一个复习时的小经验:不要只盯着表中字段死记,自己在纸上画一画 A 和 B 两个站点互相发送 I 帧时 N(S)、N(R) 的变化过程。把每一帧的序号代入进去,你会很快理解 N(R) 为什么表示"期望收到的下一帧序号",也会明白滑动窗口为什么能提升全双工链路的效率。这个画面一旦在脑子里建立起来,HDLC 的零散考点就全都串成一条线了。