龙空技术网

PPP协议(点对点协议)详解

略略略GaGa 116

前言:

现时大家对“c语言中定界符是什么意思啊怎么表示出来”大体比较关心,看官们都需要了解一些“c语言中定界符是什么意思啊怎么表示出来”的相关内容。那么小编也在网上收集了一些关于“c语言中定界符是什么意思啊怎么表示出来””的相关知识,希望看官们能喜欢,兄弟们快快来学习一下吧!

在介绍PPP协议之前,我们先简单介绍下数据链路层信道的类型,以及数据链路层协议的三个基本问题。

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

点对点信道 这种信道使用一对一的点对点通信方式。广播信道 这种信道使用一对多的广播通信方式。广播信道上连接的主机很多,使用专用的共享信道协议来协调这些主机的数据发送。

使用点对点信道的数据链路层

概念:

链路(物理链路):一个节点到相邻节点的一段物理线路数据链路(逻辑链路):物理线路加上必要的通信协议(用于控制数据的传输)

点对点信道的数据链路层的协议数据单元--帧

数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。网络层中的协议数据单元则是IP数据报(或称为数据报,分组,包)。如下图所示:

数据链路层在通信时的主要步骤如下:

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

由于在OSI模型中,各层之间是相互独立的,下层单元向上层单元提供接口函数。因此,我们并不需要去考虑数据链路层如何将数据下交给物理层转换成比特数据流,以及如何在物理层传输的细节。

数据链路层的协议有很多种,但是有三个基本问题是共同的:

帧封装透明传输差错检测

帧封装,简单的说,就是将网络层传下来的IP数据报进一步打包封装成适合在数据链路层传输的数据帧。大致如下图所示:

我们使用帧定界符来表示一帧数据的开始和结束(上图的帧开始和帧结束)

帧定界符的作用主要是当数据在传输到一半的时候出现差错(例如物理链路断开),数据链路层的接收端可以依次判断接收到的数据是否是一个完整的帧。

透明传输

上述的帧定界符,一般使用专门指明的控制字符。因此,我们需要保证传输的有效数据中不能出现已经被指明为帧定界符的控制字符。否则,就会出现有效数据被误识别为帧定界符而导致数据丢失的情况。

举个例子:

图中,我们采用字符SOH和字符EOT作为帧开始符合帧结束符。但是,如果我们要传输的有效字符中出现了字符EOT(如上图所示),那么,我们传输的数据在传输到一半的时候就会被接收端误认为一帧数据已经结束,而后半部分的帧数据就会被丢弃。

那么,假如说我们传输的数据中有被指定为帧定界符的控制字符,如何处理上述可能会出现的问题呢?

在数据链路层中,解决这个问题的方法就是字节填充(字符填充)。

字节填充,就是说当我们需要传输控制字符时,我们可以在控制字符前面插入一个转义字符“ESC”,而在接收端将数据送往网络层前删除此转义字符。若是转义字符也出现在数据当中,解决方法仍然是在转义字符中插入转义字符(如下图)

差错检测

在数据链路层中,广泛使用的是循环冗余检验CRC。

CRC校验的具体实现方法就不在这里介绍了。这里说下另外需要注意的一些问题:

我们只能认为,采用CRC校验后,数据链路层接收端接收到的数据均无差错,但这并不能说明传输没有出现差错。因为这种校验方法并不能预防帧重复,帧丢失,帧失序的情况。

在OSI标准里,数据链路层应该向网络层提供可靠的传输服务,因此在某些数据链路层的传输协议中会要求增加帧编号,确认和重传机制(如高级数据链路控制HDLC)。但是,在如今通信线路质量可以得到有效保证的前提下,大部分被广泛使用的数据链路层协议都不再要求向上提供可靠的传输服务了。这个任务自然而然地交给了上层协议(如运输层TCP协议)来完成。目前,对于点对点的链路,被广泛使用的是相对简单得多的点对点协议PPP。

PPP协议的特点

简单 我们上述提到的,现数据链路层协议不要求向上提供可靠的传输服务,因此实际数据链路层的功能首要要求就是简单:接收方接收到一个数据帧,进行CRC检测,正确则收下这个帧,反之则丢弃这个帧。简单的设计可以使得不同产商对协议的不同实现的互操作性提高了。封装成帧 PPP协议必须规定特殊的字符作为帧定界符,以便接收端可以从收到的比特流中准确找出帧的开始和结束位置透明性 PPP必须保证数据传输的透明性(具体见上文透明传输的相关内容)多种网络层协议 PPP协议必须能够在同一条物理链路上同时支持多种网络层协议的运行。多种类型链路 PPP协议还必须能够在多种类型的链路上运行。差错检测 PPP协议必须能够对接收端收到的帧进行检测,并丢弃有差错的帧。检测连接状态 PPP协议必须具有一种机制能够及时自动检测出链路是否处于正常工作状态。最大传送单元 PPP协议必须对每一种类型的点对点链路设置最大传送单元MTU的标准默认值。若高层协议发送的分组过长并超过MTU的值,PPP则丢弃这样的帧,并返回差错。MTU指的是数据链路层的帧可以载荷的数据部分的最大长度,而不是帧的总长度。网络层地址协商 PPP协议必须提供一种机制使通信的两个网络层(例如,两个IP层)的实体能够通过协商知道或能够配置彼此的网络层地址。这对拨号连接的链路特别重要,因为仅仅在链路层建立了连接而不知道对方网络层地址时,则还不能够保证网络层能够传送分组。数据压缩协商 PPP协议必须提供一种方法来协商使用数据压缩算法。但PPP协议并不要求将数据压缩算法进行标准化。

PPP协议不需要的功能

纠错 PPP协议是不可靠传输协议流量控制 在TCP/IP协议族中,端到端的流量控制由TCP负责。序号多点线路 PPP协议不知道多点线路(即一个主站轮流和链路上的多个从站进行通信),只支持点对点的链路通信半双工或单工链路 PPP协议只支持全双工链路

PPP协议的组成

PPP协议主要由三部分组成:

一个将IP数据报封装到串行链路的方法。一个用来建立、配置和测试数据链路连接的链路控制协议LCP。一套网络控制协议NCP,能够支持不同的网络层协议,如IP、OSI的网络层、DECnet,以及AppleTalk等。

PPP协议的帧格式

如图所示,PPP协议的帧格式主要由三部分组成:首部,信息字段,尾部。

首部

首部字段由五个字节构成。

标志字段F,占一个字节,规定为0x7E,表示一个帧的开始或结束。此标志字段就是PPP帧的定界符。连续两帧之间只需要用一个标志字段。若出现连续两个标志字段,则表示这是一个空帧,应当丢弃。地址字段A,占一个字节,规定为0xFF控制字段C,占一个字节,规定为0x03协议字段,表示信息字段数据所使用的协议。当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。若为0xC021,则信息字段是PPP链路控制协议LCP的数据,而0x8021表示这是网络层的控制数据。

信息字段

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

尾部

尾部由三个字节构成

使用CRC的帧检验序列FCS,占两个字节标志字段F,占一个字节(首部标志字段)

字节填充

上述介绍过此概念,这里不再赘述。

零比特填充

在PPP协议中,除了使用字节填充的方法来保证透明传输外,还有一种零比特填充同样也可以保证透明传输。零比特填充的具体做法是:在发送端,先扫描整个信息字段,只要发现连续5个1,则立即插入一个0。经过这种零比特填充后的数据,可以保证在信息字段不会出现6个连续的1。接收端再收到一个帧时,先找到标志位F确定帧的边界,接着就对帧的信息字段进行扫描,当发现连续5个1时,就把5个连续1后面的0删除,还原成原来的数据比特流。这样就可以保证透明传输。大致过程如下:

PPP协议的工作状态

上面我们介绍了PPP协议帧格式,下面我们来简单讲讲PPP链路的建立过程。

一开始,PPP链路处于“链路静止”状态。当用户PC机通过调制解调器呼叫路由器时,路由器检测到调制解调器发出来的载波信号。双方建立了物理层连接。PPP链路进入了“链路建立”的状态。

接着,LCP开始协商一些配置选项,即发送LCP的配置请求帧。这个LCP配置请求帧是一个PPP帧,其协议字段置为LCP对应的代码,信息字段包含特定的配置请求。链路另一端可以发送以下几种响应中的一种:

配置确认帧:所有选项都能接受配置否认帧:所有选项都理解但不接受配置拒绝帧:选项有的无法识别或不能接受,需要协商

LCP协商配置后,双方就建立了LCP链路。接着,就开始进入了“鉴别”状态。在这一状态,只允许传送LCP协议的分组,鉴别协议的分组以及监测链路质量的分组。若使用口令鉴别协议PAP,则需要通信发起的一方发送身份标识符和口令(系统支持用于多次重试)。如果需要更高的安全性,可以使用更加复杂的口令握手鉴别协议CHAP。若鉴别身份失败,则进入“链路终止”状态。若鉴别成功,则进入“网络层协议”状态。

在“网络层协议”状态,PPP链路的两端的网络控制协议NCP根据网络层的不同协议互相交换网络层特定的网络控制分组。

当网络层配置完毕后,链路就进入可进行数据通信的“链路打开”状态。链路的两个PPP端点可以彼此向对方发送分组。两个PPP端点还可以发送回送请求LCP分组和回送应答LCP分组,以检查链路的状态。

数据传输结束后,可以由链路的一端发出终止请求LCP分组,用于请求终止链路连接,在收到对方发来的终止确认LCP分组后,转到“链路终止”状态。若链路出现故障,或调制解调器的载波停止后,链路状态都会从“链路打开”转到“链路终止”状态。

关于PPP协议这部分的内容暂时先介绍到这里,喜欢的朋友点个关注,感谢大家的支持。

标签: #c语言中定界符是什么意思啊怎么表示出来 #封装成帧透明传输差错检验是什么的主要功能