文章目录
- 一、介绍
- 1、基础
- 2、内容
- 二、数据链路层的几个共同问题
- 1、数据链路和帧
- 2、三个基本问题
- 1)封装成帧
- 2)透明传输
- 3)差错检测
- 三、点对点协议 PPP
- 1、PPP协议的特点
- 1)PPP 协议应满足的需求
- 2)PPP 协议的组成
- 2、PPP协议的帧格式
- 1)各字段的意义
- 2)字节填充
- 3)零比特填充
- 3、PPP协议的工作状态
一、介绍
1、基础
数据链路层属于计算机网络的低层。数据链路层使用的信道主要有以下两种类型:
- 点对点信道。这种信道使用一对一的点对点通信方式。
- 广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。
在本章中我们研究的是在同一个局域网中,分组怎样从一台主机传送到另一台主机但并不经过路由器转发。从整个的互联网来看,局域网仍属于数据链路层的范围。
本章首先介绍点对点信道和在这种信道上最常用的点对点协议PPP。然后再用较大的篇幅讨论共享信道的局域网和有关的协议。
2、内容
本章最重要的内容是:
- 数据链路层的点对点信道和广播信道的特点,以及这两种信道所使用的协议(PPP协议以及CSMA/CD协议)的特点。
- 数据链路层的三个基本问题:封装成帧、透明传输和差错检测。
- 以太网 MAC 层的硬件地址。
- 配器、转发器、集线器、网桥、以太网交换机的作用以及使用场合。
下面看一下两台主机通过互联网进行通信时数据链路层(简称为链路层)所处的地位:
图(a)表示用户主机 H,通过电话线上网,中间经过三个路由器(R1,R2和R3)连接到远程主机 H2。所经过的网络可以是多种的,如电话网、局域网和广域网。
当主机H1向H2发送数据时,从协议的层次上看,数据的流动如图(b)所示。主机 H1和 H2都有完整的五层协议栈,但路由器在转发分组时使用的协议栈只有下面的三层。数据进入路由器后要先从物理层上到网络层,在转发表中找到下一跳的地址后,再下到物理层转发出去。因此,数据从主机H1传送到主机H2需要在路径中的各节点的协议栈向上和向下流动多次,如图中的浅灰色箭头所示。
然而当我们专门研究数据链路层的问题时,在许多情况下我们可以只关心在协议栈中水平方向的各数据链路层。于是,当主机H1向主机H2发送数据时,我们可以想象数据就是在数据链路层从左向右沿水平方向传送,如下图中从左到右的粗箭头所示,即通过以下这样的链路:
H1的链路层→R1的链路层→R2的链路层→R3的链路层→H2的链路层
上图指出,从数据链路层来看,H1到H2的通信可以看成由四段不同的链路层通信组成,即:H1→R1,R1→R2,R2→R3;和R3→H2。这四段不同的链路层可能采用不同的数据链路层协议。
二、数据链路层的几个共同问题
本节重点讨论使用点对点信道的数据链路层的一些基本问题。其中的某些概念对广播信道也是适用的。
1、数据链路和帧
我们在这里要明确一下,“链路”和“数据链路”并不是一回事。
所谓链路(link)就是从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。在进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。
数据链路(data link)则是另一个概念。这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输(这将在后面几节讨论)。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器(既有硬件,也包括软件)来实现这些协议。一般的适配器都包括了数据链路层和物理层这两层的功能。
也有人采用另外的术语。这就是把链路分为物理链路和逻辑链路。物理链路就是上面所说的链路,而逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。
早期的数据通信协议曾叫作通信规程(procedure)。因此在数据链路层,规程和协议是同义语。
下面再介绍点对点信道的数据链路层的协议数据单元——帧。
数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。在互联网中,网络层协议数据单元就是IP数据报(或简称为数据报分组或包)。
为了把主要精力放在点对点信道的数据链路层协议上,可以采用如图(a)所示的三层模型。在这种三层模型中,不管在哪一段链路上的通信(主机和路由器之间或两个路由器之间),我们都看成是节点和节点的通信(如图中的节点A和节点B),而每个节点只有下三层——网络层、数据链路层和物理层。
点对点信道的数据链路层在进行通信时的主要步骤如下:
- 节点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
- 节点A把封装好的帧发送给节点B的数据链路层。
- 若节点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报交给上面的网络层;否则丢弃这个帧。
数据链路层不必考虑物理层如何实现比特传输的细节。我们甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方,如图(b)所示。
2、三个基本问题
数据链路层协议有许多种,但有三个基本问题则是共同的。这三个基本问题是:封装成帧、透明传输和差错检测。下面分别讨论这三个基本问题。
1)封装成帧
封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
下图表示用帧首部和帧尾部封装成帧的一般概念。我们知道,分组交换的一个重要概念就是:所有在互联网上传送的数据都以分组(即IP数据报)为传送单位。网络层的IP数据报传送到数据链路层就成为帧的数据部分。在帧的数据部分的前面和后面分别添加上首部和尾部,构成了一个完整的帧。这样的帧就是数据链路层的数据传送单元。
一个帧的帧长等于帧的数据部分长度加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。此外,首部和尾部还包括许多必要的控制信息。在发送帧时,是从帧首部开始发送的。各种数据链路层协议都对帧首部和帧尾部的格式有明确的规定。
显然,为了提高帧的传输效率,应当使帧的数据部分长度尽可能地大于首部和尾部的长度。但是,每一种链路层协议都规定了所能传送的帧的数据部分长度上限——最大传送单元 MTU (Maximum Transfer Unit)。下图给出了帧的首部和尾部的位置,以及帧的数据部分与 MTU 的关系。
当数据是由可打印的 ASCI码组成的文本文件时,定界可以使用特殊的定界符我们知道,ASCI码是7位编码,一共可组合成128个不同的ASCI码,其中可打印的有95 个®,而不可打印的控制字符有 33 个。下图的例子可说明帧定界的概念。控制字符 SOH(Start Of Header)放在一帧的最前面,表示帧的首部开始。另一个控制字符EOT(End OfTransmission)表示帧的结束。请注意,SOH 和EOT 都是控制字符的名称。它们的十六进制编码分别是01(二进制是00000001)和04(二进制是00000100)。SOH(或EOT)并不是S,O,H(或 E,O,T)三个字符。此外,为了强调帧定界符的作用,与帧定界符无关的控制信息在下图中都省略了。
当数据在传输中出现差错时,帧定界符的作用更加明显。假定发送端在尚未发送完个帧时突然出故障,中断了发送。但随后很快又恢复正常,于是重新从头开始发送刚才未发送完的帧。由于使用了帧定界符,接收端就知道前面收到的数据是个不完整的帧(只有首部开始符SOH而没有传输结束符EOT),必须丢弃。而后面收到的数据有明确的定界符(SOH和EOT),因此这是一个完整的,应当收下。
2)透明传输
由于帧的开始和结束的标记使用专门指明的控制字符,因此,所传输的数据中的任何8比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。
当传送的帧是用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像 SOH 或EOT 这样的帧定界控制字符。可见不管从键盘上输入什么字符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输。
但当数据部分是非 ASCI 码的文本文件时(如二进制代码的计算机程序或图像等),情况就不同了。如果数据中的某个字节的二进制代码恰好和SOH或EOT这种控制字符一样(如下图所示),数据链路层就会错误地“找到帧的边界”,把部分帧收下(误认为是个完整的帧),而把剩下的那部分数据丢弃(这部分找不到帧定界控制字符SOH)。
像上图所示的帧的传输显然就不是“透明传输”,因为当遇到数据中碰巧出现字符“EOT”时就传不过去了。数据中的“EOT”将被接收端错误地解释为“传输结束”的控制字符,而在其后面的数据因找不到“SOH”被接收端当作无效帧而丢弃。但实际上在数据中出现的字符“EOT”并非控制字符而仅仅是二进制数据00000100。
前面提到的“透明”是一个很重要的术语。它表示:某一个实际存在的事物看起来却好像不存在一样(例如,你看不见在你前面有块100%透明的玻璃的存在)。“在数据链路层透明传送数据”表示无论什么样的比特组合的数据,都能够按照原样没有差错地通过这个数据链路层。因此,对所传送的数据来说,这些数据就“看不见”数据链路层有什么妨碍数据传输的东西。或者说,数据链路层对这些数据来说是透明的。
为了解决透明传输问题,就必须设法使数据中可能出现的控制字符“SOH”和“EOT”在接收端不被解释为控制字符。具体的方法是:发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是 1B,二进制是00011011)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stufing)或字符填充(character stufing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。
下图表示用字节填充法解决透明传输的问题。
3)差错检测
现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1。这就叫作比特差错。比特差错是传输差错中的一种。本小节所说的“差错”,如无特殊说明,就是指“比特差错”。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER(Bit Error Rate)。
例如,误码率为 1 0 − 10 10^{-10} 10−10时,表示平均每传送 1 0 − 10 10^{-10} 10−10个比特就会出现一个比特的差错。误码率与信噪比有很大的关系。如果设法提高信噪比,就可以使误码率减小。实际的通信链路并非是理想的,它不可能使误码率下降到零。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)的检错技术。
下面我们通过一个简单的例子来说明循环几余检验的原理。
在发送端,先把数据划分为组,假定每组k个比特。现假定待传送的数据M=101001(k=6)。CRC运算就是在数据M的后面添加供差错检测用的n位冗余码,然后构成一个帧发送出去,一共发送(k+n)位。在所要发送的数据后面增加n位的冗余码,虽然增大了数据传输的开销,但却可以进行差错检测。当传输可能出现差错时,付出这种代价往往是很值得的。
这n位冗余码可用以下方法得出。用二进制的模2运算"进行 2 n 2^n 2n乘M的运算,这相当于在 M后面添加n个0。得到的(k+n)位的数除以收发双方事先商定的长度为(n+1)位的除数 P,得出商是0而余数是R(n位,比P少一位)。关于除数P下面还要介绍。在图3-8所示的例子中,M=101001(即k=6)。假定除数P=1101(即n=3)。经模2除法运算后的结果是:商O=110101(这个商并没有什么用处),而余数R=001。这个余数R就作为几余码拼接在数据 M的后面发送出去。这种为了进行检错而添加的冗余码常称为帧检验序列 FCS (Frame Check Sequence)。因此加上 FCS 后发送的帧是 101001001(即 2 n 2^n 2n+ FCS),共有(k+n)位。
顺便说一下,循环冗余检验CRC和帧检验序列FCS并不是同一个概念。CRC是一种检错方法,而FCS是添加在数据后面的冗余码,在检错方法上可以选用CRC,但也可不选用 CRC。
PS:注:用模2运算进行加法时不进位,例如,1111+1010=0101。减法和加法一样,按加法规则计算。
在接收端把接收到的数据以帧为单位进行CRC 检验:把收到的每一个都除以同样的除数P(模2运算),然后检查得到的余数R。
如果在传输过程中无差错,那么经过CRC检验后得出的余数R肯定是0(读者可以自己验算一下。被除数现在是 101001001,而除数是P=1101,看余数R是否为0)。但如果出现误码,那么余数R仍等于零的概率是非常非常小的。
总之,在接收端对收到的每一帧经过 CRC检验后,有以下两种情况:
- 若得出的余数R=0,则判定这个帧没有差错,就接受(accept)。
- 若余数R≠0,则判定这个帧有差错(但无法确定究竟是哪一位或哪几位出现了差错),就丢弃。
一种较方便的方法是用多项式来表示循环几余检验过程。在上面的例子中,用多项式P(X)= X 3 X^3 X3+ X 2 X^2 X2+1表示上面的除数P=1101(最高位对应于 X 3 X^3 X3,最低位对应于 X 0 X^0 X0)。多项式P(X)称为生成多项式。现在广泛使用的生成多项式P(X)有以下几种:
在数据链路层,发送端帧检验序列FCS的生成和接收端的CRC检验都是用硬件完成的,处理很迅速,因此并不会延误数据的传输。
从以上的讨论不难看出,如果我们在传送数据时不以帧为单位来传送,那么就无法加入冗余码以进行差错检验。因此,如果要在数据链路层进行差错检验,就必须把数据划分为帧,每一帧都加上冗余码,一帧接一帧地传送,然后在接收方逐进行差错检验。
最后再强调一下,在数据链路层若仅仅使用循环冗余检验CRC差错检测技术,则只能做到对帧的无差错接受,即:“凡是接收端数据链路层接受的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错”。接收端丢弃的帧虽然曾收到了,但最终还是因为有差错被丢弃,即没有被接受。以上所述的可以近似地表述为(通常都是这样认为):“凡是接收端数据链路层接受的帧均无差错”。
请注意,我们现在并没有要求数据链路层向网络层提供“可靠传输”的服务。所谓“可靠传输”就是:数据链路层的发送端发送什么,在接收端就收到什么。传输差错可分为两大类:一类就是前面所说的最基本的比特差错,而另一类传输差错则更复杂些,这就是收到的帧并没有出现比特差错,但却出现了帧丢失、帧重复或帧失序。例如,发送方连续传送三个帧:[#1]-[#2]-[#3]。假定接收端收到的每一个帧都没有比特差错,但却出现下面的几种情况:
- 帧丢失:收到[#11]-[#3](丢失[#2])。
- 帧重复:收到[#1]-[#2]-[#2]-[#3](收到两个[#2])。
- 帧失序:收到[#1]-[#3]-[#2](后发送的帧反而先到达了接收端,这与一般数据链路层的传输概念不一样)。
以上三种情况都属于“出现传输差错”,但都不是这些帧里有“比特差错”。帧丢失很容易理解。但出现帧重复和帧失序的情况则较为复杂,对这些问题我们现在不展开讨论。在学完第5章的5.4节后,我们就会知道在什么情况下接收端可能会出现帧重复或帧失序。
总之,我们应当明确,“无比特差错”与“无传输差错”并不是同样的概念。在数据链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输。
我们知道,过去OSI的观点是:必须让数据链路层向上提供可靠传输。因此在CRC检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。因此,现在互联网就采取了区别对待的方法:
对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议(例如,运输层的TCP协议)来完成。
对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务(见第9章)
实践证明,这样做可以提高通信效率。
可靠传输协议将在第5章中讨论。本章介绍的数据链路层协议都不是可靠传输的协议。
三、点对点协议 PPP
在通信线路质量较差的年代,在数据链路层使用可靠传输协议曾经是一种好办法。因此,能实现可靠传输的高级数据链路控制 HDLC(High-level Data Link Control)就成为当时比较流行的数据链路层协议。但现在HDLC已很少使用了。对于点对点的链路,简单得多的点对点协议 PPP(Point-to-Point Protocol)则是目前使用得最广泛的数据链路层协议。
1、PPP协议的特点
我们知道,互联网用户通常都要连接到某个ISP才能接入到互联网。PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议。
1)PPP 协议应满足的需求
IETF 认为,在设计PPP协议时必须考虑以下多方面的需求
- 简单:IETF在设计互联网体系结构时把其中最复杂的部分放在TCP协议中,而网际协议 IP则相对比较简单,它提供的是不可靠的数据报服务。在这种情况下,数据链路层没有必要提供比IP协议更多的功能。因此,对数据链路层的帧,不需要纠错,不需要序号,也不需要流量控制。IETF 把“简单”作为首要的需求。
总之,这种数据链路层的协议非常简单:接收方每收到一个帧,就进行CRC检验。如CRC 检验正确,就收下这个帧;反之,就丢弃这个帧,其他什么也不做。 - 封装成帧:PPP协议必须规定特殊的字符作为帧定界符(即标志一个帧的开始和结束的字符),以便使接收端从收到的比特流中能准确地找出帧的开始和结束位置。
- 透明性:PPP协议必须保证数据传输的透明性。这就是说,如果数据中碰巧出现了和帧定界符一样的比特组合时,就要采取有效的措施来解决这个问题。
- 多种网络层协议:PPP 协议必须能够在同一条物理链路上同时支持多种网络层协议(如IP和IPX等)的运行。当点对点链路所连接的是局域网或路由器时,PPP协议必须同时支持在链路所连接的局域网或路由器上运行的各种网络层协议。
- 多种类型链路:除了要支持多种网络层的协议外,PPP还必须能够在多种类型的链路上运行。例如,串行的(一次只发送一个比特)或并行的(一次并行地发送多个比特)同步的或异步的,低速的或高速的,电的或光的,交换的(动态的)或非交换的(静态的)点对点链路。
- 差错检测(error detection):PPP协议必须能够对接收端收到的帧进行检测,并立即丢弃有差错的帧。若在数据链路层不进行差错检测,那么已出现差错的无用帧就还要在网络中继续向前转发,因而会白白浪费许多的网络资源。
- 检测连接状态:PPP协议必须具有一种机制能够及时(不超过几分钟)自动检测出链路是否处于正常工作状态。当出现故障的链路隔了一段时间后又重新恢复正常工作时,就特别需要有这种及时检测功能。
- 最大传送单元:PPP协议必须对每一种类型的点对点链路设置最大传送单元MTU 的标准默认值"。这样做是为了促进各种实现之间的互操作性。如果高层协议发送的分组过长并超过 MTU 的数值,PPP就要丢弃这样的帧,并返回差错。需要强调的是,MTU是数据链路层的帧可以载荷的数据部分的最大长度,而不是帧的总长度。
- 网络层地址协商:PPP协议必须提供一种机制使通信的两个网络层(例如,两个IP 层)的实体能够通过协商知道或能够配置彼此的网络层地址。协商的算法应尽可能简单,并且能够在所有的情况下得出协商结果。这对拨号连接的链路特别重要,因为如果仅仅在链路层建立了连接而不知道对方网络层地址,则还不能够保证网络层可以传送分组。
- 数据压缩协商:PPP协议必须提供一种方法来协商使用数据压缩算法。但PPP
协议并不要求将数据压缩算法进行标准化。
在TCP/IP协议族中,可靠传输由运输层的TCP协议负责,因此数据链路层的PPP协议不需要进行纠错,不需要设置序号,也不需要进行流量控制。PPP协议不支持多点线路(即一个主站轮流和链路上的多个从站进行通信),而只支持点对点的链路通信。此外,PPP协议只支持全双工链路。
2)PPP 协议的组成
PPP协议有三个组成部分:
- 一个将IP数据报封装到串行链路的方法。PPP既支持异步链路(无奇偶检验的8比特数据),也支持面向比特的同步链路。IP数据报在PPP帧中就是其信息部分。这个信息部分的长度受最大传送单元 MTU的限制。
- 一个用来建立、配置和测试数据链路连接的链路控制协议LCP
- 一套网络控制协议 NCP (Network Control Protocol),其中的每一个协议支持不同的网络层协议,如IP、OSI的网络层、DECnet和AppleTalk等。
2、PPP协议的帧格式
1)各字段的意义
PPP的帧格式如下图所示。PPP帧的首部和尾部分别为四个字段和两个字段。
首部的第一个字段和尾部的第二个字段都是标志字段F(Flag),规定为0x7E(符号“0x’表示它后面的字符是用十六进制表示的。十六进制的 7E的二进制表示是 01111110)。标志字段表示一个帧的开始或结束。因此标志字段就是PPP帧的定界符。连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃。
首部中的地址字段A规定为0xFF(即11111111),控制字段C规定为0x03(即00000011)。最初曾考虑以后再对这两个字段的值进行其他定义,但至今也没有给出。可见这两个字段实际上并没有携带 PPP帧的信息。
PPP首部的第四个字段是2字节的协议字段。当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。若为0xC021,则信息字段是PPP链路控制协议LCP的数据,而0x8021 表示这是网络层的控制数据。
信息字段的长度是可变的,不超过1500字节。
尾部中的第一个字段(2字节)是使用CRC的检验序列FCS
2)字节填充
当信息字段中出现和标志字段一样的比特(0x7E)组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。
当PPP使用异步传输时,它把转义符定义为0x7D(即01111101),并使用字节填充,RFC1662规定了如下所述的填充方法:
- 把信息字段中出现的每一个0x7E字节转变成为2字节序列(0x7D,0x5E)。
- 若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把0x7D转变成为2字节序列(0x7D.0x5D)。
由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。
3)零比特填充
PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP协议采用零比特填充方法来实现透明传输。
PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP协议采用零比特填充方法来实现透明传输零比特填充的具体做法是:在发送端,先扫描整个信息字段(通常用硬件实现,但也可用软件实现,只是会慢些)。只要发现有5个连续1,则立即填入一个0。因此经过这种零比特填充后的数据,就可以保证在信息字段中不会出现6个连续1。
接收端在收到一个帧时,先找到标志字段F以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现5个连续1时,就把这5个连续1后的一个0删除,以还原成原来的信息比特流(如下图所示)。这样就保证了透明传输:在所传送的数据比特流中可以传送任意组合的比特流,而不会引起对帧边界的错误判断。
3、PPP协议的工作状态
上一节我们通过PPP帧的格式讨论了PPP帧是怎样组成的。但PPP链路一开始是怎样被初始化的?当用户拨号接入ISP后,就建立了一条从用户个人电脑到ISP的物理连接。这时,用户个人电脑向ISP发送一系列的链路控制协议 LCP分组(封装成多个PPP帧),以便建立LCP连接。这些分组及其响应选择了将要使用的一些PPP参数。接着还要进行网络层配置,网络控制协议NCP给新接入的用户个人电脑分配一个临时的IP地址。这样,用户个人电脑就成为互联网上的一个有I地址的主机了。
当用户通信完毕时,NCP释放网络层连接,收回原来分配出去的IP地址。接着,LCP释放数据链路层连接。最后释放的是物理层的连接。
上述过程可用如下图所示的状态图来描述。
PPP链路的起始和终止状态永远是下图中的“链路静止”(Link Dead)状态,这时在用户个人电脑和 ISP的路由器之间并不存在物理层的连接。
当用户个人电脑通过调制解调器呼叫路由器时(通常是在屏幕上用鼠标点击一个连接按钮),路由器就能够检测到调制解调器发出的载波信号。在双方建立了物理层连接后,PPP 就进入“链路建立”(Link Establish)状态,其目的是建立链路层的 LCP 连接。
这时 LCP 开始协商一些配置选项,即发送LCP 的配置请求帧(Configure-Request)。这是个 PPP帧,其协议字段置为LCP对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种:
- 配置确认帧(Confgure-Ack):所有选项都接受。
- 配置否认帧(Confgure-Nak):所有选项都理解但不能接受。
- 配置拒绝帧(Confgure-Reject):选项有的无法识别或不能接受,需要协商。
LCP 配置选项包括链路上的最大帧长、所使用的鉴别协议(Authentication Protocol)的规约(如果有的话),以及不使用PPP帧中的地址和控制字段(因为这两个字段的值是固定的没有任何信息量,可以在PPP帧的首部中省略这两个字节)。
协商结束后双方就建立了 LCP 链路,接着就进入“鉴别”(Authenticate)状态。在这-状态,只允许传送LCP协议的分组、鉴别协议的分组以及监测链路质量的分组。若使用口令鉴别协议 PAP (Password Authentication Protocol),则需要发起通信的一方发送身份标识符和口令。系统可允许用户重试若干次。如果需要有更好的安全性,则可使用更加复杂的口令握手鉴别协议 CHAP(Challenge-Handshake Authentication Protocol)。若鉴别身份失败,则转到“链路终止”(Link Terminate)状态。若鉴别成功,则进入“网络层协议”(Network-LayerProtocol)状态。
在“网络层协议”状态,PPP链路两端的网络控制协议NCP根据网络层的不同协议相交换网络层特定的网络控制分组。这个步骤是很重要的,因为现在的路由器都能够同时支持多种网络层协议。总之,PPP协议两端的网络层可以运行不同的网络层协议,但仍然可使用同一个 PPP 协议进行通信。
如果在PPP链路上运行的是P协议,则对PPP链路的每一端配置IP协议模块(如分配IP地址)时就要使用 NCP中支持IP的协议–IP控制协议IPCP(IP Control Protocol)IPCP分组也封装成PPP帧(其中的协议字段为0x8021)在PPP链路上传送。在低速链路上运行时,双方还可以协商使用压缩的TCP和IP首部,以减少在链路上发送的比特数。
当网络层配置完毕后,链路就进入可进行数据通信的“链路打开”(Link Open)状态。链路的两个PPP端点可以彼此向对方发送分组。两个PPP端点还可发送回送请求LCP分组
(Echo-Request)和回送回答LCP 分组(Echo-Reply),以检查链路的状态。
数据传输结束后,可以由链路的一端发出终止请求LCP分组(Terminate-Request)请求终止链路连接,在收到对方发来的终止确认LCP分组(Terminate-Ack)后,转到“链路终止状态。如果链路出现故障,也会从“链路打开”状态转到“链路终止”状态。当调制解调器的载波停止后,则回到“链路静止”状态。
上图右方的灰色方框给出了对PPP协议的几个状态的说明。从设备之间无链路开始到先建立物理链路,再建立链路控制协议LCP链路。经过鉴别后再建立网络控制协议NC链路,然后才能交换数据。由此可见,PPP协议已不是纯粹的数据链路层的协议,它还包含了物理层和网络层的内容。