HDLC协议源于IBM开发的同步数据链路控制(Synchronous Data Link Control,SDLC)协议。SDLC协议是由IBM开发的第一个面向比特的同步数据链路层协议。随后,ANSI和ISO均采纳并发展了SDLC协议,而且分别提出了自己的标准:ANSI提出了高级数据链路控制规程(Advanced Data Communication Control Procedure,ADCCP),而ISO提出了高级数据链路控制(HDLC)协议。
作为面向比特的同步数据控制协议的典型,HDLC协议只支持同步传输。但是HDLC既可工作在点到点线路方式,也可工作在点到多点线路方式;同时HDLC既适用于半双工线路,也适用于全双工线路。HDLC协议的子集被广泛用于X.25网络、帧中继网络以及局域网的逻辑链路控制(Logic Link Control,LLC)子层作为数据链路层协议,以实现相邻节点之间的可靠传输功能。
HDLC协议的帧格式如图3-13所示,每个字段的含义如下。
图3-13 HDLC协议的帧格式
1.标志字段(Flag)
标志字段为“01111110”,用以标志帧的开始或结束。在连续发送多个数据帧时,同一个标志既可用于表示前一帧的结束,又可用于表示下一帧的开始。采用“0比特插入”可以实现数据的透明传输。所谓“0比特插入”是指发送端在发送数据时,如果遇到连续5个“1”则在数据中插入一个“0”,接收端在接收数据时,如果遇到连续5个“1”则自动删除后面的“0”。
2.地址字段(Address)
地址字段的内容取决于所采用的操作方式。每个节点都被分配一个唯一的地址。命令帧中的地址字段携带的是对方节点的地址,而响应帧中的地址字段携带的是本节点的地址。某一地址也可分配给不止一个节点,这种地址称为组地址。利用一个组地址传输的帧能被组内所有的节点接收。还可以用全“1”地址来表示包含所有节点的地址,全“1”地址称为广播地址,含有广播地址的帧可传送给链路上所有的节点。另外,还规定全“0”的地址不分配给任何节点,仅作为测试用。
地址字段的长度通常是8比特,可表示256个地址。当地址字段的首位为“1”时,表示地址字段只用8比特;当首位为“0”时,表示本字节后面1个字节是扩充地址字段。这样意味着HDLC地址字段可以标识超过256个以上的站点地址。
3.控制字段(Control)
当HDLC未采用扩展地址时,标志字段后面的第二个字节就是控制字段。控制字段占用1个字节的长度。控制字段用于构成各种命令及响应,以便对链路进行监视与控制。该字段是HDLC帧格式的关键字段。控制字段中的第1比特或第2比特表示帧的类型,即信息帧(I帧)、监控帧(S帧)和无编号帧(U帧)。3种类型的帧控制字段的第5比特是P/F位,即轮询/终止(Poll/Final)位。
4.信息字段(Information)
信息字段可以是任意的二进制比特串,长度未做限定。其上限由FCS字段或通信节点的缓冲容量来决定。目前国际常用的是1000~2000比特,而下限可以是0,即无信息字段。另外,监控帧中不可有信息字段。
5.帧校验序列字段(FCS)
在HDLC协议的所有帧中都包含一个16比特的帧校验序列(Frame Check Sequence,FCS),用于差错检测。HDLC协议的校验序列是对整个帧的内容进行CRC循环冗余校验,但标志字段和0比特插入部分不包括在帧校验范围内。HDLC协议帧校验序列的生成多项式一般采用CRC-CCITT标准,即 x 16 + x 12 + x 5 +1。
HDLC的控制字段有8比特。第1比特为“0”时,表示该帧为信息帧;第1、第2比特为“10”时,表示该帧为监控帧;第1、第2比特为“11”时,表示该帧为无编号帧。
1.信息帧(Information Frame)
信息帧用于传送有效信息或数据,通常简称为I帧,信息帧控制字段格式如图3-14所示。
图3-14 信息帧控制字段格式
I帧控制字段的第1比特为0。HDLC协议采用滑动窗口机制,允许发送端不必等待应答而连续发送多个信息帧。控制字段中的N(S)用于存放发送帧的序号,N(R)用于存放接收端预期要接收的帧的序号。N(S)与N(R)均为3比特,取值范围为0~7。
2.监控帧(Supervisor Frame)
监控帧用于差错控制和流量控制,通常简称为S帧。监控帧控制字段的第1、第2比特为“01”,无信息字段。监控帧控制字段格式如图3-15所示。
图3-15 监控帧控制字段格式
监控帧控制字段的第3、第4比特为监控帧类型编码,共有4种不同的编码,如表3-2所示。
表3-2 监控帧Type字段、功能描述及N(R)字段的含义
接收端可以用接收就绪(Receive Ready,RR)帧对发送端进行应答,希望发送端发送序号为N(R)的信息帧。RR帧相当于专门确认帧(因为一般情况下,应答都是通过反向信息帧捎带完成的)。
接收端可以用拒绝(REJect,REJ)帧来要求发送端重传编号为N(R)之后的所有信息帧(包括N(R)帧),同时暗示N(R)以前的所有信息帧已被接收端正确接收。
接收端返回接收未就绪(Receive Not Ready,RNR)帧,表示编号小于N(R)的信息帧已经正确接收,但目前接收端尚未准备好接收新帧。RNR帧主要用于对链路进行流量控制。
接收端返回选择拒绝(Select REJect,SREJ)帧告知发送端重发编号为N(R0的帧,并暗示其他编号帧已经正确接收。
接收就绪帧和接收未就绪帧主要有两个作用:一是用于通知发送端接收端是否准备好;二是告诉发送端接收端已正确接收N(R)帧之前的所有帧。
拒绝帧和选择拒绝帧用于向发送端报告接收端没有正确接收到信息帧。REJ帧用于请求发送端重发N(R)帧以及N(R)帧之后的所有帧,这就是后退 N 帧协议。SREJ帧用于请求发送端重发N(R)单个帧,这就是选择重传协议。
3.无编号帧(Unnumbered Frame)
无编号帧用控制字段的第1比特、第2比特为“11”来标识,如图3-16所示。
图3-16 无编号帧控制字段格式
无编号帧因其控制字段中不包含编号N(S0和N(R0而得名,简称U帧。U帧用于提供对链路的建立、拆除以及多种控制工程。无编号帧用5个修正(Modifier)比特来进行定义,最多可以表示32种控制帧。