数据链路层使用的信道主要有以下两种:

  1. 点对点信道。这种信道使用一对一的点对点通信方式。
  2. 广播信道。这种信道使用一对多的广播通信方式。

参考:https://wenku.baidu.com/view/8084205aa22d7375a417866fb84ae45c3a35c243.html

点对点信道的数据链路层

数据链路和帧

数据链路(data link):当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器(如拨号上网使用拨号适配器,以及通过以太网上网使用局域网适配器)来实现这些协议的硬件和软件。一般的适配器都包括了数据链路层和物理层这两层的功能。

数据链路层的协议数据单元——帧(frame)。数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。

为了把主要精力放在点对点信道的数据链路层协议上,可以采用如下图(a)所示的三层模型。不管在哪一段链路上的通信(主机和路由器之间或两个路由器之间),我们都看成是结点和结点的通信(如图中的结点 A 和 B),而每个结点只考虑下三层——网络层、数据链路层和物理层。

image-20210721171718417

点对点信道的数据链路层在进行通信时的主要步骤:

  1. 结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
  2. 结点A把封装好的帧发送给结点B的数据链路层。
  3. 若结点 B 的数据链路层收到的帧无差错,则从收到的帧中提取出 IP 数据报上交给上面的网络层,否则丢弃这个帧。

封装成帧

数据链路层以帧为单位传输和处理数据。网络层的IP数据报必须向下传送到数据链路层,成为帧的数据部分,同时它的前面和后面分别添加上首部和尾部,封装成一个完整的帧。帧的长度等于帧的数据部分长度加上帧首部和帧尾部的长度。

数据链路层必须使用物理层提供的服务来传输一个一个的帧。数据链路层的接收方为了能以帧为单位处理接收的数据,必须正确识别每个帧的开始和结束,即进行帧定界。首部和尾部的作用之一就是进行帧定界,同时也包括其他必要的控制信息。

在发送帧时,是从帧首部开始发送的。各种数据链路层协议都要对帧首部和帧尾部的格式有明确的规定。虽然,为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大些,但考虑到差错控制等多种因素,每一种链路层协议都规定了帧的数据部分长度的上限,即最大传送单元(Maximum Transfer Unit, MTU)

image-20210721172355550

实现帧定界有多种方法,比如下面三种:

  • 一种简单的方法就是在传输的帧和帧之间插入时间间隔。例如,我们后面将要讨论的以太网就采用了这种方法。不过并不是所有的物理层传输服务都会保证数据链路层发送帧的时间间隙,某些物理层链路会将传输数据间的间隔给“挤掉”,也有可能在一个帧的中间被插入时间间隙。因此该方法不一定能适用所有场合。
  • 一种在帧的首部设一个帧长度字段来定位一个帧的结束和下一个帧的开始。但如果帧长度字段在传输中出现差错,会导致后面一系列帧无法正确定界,因此在数据链路层较少使用。
  • 一种常用的方法是在每个帧的开始和结束添加一个特殊的帧定界标志,标记一个帧的开始或结束。帧开始标志和帧结束标志可以不同也可以相同。由于帧的开始标志和结束标志使用专门的控制字符,所传输的数据中不能出现和用作帧定界的控制字符的比特编码一样的字节,否则就会出现帧定界的错误。

针对上面说的第三种帧定界方法引发的问题,下面介绍两种解决办法:

PS:字节填充方法。发送端的数据链路层在数据中出现的标记字符前面插入一个转义字符(例如一种特殊的控制字符“ESC”)。

image-20210721180317643

PS:零比特填充法:当物理链路提供的是面向比特的传输服务时(物理链路传送连续的比特流),帧定界标志可以使用某个特殊的比特组合,例如PPP协议所使用的“01111110”。由于帧的长度不再要求必须是整数个字节,可以采用开销更小的比特填充。

image-20210721185431685

差错检测

现实的通信链路都不会是理想的,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1。这就叫作比特差错。传输错误的比特占所传输比特总数的比率称为误码率(Bit Error Rate,BER)。

虽然各种差错检测技术的具体方法差别很大,但它们最基本的原理是一样的。发送方需要采用某种差错检测算法f,用发送的数据D计算出差错检测码EDC=f(D),并将EDC随数据一起发送给接收方。接收方通过同样的算法计算接收数据D′的差错检测码EDC′,如果EDC′ !=f(D'),则可以判断传输的数据中出现了差错,即检测出差错。接收方未检测出差错并不代表传输的数据中一定没有出现差错,但出现差错的概率非常小。一般而言,为了提高差错检测的检错率,可以使用更长的差错检测码和更复杂的算法,当然也会导致更大的开销。

image-20210721190619425

在数据链路层,为了便于硬件检测差错,通常在帧的尾部设置一个差错检验字段存放整个帧(包含首部和数据)的差错检测码,这个差错检验字段常称为帧检验序列(Frame Check Sequence, FCS)。因此,要在数据链路层进行差错检验,就必须把数据划分为帧,每一帧都加上差错检测码,一帧接一帧地传送,然后在接收方逐帧进行差错检验。

在数据链路层通常使用**循环冗余检验(Cyclic Redundancy Check,CRC)**技术进行差错检测。CRC有很好的检错能力,虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于现代计算机网络的数据链路层。检测用硬件完成,处理很快,对数据传输的延误非常小。

CRC只能检测出帧在传输中出现了差错,并不能纠正错误。接收端丢弃的帧虽然曾收到了,但最终还是因为有差错被丢弃。另一个角度可以说:“凡是接收端数据链路层接受的帧均无差错”。

要想纠正传输中的差错可以使用冗余信息更多的纠错码,进行前向纠错(Forward Error Correction,FEC)。由于纠错码要发送更多的冗余信息,开销非常大,实际较少使用。通常采用检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,由上层协议去解决数据丢失的问题。

可靠传输

事实上如何保证数据传输的可靠性是计算机网络中的一个非常重要的问题,也是各层协议均可选择的一个重要功能。这里所讨论的可靠传输基本原理并不仅局限于数据链路层,可以应用到计算机网络体系结构中各层协议之中

可靠传输协议为上层的对等实体间提供一条可靠信道,不会出现比特差错、分组丢失、分组重复,也不会出现分组失序。如何确保呢?

  1. 停止等待协议

实现可靠传输的基本方法:如果发现错误就重传。

为了让发送方知道是否出现了差错,接收方必须将是否正确接收分组的信息反馈给发送方。下图(a)所示(DATA表示数据分组),当正确接收到一个分组时,向发送方发送一个确认分组 ACK (Acknowledgment),当接收到的分组出现比特差错时,丢弃该分组并发送一个否认分组 NAK (Negative Acknowledgment)。发送方收到ACK则可以发送下一个分组,而收到NAK则要重传原来的分组,直到收到ACK为止。由于发送方每发送完一个分组必须停下来等接收到确认后才能发送下一个分组,该协议被称为停止等待协议。

当数据分组或确认分组丢失时,发送方将会一直等待接收方的确认分组。于是发送方发送完一个数据分组时,启动一个超时计时器,若到了超时计时器所设置的重传时间timeout而发送方仍收不到接收方的任何确认分组,则重传原来的分组(下图(b))。这就叫作超时重传。显然,超时计时器设置的重传时间应仔细选择。若重传时间太短,则在正常情况下也会在对方的确认信息到达发送方之前就过早地重传数据。若重传时间太长,则往往要白白等待很长时间。一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”。在数据链路层点对点的往返时间比较确定,重传时间比较好设定,然而在运输层,由于端到端往返时间非常不确定,设置合适的重传时间有时并不容易,在学习TCP时我们将会仔细讨论该问题。

为了使协议实现起来更加简单,可以用超时重传来解决比特差错问题而完全不需要NAK。当接收方收到有比特差错的分组时,仅仅将其丢弃,而发送方无需通过接收 NAK 而是通过超时来进行重传。不过使用NAK可以使发送方重传更加及时。

然而问题并没有完全解决。当确认分组丢失时,接收方可能会收到两个同样的数据分组,即重复分组。若接收方不能识别重复分组,则会导致另一种差错——数据重复,这也是一种不允许出现的差错。为了解决该问题,必须使每个数据分组带上不同的发送序号。每发送一个新的数据分组就把它的发送序号加 1。若接收方连续收到发送序号相同的数据分组,就表明出现了重复分组。这时应当丢弃重复的分组。但应注意,此时接收方还必须向发送方再补发一个确认分组ACK(下图(c))。

从(a)到(d)不断完善的停止等待协议 :

image-20210721201035061

任何一个编号系统的序号所占用的比特数一定是有限的。因此,经过一段时间后,发送序号就会被重复使用。例如,当发送序号占用3bit时,就有8个不同的发送序号。因此,要进行编号就要考虑序号到底要占用多少个比特。序号占用的比特数越少,数据传输的额外开销就越少。若不考虑失序情况(后发送的分组比先发送的分组先到达),对于停止等待协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组,其发送序号与上次发送的分组的序号不同就可以了,因此用一个比特来编号就够了。数据链路层一般不会失序,但对于底层信道会出现分组失序的情况(如在运输层)。

那么确认分组需不需要编号呢?上图(d)所示,由于往返时间的不确定性,有可能一个迟到的确认导致发送方过早超时。过早超时会使接收方收到重复的确认分组,发送方应该丢弃重复的确认分组,针对这种情况确认分组也应该使用序号。由于数据链路层点对点的往返时间比较确定,不太会出现过早超时情况,在数据链路层实现停止等待协议也可以不对确认分组进行编号。

使用上述的确认和重传机制,我们就可以在不可靠的信道上实现可靠的数据传输。像上述的这类通过确认和超时重传机制实现的可靠传输协议,常称为自动请求重传(Automatic Repeat reQuest,ARQ)协议。意思是重传的请求是自动进行的。因为不需要接收方显式地请求发送方重传某个出错的分组。这里要注意的是,发送方发送完一个分组后,必须暂时保留已发送的分组的副本(为重传时使用)。只有在收到相应的确认后才能清除该分组副本。保留复本、重传、确认和编号都是可靠传输协议实体自己的行为,而上层实体完全感觉不到这些。

  1. 停止等待协议的算法描述

在发送方:

(1)从主机取一个数据帧;
(2)V(S)←0,{发送状态变量初始化};
(3)N(S)←V(S),{将发送状态变量的数值写入发送序号N(S)},将数据帧送交发送缓存;
(4)将发送缓存中的数据帧发送出去;
(5)设置超时计时器,{选择适当的超时重传时间 tout};
(6)等待,{等待以下(7)~(9)这三个事件中最先出现的一个};
(7)若收到确认帧 ACK,且确认序号 A(R)=V(S),则从主机取一个新的数据帧,V(S)←[V(S)+1]mod2N,
    {更新发送状态变量,N为序号字段位数},转到 (3);
(8)若收到确认帧 ACK,且确认序号 A(R)≠ V(S),则转到(6),{重复确认,忽略};
(9)若超时计时器时间到,则转到(4),{重传数据帧}。

在接收方:

(1)V(R)←0,{接收状态变量初始化,其数值等于欲接收的数据帧序号};
(2)等待;
(3)当收到一个数据帧,就检查有无产生传输差错(如用CRC),若检查结果正确无误,则执行后续算法,否则
    丢弃此数据帧,然后转到(2);
(4)若N(S)=V(R),则执行后续算法,{收到发送序号正确的数据帧},否则丢弃此数据帧,然后转到(8),
    {收到重复数据帧,重发确认帧};
(5)将收到的数据帧中的数据部分送交主机;
(6)V(R)←[V(R)+1]mod2N,{更新接收状态变量,准备接收下一个数据帧};
(7)生成新的确认帧ACK,A(R)←V(R),{将接收状态变量的数值写入确认序号A(R)};
(8)发送已生成的确认帧ACK,并转到(2)。

停止等待协议中需要特别注意的地方,就是在收发两端各设置一个本地状态变量记录当前的发送序号或接收序号。

(1)每发送一个数据帧,都必须将发送状态变量 V(S)的值写到数据帧的发送序号 N(S)上。但只有收到一个序号正确的确认帧ACK后,才更新发送状态变量V(S)一次并发送新的数据帧。

(2)在接收端,每接收到一个数据帧,就要将发送方在数据帧上设置的发送序号N(S)与本地的接收状态变量V(R)相比较。若二者相等就表明是新的数据帧(更新状态变量,生成并发送确认帧ACK),否则为重复帧。

(3)在接收端,若收到一个重复帧,则丢弃它(即不做任何处理),且接收状态变量不变,但此时需向发送端重发上次的确认帧ACK(序号不变)。

(4)发送方在发送完数据帧时,必须在其发送缓存中保留此数据帧的副本。这样才能在出差错时进行重传。只有在收到对方发来的确认帧ACK时,方可清除此副本。

(5)这里为了协议的简单性没有使用NAK,但对于误码率比较高的点对点链路,使用NAK可以使发送方能更加及时地进行重传而不需要等待超时。

  1. 停等协议的流水线化

停止等待协议的优点是简单,但缺点是信道利用率太低。我们可以用图3-13来说明这个问题。为了简单起见,就假定在A和B之间有一条直通的信道来传送分组。

image-20210722113027568

假定A 发送分组需要的时间是TD。显然,TD等于分组长度除以数据率。再假定分组正确到达 B 后,B 处理分组的时间可以忽略不计,同时立即发回确认。假定 B 发送确认分组需要时间TA。如果 A 处理确认分组的时间也可以忽略不计,那么 A 在经过时间(TD+RTT+TA)后就可以再发送下一个分组,这里的 RTT(Round-Trip Time)是往返时间。因此信道的利用率U可用下式计算:

image-20210722123826478

当RTT远大于分组发送时间TD时,信道的利用率就会非常低。还应注意的是,这里还没有考虑出现差错后的分组重传。若出现重传,则对传送有用的数据信息来说,信道的利用率就还要降低。但是,当RTT远小于分组发送时间TD时,信道的利用率还是非常高的,因此停止等待协议应用于后面将要讨论的无线局域网

在RTT相对较大的情况下,为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输方式(见下图)。流水线传输方式就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。

image-20210722123959216

  1. 回退N步协议

当使用流水线传输方式时,发送方不间断地发送分组可能会使接收方或网络来不及处理这些分组,从而导致分组的丢失。因此发送发不能无限制地一直发送分组,必须采取措施限制发送方连续发送分组的个数。

回退N步(Go-back-N,GBN)协议在流水线传输的基础上利用发送窗口来限制发送方连续发送分组的个数,是一种连续 ARQ 协议

为此,在发送方要维持一个发送窗口。发送窗口是允许发送方已发送但还没有收到确认的分组序号的范围,窗口大小就是发送方已发送但还没有收到确认的最大分组数。实际上,发送窗口为1的GBN协议就是我们刚刚讨论过的停止等待协议。

下图为例,发送窗口大小为5,位于发送窗口内的5个分组都可连续发送出去,而不需要等待对方的确认。GBN协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。下图(b)表示发送方收到了对第 1 个分组的确认,于是把发送窗口向前移动一个分组的位置。如果原来已经发送了前5个分组,那么现在就可以发送窗口内的第6个分组了。在协议的工作过程中发送窗口不断向前滑动,因此这类协议又称为滑动窗口协议

image-20210722124319884

下图为发送窗口大小为4时GBN协议的工作过程。

这里要注意以下3点。

(1)接收方只按序接收分组。下图(b)所示,虽然在出现差错的数据分组DATA2之后收到了正确的分组DATA3、DATA4和DATA5,但都必须将它们丢弃,因为在没有正确接收DATA2之前,这些分组都是失序到达的分组。当收到序号不对的分组,接收方除了将它们丢弃外,还要对最近按序接收的分组进行确认。如果将接收方允许接收的分组序号的范围定义为接收窗口的话, GBN协议的接收窗口大小则为1。接收方只接收序号落在接收窗口内的分组并向前滑动接收窗口。

(2)在发送方,依然采用超时机制来重传出现差错或丢失的分组。由于接收方只接收按序到达的分组,一旦某个分组出现差错(超时),其后连续发送的所有分组都要被重传(见下图(b)),最多会重传窗口大小个分组。这就是 GBN 协议名称的由来,即一旦出错需要退回去重传已发送过的N个分组。

(3)接收方采用累积确认的方式。接收方对分组n的确认,表明接收方已正确接收到分组n及以前的所有分组。因此,接收方不一定要对收到的分组逐个发送确认,而是可以在收到几个分组后(由具体实现决定),对按序到达的最后一个分组发送确认。累积确认有优点也有缺点。优点是容易实现,即使确认丢失也可能不必重传。但缺点是不能向发送方准确反映出接收方已经正确收到的所有分组的信息。

image-20210722124401040

  1. 选择重传协议

GBN协议存在一个缺点:一个分组的差错可能引起大量分组的重传,这些分组可能已经被接收方正确接收了,但由于未按序到达而被丢弃。显然对这些分组的重传是对通信资源的极大浪费。为进一步提高性能,可设法只重传出现差错的分组,但这时接收窗口不再为 1,以便先收下失序到达但仍然处在接收窗口中的那些分组,等到所缺分组收齐后再一并送交上层。这就是选择重传(Selective Repeat,SR)协议

注意,为了使发送方仅重传出现差错的分组,接收方不能再采用累积确认,而需要对每个正确接收到的分组进行逐一确认。显然,SR协议比GBN协议要复杂,并且接收方需要有足够的缓存来暂存失序到达的分组。下图所示为当发送窗口和接收窗口大小均为4时的SR协议的工作过程。

image-20210722125528484

当接收方正确收到失序的分组时,只要落在接收窗口内就先缓存起来并发回确认,如DATA3、DATA4和DATA5,但是这些分组不能交付给上层。发送方在收到ACK2之前,发送窗口一直保持为 2~5,因此在发送完 DATA5 后只能暂停发送分组。发送方收到失序的ACK3、ACK4和ACK5后并不改变发送窗口,但要记录DATA3、DATA4和DATA5已被确认,因此只有DATA2被超时重传。注意,在SR中,ACKn仅表示对分组DATAn的确认。接收方收到重传的DATA2后,将其和已缓存的DATA3、DATA4和DATA5一起交付给上层,并将接收窗口改为6~9。发送方接收到盼望已久的ACK2后,将发送窗口改为6~9,并又可以继续发送分组DATA6~DATA9了。

  1. 数据链路层的可靠传输

不可靠的链路加上适当的协议(例如,停止等待协议)就可以使链路层向上提供可靠传输服务。但我们付出的代价是数据的传输效率降低了。因此,应当根据链路的具体情况来决定是否需要让链路层向上提供可靠传输服务。

在过去,由于通信链路质量不好(表现为误码率高),在数据链路层曾广泛使用可靠传输协议,但随着技术的发展,现在的有线通信链路的质量已经非常好了。由于通信链路质量不好引起差错的概率已大大降低,因此,现在因特网广泛使用的数据链路层协议都尽量不使用确认和重传机制,即不要求数据链路层向上提供可靠传输服务。若数据链路层传输数据偶尔出现了差错,并且需要进行改正,则改正差错的任务就由上层协议(例如,运输层的TCP协议)来完成。实践证明,这样做可以提高通信效率,降低设备成本。但是在使用无线信道传输数据时,由于无线信道误码率较高,往往需要在数据链路层实现可靠传输服务以尽快恢复差错,为上层提供较好的传输服务。

数据链路层点对点协议 PPP

简单得多的点对点协议(Point-to-Point Protocol,PPP)则是目前使用最广泛的点对点数据链路层协议。

因特网用户通常都要连接到某个ISP才能接入到因特网。用户计算机和ISP进行通信时,所使用的数据链路层协议通常就是PPP协议。PPP协议是IETF在1992年制定的。经过1993年和1994年的修订,现在的PPP协议已成为因特网的正式标准[RFC 1661, RFC 1662]。

PPP 的特点

(1)简单。数据链路层的PPP非常简单:接收方每收到一个帧,就进行CRC检验。如CRC检验正确,就收下这个帧;反之,就丢弃这个帧。使用PPP的数据链路层向上不提供可靠传输服务。如需要可靠传输,则由运输层来完成。

(2)封装成帧。PPP规定了特殊的字符作为帧定界符(即标志一个帧的开始和结束的字符),以便使接收端从收到的比特流中能准确地找出帧的开始和结束位置。

(3)透明性。PPP能够保证数据传输的透明性(即数据部分包含帧定界符,PPP转移处理,对上层透明)。

(4)多种网络层协议和多种类型链路。PPP能够在同一条物理链路上同时支持多种网络层协议(如IP和IPX等)的运行,以及能够在多种类型的点对点链路上运行。例如,一条拨号电话线路,一条SONET/SDH链路,一条X.25连接或者一条ISDN电路,这些链路可能是串行的或并行的,同步的或异步的,低速的或高速的,电的或光的等。PPP可以用于用户PC到ISP接入服务器间的点对点接入链路,也可以用于路由器之间的专用线路。

这里特别要提到的是,在 1999年公布的在以太网上运行的 PPP,即 PPP over Ethernet,简称为PPPoE。这就是PPP能够适应多种类型链路的一个典型例子。PPPoE使ISP可以通过DSL、电路调制解调器、以太网等宽带接入技术以以太网接口的形式为用户(一个或多个用户)提供接入服务。

(5)差错检测。PPP能够对接收端收到的帧进行差错检测(但不进行纠错),并立即丢弃有差错的帧。若在数据链路层不进行差错检测,那么已出现差错的无用帧,就还要在网络中继续向前转发,因而会白白浪费许多的网络资源。

(6)检测连接状态,PPP具有一种机制,能够及时(不超过几分钟)自动检测出链路是否处于正常工作状态。当出现故障的链路隔了一段时间后又重新恢复正常工作时,就特别需要有这种及时检测功能。

(7)最大传送单元。PPP对每一种类型的点对点链路设置最大传送单元MTU的标准默认值。如果高层协议发送的分组过长并超过 MTU 的数值,PPP 就要丢弃这样的帧,并返回差错。需要强调的是,MTU是数据链路层的帧可以载荷的数据部分的最大长度,而不是帧的总长度。

(8)网络层地址协商。PPP提供了一种机制使通信的两个网络层(例如,两个IP层)实体能够通过协商知道或能够配置彼此的网络层地址。这对拨号连接的链路特别重要,因为在链路层建立了连接后,用户需要配置一个网络层地址,才能在网络层传送分组。

PPP的组成

(1)一个将IP数据报封装到串行链路的方法。PPP既支持面向字符的异步链路(无奇偶检验的8比特数据),也支持面向比特的同步链路。IP数据报在PPP帧中作为信息部分被传输。这个信息部分的长度受最大传送单元MTU的限制。

(2)一个用来建立、配置和测试数据链路连接的链路控制协议(Link Control Protocol,LCP)。通信的双方可协商一些选项。在 RFC 1661 中定义了 11 种类型的 LCP 分组。

(3)一套网络控制协议(Network Control Protocol,NCP),其中的每一个协议支持不同的网络层协议,如IP、OSI的网络层、DECnet,以及AppleTalk等。

PPP的帧格式

1.各字段的意义

PPP的帧格式如下图。PPP帧的首部和尾部分别为四个字段和两个字段。

image-20210722140033480

首部的第一个字段和尾部的第二个字段都是标志字段 F (Flag),规定为 0x7E(符号“0x”表示它后面的字符是用十六进制表示的。十六进制的7E的二进制表示是01111110)。标志字段表示一个帧的开始或结束。因此标志字段就是PPP帧的定界符。连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃。

首部中的地址字段A规定为0xFF(即11111111),控制字段C规定为0x03(即00000011)。最初曾考虑以后再对这两个字段的值进行其他定义,但至今也没有给出。可见这两个字段实际上并没有携带PPP帧的信息。

PPP首部的第四个字段是2字节的协议字段。当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。若为0xC021,则信息字段是PPP链路控制协议LCP的分组,而0x8021表示这是网络控制协议NCP的分组。

信息字段的长度是可变的,不超过1500字节。

尾部中的第一个字段(2字节)是使用CRC的帧检验序列FCS,采用生成多项式CRC-CCITT算法。

2.透明传输

当信息字段中出现和标志字段一样的比特组合(0x7E)时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。

当 PPP 采用异步传输时,它把转义符定义为 0x7D,并使用字节填充。RFC 1662 规定了如下所述的填充方法。

  1. 把信息字段中出现的每一个 0x7E 字节转变成为 2 字节序列(0x7D, 0x5E)。
  2. 若信息字段中出现一个0x7D的字节,则把0x7D转变成为 2 字节序列(0x7D, 0x5D)。
  3. 若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为 2 字节序列(0x7D, 0x23)。

由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。

PPP用在SONET/SDH链路时,使用面向比特的同步传输(一连串的比特连续传送)而不是面向字符的异步传输(逐个字符地传送)。在这种情况下,PPP采用前面介绍的零比特填充方法来实现透明传输。

PPP的工作状态

PPP链路一开始是怎样被初始化的?这里以拨号接入为例简要介绍其过程。当用户拨号接通ISP拨号服务器后,就建立了一条从用户PC到ISP的物理连接。这时,用户PC向ISP发送一系列的LCP分组(封装成多个PPP帧),以便建立LCP连接。这些分组及其响应选择了将要使用的一些PPP参数。接着还要进行网络层配置,NCP给新接入的用户PC分配一个临时的IP地址。这样,用户PC就成为因特网上的一个有IP地址的主机了。

当用户通信完毕时,NCP释放网络层连接,收回原来分配出去的IP地址。接着,LCP释放数据链路层连接。最后释放的是物理层的连接。 上述过程可用下图的状态图来描述。

image-20210722142831845

PPP链路的起始和终止状态永远是上图中的“静止”状态,这时并不存在物理层的连接。当检测到调制解调器的载波信号,并建立物理层连接后,PPP 就进入链路的“建立” 状态。这时LCP开始协商一些配置选项,即发送LCP的配置请求帧(configure-request)。这是个PPP帧,其协议字段配置为LCP对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应。

  1. 配置确认帧(configure-ack):所有选项都接受。
  2. 配置否认帧(configure-nak):所有选项都理解但不能接受。
  3. 配置拒绝帧(configure-reject):有的选项无法识别或不能接受,需要协商。

LCP 配置选项包括链路上的最大帧长、所使用的鉴别协议(authentication protocol)的规约(如果有的话),以及不使用 PPP 帧中的地址和控制字段(因为这两个字段的值是固定的,没有任何信息量,可以在PPP帧的首部中省略这两个字节)。

协商结束后就进入“鉴别”状态。若通信的双方鉴别身份成功,则进入“网络”状态。这就是PPP链路的两端互相交换网络层特定的网络控制分组。如果在PPP链路上运行的是IP,则使用IP 控制协议 IPCP (IP Control Protocol)来对 PPP 链路的每一端配置 IP 模块(如分配 IP 地址)。和LCP分组封装成PPP帧一样,IPCP分组也封装成PPP帧(其中的协议字段为0x8021)在PPP链路上传送。当网络层配置完毕后,链路就进入可进行数据通信的“打开”状态。两个PPP端点还可发送回送请求LCP分组(echo-request)和回送回答LCP分组(echo-reply)以检查链路的状态。数据传输结束后,链路的一端发出终止请求 LCP 分组(terminate-request)请求终止链路连接,而当收到对方发来的终止确认LCP分组(terminate-ack)后,就转到“终止”状态。当载波停止后则回到“静止”状态。

(完)