在计算机通信的早期人们就已发现,对于经常产生误码的实际链路,只要加上合适的控制规程,就可以使通信变为比较可靠的。那时 ARPANET 和 IBM 公司分别使用了各自的控制规程,它们分别是:IMP-IMP 协议和 BSC 规程(也可称为 BISYNC,即 BInary SYNchronous Communication 的缩写)。这些规程都是数据链路层的协议。
上述的两种协议都是面向字符的。所谓面向字符就是说在链路上所传送的数据必须是由规定字符集(例如 ASCII 码)中的字符所组成。不仅如此,在链路上传送的控制信息也必须由同一个字符集中的若干指定的控制字符构成。这种面向字符的链路控制规程在计算机网络的发展过程中曾起了重要的作用。
但随着计算机通信的发展,这种面向字符的链路控制规程就逐渐暴露出其弱点。就以著名的 BSC 规程来说,其主要限制是:
(l)通信线路的利用率低,因为它采用的是停止等待协议,收发双方交替地工作。
(2)所有通信的设备必须使用同样字符代码,而不同版本的 BSC 规程要求使用不同的代码。
(3)只对数据部分进行差错控制,若控制部分出错就无法控制,因而可靠性较差。
(4)不易扩展。每增加一种功能就需要设定一个新的控制字符。
此外,它还存在其他一些缺点。由此可见,需要设计出一种新的链路控制规程来代替旧的面向字符的链路规程。
1974年,IBM 公司推出了著名的体系结构 SNA。在 SNA 的数据链路层规程采用了面向比特的规程 SDLC( Synchronous Data Link Control)。后来 IBM 将此规程提交美国国家标准协会 ANSI 和国际标准化组织 ISO,建议能成为国家和国际标准。ANSI 把 SDLC 修改为 ADCCP(Advanced Data Communication Control Procedure)作为美国国家标准,而 ISO 把 SDLC 修改后称为 HDLC(High-level Data Link Control),译为高级数据链路控制,作为国际标准 ISO 3309。我国的相应国家标准是 GB 7496。 CCITT 则将 HDLC 再修改后称为链路接入规程 LAP(Link AccessProcedure),并作为 X.25 建议书的一部分(即有关数据链路层协议的部分)。不久,HDLC 的新版本又把 LAP 修改为 LAPB,“B” 表示平衡型(Balanced),所以 LAPB 叫做链路接入规程(平衡型)。
上述这几个面向比特的链路规程均大同小异。ADCCP 与 HDLC 没有多少区别。SDLC 虽然最早提出,但它实际上是 HDLC 的一个子集。因此下面就介绍 HDLC 的要点。
3.5.2 两种配置和三种方式在具体介绍 HDLC 的细节之前,应先弄清两种链路配置和三种数据传送方式。
图3-10 为链路的两种基本配置,即非平衡配置与平衡配置。图3-10(a)是非平衡配置,它又分为点对点工作和多点工作两种情况。非平衡配置的特点是由一个主站(primary station)控制整个链路的工作。主站发出的帧叫做命令(command)。受控的各站叫做次站或从站(secondary station)。次站发出的帧叫做响应(response)。在多点链路中,主站与每一个次站之间都有一个分开的逻辑链路。
图3-10(b)是平衡配置,它只能是点对点工作。平衡配置的特点是链路两端的两个站都是复合站(combined station)。复合站同时具有主站与次站的功能。因此每个复合站都可以发出命令和响应。
对于非平衡配置,可以有两种数据传送方式。最常用的是正常响应方式 NRM (Normal Response Mode),其特点是只有主站才能发起向次站的数据传输,而次站只有在主站向它发送命令帧进行轮询(poll)时,才能以响应帧的形式回答主站。另一种用得较少的是异步响应方式 ARM (Asynchronous Response Mode)。这种方式允许次站发起向主站的数据传输,即次站不需要等待主站发过来的命令,而是可以主动向主站发送响应帧。但是,主站仍负责全线的初始化、链路的建立和释放,以及差错恢复等。
对于平衡配置则只有异步平衡方式 ABM (Asynchronous Balanced Mode),其特点是每个复合站都可以平等地发起数据传输,而不需要得到对方复合站的允许。
3.5.3 HDLC的帧结构1.各字段的意义
数据链路层的数据传送是以帧为单位的。一个帧的结构具有固定的格式(见 图3-11)。从网络层交下来的分组,变成为数据链路层的数据。这就是 图3-11 中的信息字段。信息字段的长度没有具体规定。数据链路层在信息字段的头尾各加上 24 bit 的控制信息,这样就构成了一个完整的帧。下面分别介绍控制信息中各字段的意义。
我们知道,物理层要解决比特同步的问题。但是,数据链路层要解决帧同步的问题。所谓帧同步就是从收到的比特流中正确无误地判断出一个帧从哪个比特开始以及到哪个比特结束。为此,HDLC 规定了在一个帧的开头(即首部中的第一个字节)和结尾(即尾部中的最后一个字节)各放入一个特殊的标记,作为一个帧的边界。这个标记就叫做标志字段 F (Flag)。标志字段 F 为 6 个连续 1 加上两边各一个 0 共 8 bit 。在接收端,只要找到标志字段,就可以很容易地确定一个帧的位置。
在两个标志字段之间的比特串中,如果碰巧出现了和标志字段 F 一样的比特组合,那么就会误认为是帧的边界。为了避免出现这种错误,HDLC 采用零比特填充法使一帧中两个 F 字段之间不会出现 6 个连续 1 。
零比特填充的具体做法是:在发送端,当一串比特流尚未加上标志字段时,先用硬件扫描整个帧(用软件也能实现,但要慢些)。只要发现有 5 个连续 1 ,则立即填入一个 0 。因此经过这种零比特填充后的数据,就可以保证不会出现 6 个连续 1 。在接收一个帧时,先找到 F 字段以确定帧的边界。接着再用硬件对其中的比特流进行扫描。每当发现 5 个连续 1 时,就将这 5 个连续 1 后的一个 0 删除,以还原成原来的比特流(图3-12)。这样就保证了在所传送的比特流中,不管出现什么样的比特组合,也不至于引起帧边界的判断错误。
采用零比特填充法就可传送任意组合的比特流,或者说,就可实现链路层的透明传输。在 图3-11 两个 F 字段之间注明的 “透明区间” 就是这个意思。
当连续传输两个帧时,前一个帧的结束标志字段 F 可以兼作后一帧的起始标志字段。当暂时没有信息传送时,可以连续发送标志字段,使收端可以一直和发端保持同步。
地址字段 A 也是8个比特。在使用非平衡方式传送数据时,地址字段总是写入次站的地址。但在平衡方式时(采用 ABM ),地址字段总是填入应答站的地址。在 图3-10 中,在链路上传送的“命令”和“响应”的后面,都各有一个括弧。请注意:括弧内的字母就表示地址字段应填入哪一个站的地址。
全 1 地址是广播方式,而全 0 地址是无效地址。因此,有效的地址共有 254个 之多。这对一般的多点链路是足够的。但考虑在某些情况下,例如使用分组无线电,用户可能很多,所以地址字段就做成可扩展的。这时用地址字段的第 1 位表示扩展位,其余 7 位为地址位。当某个地址字段的第 1 位为 0 时,则表示下一个地址字段的后 7 位也是地址位。当这个地址字段的第 1 位为 1 时,即表示这已是最后一个地址字段了。
帧校验序列 FCS (Frame Check Sequence)字段共占 16 bit 。它采用的生成多项式是 x16+ x12+x5+1,即 CRC-CCITT 。所校验的范围是从地址字段的第 1 个比特起,到信息字段的最末 1 个比特为止。图3-11 标识出了这个校验范围。关于 FCS 具体的运算方法可参阅 X.25 建议书。
控制字段 C 共 8 bit ,是最复杂的字段。 HDLC 的许多重要功能都要靠控制字段来实现。根据其最前面两个比特的取值,可将 HDLC 帧划分为三大类,即信息帧、监督帧和无编号帧,它们的简称分别是 I (Infomation),S (Supervisory)和 U (Unnumbered)。图3-13 是对应于这三种帧的控制字段以及控制字段中的各比特的作用。下面分别介绍这三种帧的特点。
2.信息帧
若控制字段的第 1 比特为 0 ,则该帧为信息帧。比特 2 ~ 4 为发送序号 N(S),而比特 6 ~ 8 为接收序号 N(R)。N(S)表示当前发送的信息帧的序号,而 N(R)表示一个站所期望收到的帧的发送序号(注意:这个发送序号是由对方填入的)。由于是全双工通信,所以通信的每一方都各有一个 N(S)和N(R),而通信的双方总共有两个 N(S)和两个 N(R)。因此,当讨论到 N(S)和 N(R)时,一定要弄清这是在发送方还是接收方填入的序号。
这里要强调指出,N(R)带有确认的意思。它表示序号为[ N(R)-1 ](mod 8)的帧以及在这以前的各帧都已正确无误地收妥了。
为了保证 HDLC 协议的正常工作,在全双工通信的收发双方都需要各设置两个状态变量 V(S)和 V(R),由这两个状态变量的值确定发送序号 N(S)和接收序号 N(R)的值。
在采用连续 ARQ 协议时,每从主机取一帧新的数据就要将当前的 V(S)和 V(R)的值分别写人控制字段中的 N(S)和 N(R)。将帧发送完后,即将 V(S)加 1(mod 8)。每当需要向后退 N 个帧进行重发时,只需要在缓存队列中依次取出这些已发送过的旧帧,并将其发送出去。这时,发送序号 N(S)仍为原序号,与当前的状态变量 V(S)无关。但是,在重发旧帧时,其接收序号 N(R)必须更新到与接收状态变量 V(R)的当前值一致。这是因为每收到一个无差错的信息帧,接收状态变量的值要随之加 1(mod 8)。因此,在重发旧的信息帧时,接收状态变量 V(R)的值可能已经发生了变化。
控制字段中的发送序号 N(S)和接收序号 N(R)与收发双方的发送状态变量 V(S)和接收状态变量 V(R)之间的关系比较复杂,请读者务必弄懂。
顺便指出,在信息帧中设有接收序号 N(R)这一字段,就表示不必专门为收到的信息帧发送确认应答帧。可以在本站有信息帧发送时,将确认信息放在其接收序号 N(R)中让本站发送信息帧时将确认信息捎带走(piggybacking)。例如,在一连收到对方 N(S)= 0 ~ 3 共 4 个信息帧后,可在即将发送的信息帧中将接收序号 N(R)置为 4 ,表示 3 号帧及其以前的各帧均已正确收到,而期望接收的是发送序号 N(S)= 4 的信息帧。采用这种捎带的方法可以提高信道的利用率。
控制字段的第 5 个比特是询问/终止(Poll / Final)比特,简称 P / F 比特。这个比特的功能较多,并且在监督帧和无编号帧中都使用这个比特。我们将在下面再进行讨论。
3.监督帧
若控制字段的第 l ~ 2 比特为 10 ,则对应的帧即为监督帧 S 。监督帧共有四种,取决于第 3 ~ 4 比特的取值(见 图3-13 中标有 S 的两个比特)。表3-1 是这四种监督帧的名称和功能。
上述四种监督帧中,前三种用在连续 ARQ 协议中,而最后一种只用于选择重传 ARQ 协议中(较少使用)。
所有的监督帧都不包含要传送的数据信息,因此它只有 48 bit 长。显然,监督帧不需要有发送序号 N(S)。但监督帧中的接收序号 N(R)却是至关重要的。在前两种监督帧中的 N(R)都具有同样的含义,因此这两种监督帧都相当于以前提到过的确认帧 ACK。 REJ 则相当于以前提到过的否认帧 NAK,而在 REJ 帧中的 N(R)表示所否认的帧号。不过这种否认帧还带有某种确认信息,即确认序号为 N(R)-l 及其以前的各帧均已正确收到。
我们应当注意到,RR 帧和 RNR 帧还具有流量控制的作用。RR 帧表示已做好接收帧的准备,希望对方继续发送,而 RNR 帧则表示希望对方停止发送(这可能是由于来不及处理到达的帧,或缓冲器已存满)。
监督帧的第 5 比特也是 P / F 比特。若 P / F 值为零,则 P / F 比特并没有任何意义。只有当 P / F 比特的值为 1 时才具有意义。但需要注意:在不同的数据传送方式中,P / F 比特的用法是不一样的。在说明帧的传送过程中,为了更清楚地表示 P / F 比特的作用,往往将它写为 P 比特或 F 比特。下面简单说明其作用。
在非平衡配置的正常响应方式 NRM 中,次站不能主动向主站发送信息。次站只有收到主站发出的 P 比特为 1 的命令帧( S 帧或 I 帧 )以后才能发送响应帧。若次站有数据发送,则在最后一个数据帧中将 F 比特置 1 。若无数据发送,则应在回答的 S 帧中将 F 比特置 1 。
在非平衡配置的异步响应方式 ARM 或在平衡配置的异步平衡方式 ABM 中,任何一个站都可以在主动发送的 S 帧和 I 帧中将 P 比特置 1 。对方站收到 P=1 的帧后,应尽早地回答本站的状态并将 F 比特置 1 ,不过此时并不表示数据已发完和不再发送数据了。
下面结合 图3-14 的例子具体说明 P / F 比特的使用方法。在图中主站 A 与次站 B 和 C 连成多点链路。我们将所传送的帧的一些主要参数按照“地址,帧名和序号,P / F”的先后顺序标注在图中。这里的“地址”是指地址字段中应填入的站地址,“帧名”是指帧的名称,如 RR 或 I ,而序号则是指监督帧中的 N(R)或信息帧中的 N(S)N(R)。P / F 是在当 P / F 为 1 时才写上 P 或 F ,表明此时控制字段的第 5 比特为 1 。
主站 A 先询问 B 站:“ B 站,若有信息,请即发送!”,这时 A 站发送的帧是 RR 监督帧,并将 N(R)置 0,表示期望收到对方的 0 号帧。因此在 图3-14 中将这样的帧记为 “B,RR0,P”。对主站的这一命令,B 站响应以连续 4 个信息帧,其序号 N(S)从 0 到 3 。最后在第 4 个信息帧中将 P / F 置为 1 ,表示 “我要发送的信息已发完!” ,这个帧在 图3-14 中记为 “B,I30,F”。在图中的某一帧标注的参数的最后出现 P 或 F 时,就表示在实际传送的帧中都是控制字段中的第 5 比特为 1 。
我们应注意到,P=l 表示的 “询问” 带有强制性质,即对方(在复合站通信的情况下对方不一定是次站)必须立即回答。如在 图3-14 中,A 站收到 B 站发来的 4 个信息帧后,发回确认帧 RR4(这时 N(R)= 4)。我们注意到这时 P / F 比特并未置 1,所以 B 站收到 RR4 后不必应答。相反,接下去 A 轮询 C 站,P = l 。虽然这时 C 站没有数据发送,但也必须立即应答。C 站应答也是 RR 帧.表示目前没有信息帧发送。F = 1 表明这是回答对方命令的一个响应。
有了 P / F 比特,使 HDLC 规程使用起来更加灵活。在两个复合站全双工通信时,任何一方都可随时使 P = 1 。这时对方就要立即回答 RR 帧,并置 F = l 。这样做可以更早地收到对方的确认。如果不使用 P / F 比特,则收方不一定马上发出确认帧。收方可以在发送自己的信息帧时,在某一个信息帧中捎带把确认信息发出(利用 N(R))。
为了更好地理解信息帧和监督帧中控制字段的作用,在 图3-15 中画出了两个复合站进行全双工通信的例子。读者应搞清每一帧旁边所标符号的意思。
A 站发第 1 个信息帧中 N(S)N(R)= 00,因此我们记为 I00 。后面加上 P 表示这时将 P 置 1 ,其目的是想尽快了解链路的通信状况。A 站发送的信息帧都是命令帧,因此地址填的是接收站的地址。A 站将此帧和下一帧 I10 发完时,还没有收到 B 站发来的头一个信息帧,因此 A 站发的第 3 帧( N(S)= 2 )中的 N(R)仍为 0 。B 站发送的 2 号帧 I22 传丢了。超时再重发时变成了 I26 ,这是因为在收到 A 站的 N(S)= 5 的信息帧后将接收状态变量的值更新了。
以上讲的信息帧和监督帧中的序号 N(S)和 N(R)都各占 3 bit,即序号都是按模 8 计数的。但当使用卫星链路时,由于传播时延太大,必须采用