数据链路层最重要的内容是:
本文主要讲解在数据链路层上最常用的点对点协议PPP。
在通信线路质量较差的年代,在数据链路层使用可靠传输协议曾经是一种好办法。因此,能实现可靠传输的高级数据链路控制HDLC(High-level Data Link Control)就成为当时比较流行的数据链路层协议。但现在HDLC已很少使用了。对于点对点的链路,简单得多的点对点协议PPP(Point-to-Point Protocol)则是目前使用得最广泛的数据链路层协议。
我们知道,互联网用户通常都要连接到某个ISP才能接入到互联网。PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议。

PPP协议是IETF在1992年制定的。经过1993年和1994年的修订,现在的PPP协议在1994年就已成为互联网的正式标准。
IETF认为,在设计PPP协议时必须考虑以下多方面的需求:
在TCP/IP协议族中,可靠传输由运输层的TCP协议负责,因此数据链路层的PPP协议不需要进行纠错,不需要设置序号,也不需要进行流量控制。PPP协议不支持多点线路(即一个主站轮流和链路上的多个从站进行通信),而只支持点对点的链路通信。此外,PPP协议只支持全双工链路。
PPP协议有三个组成部分:
PPP的帧格式如下图所示。PPP帧的首部和尾部分别为四个字段和两个字段。
F(Flag),规定为0x7E(符号“0x”表示它后面的字符是用十六进制表示的。十六进制的7E的二进制表示是0111110)。 标志字段表示一个帧的开始或结束。因此标志字段就是PPP帧的定界符。连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃。A规定为0xFF(即1111111), 控制字段C规定为0x03(即00000011)。最初曾考虑以后再对这两个字段的值进行其他定义,但至今也没有给出。可见这两个字段实际上并没有携带PPP帧的信息。0x0021时,PPP帧的信息字段就是IP数据报;0xC021,则信息字段是PPP链路控制协议LCP的数据;0x8021,则表示这是网络层的控制数据。FCS。
当信息字段中出现和标志字段一样的比特(0x7E)组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。
当PPP使用异步传输时,它把转义符定义为0x7D(即01111101),并使用字节填充,RFC 1662规定了如下所述的填充方法:
0x7E字节转变成为2字节序列(0x7D, 0x5E)。0x7D的字节(即出现了和转义字符一样的比特组合),则把0x7D转变成为2字节序列(0x7D, 0x5D)。0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为2字节序列(0x7D, 0x23)。由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。
PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP协议采用零比特填充方法来实现透明传输。
零比特填充的具体做法是:在发送端,先扫描整个信息字段(通常用硬件实现,但也可用软件实现,只是会慢些)。只要发现有5个连续1,则立即填入一个0。因此经过这种零比特填充后的数据,就可以保证在信息字段中不会出现6个连续1。接收端在收到一个帧时,先找到标志字段F以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现5个连续1时,就把这5个连续1后的一个0删除,以还原成原来的信息比特流(如下图所示)。这样就保证了透明传输:在所传送的数据比特流中可以传送任意组合的比特流,而不会引起对帧边界的错误判断。

上一节我们通过PPP帧的格式讨论了PPP帧是怎样组成的。但PPP链路一开始是怎样被初始化的?当用户拨号接入ISP后,就建立了一条从用户个人电脑到ISP的物理连接。这时,用户个人电脑向ISP发送一系列的链路控制协议LCP分组(封装成多个PPP帧),以便建立LCP连接。这些分组及其响应选择了将要使用的一些PPP参数。接着还要进行网络层配置,网络控制协议NCP给新接入的用户个人电脑分配一个临时的IP地址。这样,用户个人电脑就成为互联网上的一个有IP地址的主机了。当用户通信完毕时,NCP释放网络层连接,收回原来分配出去的IP地址。接着,LCP释放数据链路层连接。最后释放的是物理层的连接。
上述过程可用如下图所示的状态图来描述。PPP链路的起始和终止状态永远是图中的“链路静止”(Link Dead)状态,这时在用户个人电脑和ISP的路由器之间并不存在物理层的连接。

当用户个人电脑通过调制解调器呼叫路由器时(通常是在屏幕上用鼠标点击一个连接按钮),路由器就能够检测到调制解调器发出的载波信号。在双方建立了物理层连接后,PPP就进入“链路建立”(Link Establish)状态,其目的是建立链路层的LCP连接。这时LCP开始协商一些配置选项,即发送LCP的配置请求帧(Configure-Request)。这是个PPP帧,其协议字段置为LCP对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种:
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链路上运行的是IP协议,则对PPP链路的每一端配置IP协议模块(如分配IP地址)时就要使用NCP中支持IP的协议一IP控制协议IPCP(IP Control Protocol)。IPCP分组也封装成PPP帧(其中的协议字段为
0x8021)在PPP链路上传送。在低速链路上运行时,双方还可以协商使用压缩的TCP和IP首部,以减少在链路上发送的比特数。
数据传输结束后,可以由链路的一端发出终止请求LCP分组(Terminate-Request)请求终止链路连接,在收到对方发来的终止确认LCP分组(Terminate-Ack)后,转到“链路终止”状态。如果链路出现故障,也会从“链路打开”状态转到“链路终止”状态。当调制解调器的载波停止后,则回到“链路静止”状态。
上图右方的灰色方框给出了对PPP协议的几个状态的说明。从设备之间无链路开始,到先建立物理链路,再建立链路控制协议LCP链路。经过鉴别后再建立网络控制协议NCP链路,然后才能交换数据。由此可见,PPP协议已不是纯粹的数据链路层的协议,它还包含了物理层和网络层的内容。