1
计算机网络技术理论与实践
1.5.5.1 4.5.1 PPP协议原理

4.5.1 PPP协议原理

PPP协议既支持异步的物理线路传输,也支持同步的HDLC(面向位的同步数据块的传送)和SONET的物理线路传输,支持链路的配置、质量检测和网络层协议的复用。此外,PPP协议还支持多种配置参数选项的协商,比如IP地址的动态分配和管理等。IETF RFC1661、RFC1662和RFC1663详细描述了PPP(Point-to-Point Protocol)协议内容。

1.PPP协议的封装帧格式

PPP协议工作在数据链路层,针对的是点对点链路,不需要进行寻址。它的数据封装帧格式不仅提供帧定界和检错功能,还提供了协议标识,使得不同网络层协议可以同时在一条链路上传输。

PPP协议可以工作在不同的物理层上,包括同步线路、异步线路和以太网等,针对不同种类的物理链路需要有不同的PPP封装帧格式。

(1)同步线路上PPP封装

PPP协议工作在同步线路上时,使用HDLC的UI帧。图4-16是PPP over HDLC的封装帧格式,这种格式是将HDLC的UI帧的INFO部分扩展了一个“协议字段”。

img90

图4-16 PPP over HDLC的封装帧格式

Flag:标志字段,表示帧的起始或结束,由二进制序列01111110构成,即0x7E。

Address:地址字段,由二进制序列11111111构成,是广播地址。因为点对点链路不像广播或多点访问网络,在点对点的链路上可以唯一标识对方,所以使用PPP协议互联的通信设备无须知道对方的数据链路层地址,本字节已无意义,按照协议的规定填充为全1的广播地址。

Control:控制字段,由二进制序列00000011构成,要求用户数据传输采用UI无编号帧。

地址字段和控制字段所填内容为固定值,通过PPP的LCP协商,可以节省这两个字节的传输。由于没有字段来传送数据帧的序号,PPP默认情况下不提供基于序号和应答机制的可靠传输。在噪声环境下,可以通过PPP的LCP协商采用LAPB形式的有序号可靠传输。

Protocol:协议字段,用来识别PPP帧的Information字段所封装的协议。下面列出了协议字段的几种典型取值。

·0xc021信息域中承载的是链路控制协议(LCP)的数据报文;

·0xc023信息域中承载的是PAP协议的认证报文;

·0xc223信息域中承载的是CHAP协议的认证报文;

·0x8021信息域中承载的是网络控制协议(NCP)的数据报文;

·0x0021信息域中承载的是IP数据报文;

Information:0或更多字节,包含Protocol字段中指定的协议数据报文。

FCS(CRC):帧校验序列字段,对PPP数据帧传输的正确性进行CRC校验。

因为PPP协议是面向字符型的,所以UI帧的长度是整数字节。在同步线路上PPP直接使用了HDLC的UI帧,也使用了HDLC的透明传输方式“0比特插入和删除算法”。即在发送时除标志字段外,每逢5个连续的比特“1”后面就插入1个比特“0”。在接收端,每接收到5个连续的“1”,如果其后为比特“0”,则将这个比特“0”删除。

(2)异步线路上的PPP封装

PPP协议在异步线路上传输时使用的帧与同步传输是一样的,差别在于成帧方式和透明传输所使用的方法。

因为起止式异步传输是面向字符的,PPP协议在异步线路上不能采用HDLC所使用的面向比特的首位标志成帧算法,即使用0x7E作为帧的首位标志,也不能使用“0比特插入和删除算法”实现透明传输。

PPP使用的成帧方式是面向字符的首尾标志字符算法,在这种算法中使用字符0x7E作为帧首尾标志字符,需要注意的是这里的0x7E与HDLC中的0x7E是不一样的,HDLC中的是一个比特流模式即“01111110”,不是当做字符来看待,只要数据比特流中出现了这个模式就是帧的开始或结束;而在异步线路上是采用字符0x7E作为帧首尾标志。由于异步线路PPP是面向字符的,为了让传输的内容中不会出现帧的首尾标志,使用字符填充算法来实现透明传输。PPP对信息字段中的所有0x7D、0x7E和所用控制字符进行转义,具体的做法是将信息字段中出现的0x7E字符转换成0x7D和0x5E两个字符,0x7D转换成0x7D和0x5D。若信息字段中出现ASCII码的控制字符,则在该字符前面要加入一个0x7D字符。这样做的目的是防止当数据中包含了这些表面上的ASCII码控制字符被错误地解释为控制字符。图4-17是异步PPP传输帧的示意图。

img91

图4-17 异步PPP的帧传输

(3)以太网上的PPP封装

随着xDSL技术、宽带接入技术的广泛应用,PPP协议已经被广泛用于以太网上,这就是PPPoE。PPP在以太网上被用来提供点到点的连接。

图4-18给出了PPPoE的帧格式,左侧是以太网的帧,在其净荷部分封装着PPPoE的数据内容。

img92

图4-18 PPPoE封装格式

由于以太网是广播网络,在建立起点到点的连接以前,PPPoE要有一个找到对端的过程。对于xDSL中的PPPoE来说,客户端会通过广播来搜索接入服务器,找到接入服务器后会和服务器建立点到点的连接。PPPoE在发现阶段和会话阶段,以太网帧的类型域填充的值是不同的,在发现阶段时,以太网帧的类型域填充为0x8863,在会话阶段时,以太网帧的类型域填充为0x8864。

PPPoE数据报文最开始的4位为版本域,RFC2516协议中规定这个域的内容填充为0x01。紧接在版本域后的4位是类型域,RFC2516协议中规定这个域的内容填充为0x01。代码域占用1个字节,对于PPPoE的不同阶段这个域填充的内容是不同的,如表4-2所示。

表4-2 PPPoE代码域设置

img93

会话ID占用2个字节,这个字段是用来区分不同连接的。PPP是单链路,不提供复用线路的功能。但是,在以太网上接入服务器需要和多个主机之间建立PPP连接,会话ID字段是用来在以太网上实现复用的。这个值由宽带接入服务器分配给主机,当主机还未获得分配的会话ID时,该域的内容必须填充为0x0000,一旦主机分配到会话ID,后续的所有PPPoE数据报文中该域必须填充所分配的会话ID。根据这个会话ID,接入服务器就能够区分不同主机发送的数据包,从而实现与多台主机间建立连接。

长度域为2个字节,是用来指示PPPoE数据报文中净荷的长度。

PPPoE净荷域,在不同阶段该域填充的内容会有很大的不同。在PPPoE的发现阶段,该域会填充一些标记;而在PPPoE的会话阶段,该域携带的是PPP的报文,如LCP、NCP、IP等数据包,在PPP报文前增加了两字节的PPP协议ID,用来标识是哪种PPP报文,比如LCP的协议ID值为0xc021。

2.PPP的子层

为了适应多种物理层和网络层,PPP划分了LCP子层(链路控制子层)和NCP子层(网络控制子层)来完成不同的配置功能。PPP首先通过发送LCP报文来配置和测试物理链路,建立起LCP连接。链路层激活后,需要的话可以进行认证,这个过程是可选的。然后通过发送不同的NCP报文建立相应的网络层连接。比如通过NCP报文中的IPCP报文可以建立支持IP协议的连接,通过IPXCP报文可以建立支持IPX协议的连接等。图4-19为PPP的子层结构图。

img94

图4-19 PPP子层结构图

(1)LCP

LCP(Link Control Protocol,链路控制协议)位于物理层之上,负责设备之间链路层连接的创建、维护和终止。LCP数据报文被封装在PPP信息字段中,这时PPP协议ID字段的值填充为十六进制0xc021。表4-3为LCP的协议结构。

表4-3 LCP协议结构

img95

Code域表示LCP数据报文类型,包括如下类型:

1—Configure-Request

2—Configure-Ack

3—Configure-Nak

4—Configure-Reject

5—Terminate-Request

6—Terminate-Ack

7—Code-Reject

8—Protocol-Reject

9—Echo-Request

10—Echo-Reply

11—Discard-Request

Identifier是一个向上递增的数,每个发出的Request报文都有一个不同的Identifier,和它对应的Ack报文应该有相同的Identifier,如果收到与Request报文中Identifier不同的Ack报文应该丢弃。

Length是LCP数据报文长度,包括Code、Identifier、Length和Data字段。

Data是可变长字段,可以包括一或多个配置参数选项。

按照LCP各种报文的的功能又可细化为以下3类:

①链路配置报文

链路配置报文用于建立和配置链路,包括Configure-Request、Configure-Ack、Configure-Nak和Configure-Reject。

链路配置报文主要用来协商链路的配置参数选项,它的数据域会携带许多配置参数选项。当通信双方需要建立链路时,双方都需要发送Configure-Request报文,其中携带希望协商的配置参数选项,比如Maximum-Receive-Unit(最大接收单元)、Authentication-Protocol(鉴定协议)、Quality-Protocol(质量协议)、Magic-Number(魔数)、Protocol-Field-Compression(协议域压缩)、Address-and-Control-Field-Compression(地址和控制域压缩)等。

当接收方收到Configure-Request报文时,会进行协商处理,根据协商的结果在Configure-Ack、Configure-Nak和Configure-Reject这三种报文中选择一种来响应对方的请求报文。协商处理过程如下:

·如果对接收到的报文中所有配置参数都能识别,并且认可所有配置参数值时,接收方会生成一个Configure-Ack报文,并将Configure-Request请求报文中的配置参数放置在Configure-Ack报文的数据域内,然后将Configure-Ack发送给对方。

·如果对接收到的报文中所有配置参数都能识别,但是对部分配置参数值不认可,接收方会生成一个Configure-Nak报文,并将本方希望的配置参数值放置在Configure-Nak中,然后将Configure-Nak发送给对方。收到Configure-Nak报文的一方,如果能够接受新的配置参数值,则再次发送带有新配置参数值的Configure-Request报文。

·如果对接收到的报文中有部分配置参数不能识别,接收方生成一个Configure-Reject报文,将不能识别的配置参数放置其中,然后将Configure-Reject发送给对方,当对方收到Configure-Reject报文后,应去掉不能识别的配置参数,重新发送Configure-Request报文继续协商。

由于拨号网络有可能由于网络故障(线路的问题、调制解调器的问题)出现环路,在这种情况下会导致发送出去的报文又被线路发送给自己。为解决这个问题,使用了Magic-Number字段。建立链路的双方各自选取一个随机数作为自己的Magic-Number,如果收到的报文中的Magic-Number和自己的一样说明这个报文是自己发出的,这时可以确定线路上出现了环路,需要重新建立连接。

②链路中止报文

链路中止报文用于断开链路,包括Terminate-Request和Terminate-Ack。通信双方如果想关闭一个点对点的连接,可以通过发送Terminate-Request报文给对方;收到Terminate-Request报文后,接收方应回送Terminate-Ack报文。发送方收到Terminate-Ack,就拆除连接,断开链路。

③链路维护报文

链路维护报文用于管理和测试链路,包括Code-Reject、Protocol-Reject、Echo-Request、Echo-Reply、Discard-Request。维护报文各自有不同的功能。当通信一方收到不能识别的报文类型时,应回送Code-Reject给对方。如果收到的PPP报文中协议字段不能识别,应回送Protocol-Reject给对方。Echo-Request、Echo-Reply报文主要用来检测双向链路上是否存在自环。Discard-Request报文主要用于调试和执行测试,远端设备收到该消息后丢弃即可。

(2)NCP

NCP(Network Control Protocol,网络控制协议)完成点对点通信设备之间网络层所需参数的配置,主要功能是网络层地址协商。PPP的网络控制协议可以支持多种网络层协议,对不同的网络层协议PPP都有相应的网络控制子层相对应。常用的有支持TCP/IP网络使用的IPCP网络控制协议、支持SPX/IPX网络使用的IPXCP网络控制协议等。其中最为常用的是IPCP协议。

网络控制协议IPCP采用与LCP链路控制协议相同的数据报文格式。用Code域来标识Configure-Request、Configure-Ack、Configure-Nak、Configure-Reject、Terminate-Request、Terminate-Ack和Code-Reject一共7种报文类型。通过报文的交换来完成网络层协议参数的协商。协商网络层地址时,可以进行静态分配和动态分配,通常需要用到Configure-Request、Configure-Ack、Configure-Nak和Configure-Reject这四种报文。下面是这两种地址分配的协商过程。

①静态分配地址,这种分配方式是在点对点通信两端的设备上事先配置好IP地址,两端分别通过Configure-Request报文将自己的IP地址告知对方,接收方通过Configure-Ack进行回应。图4-20为静态协商分配过程,可以看出,静态分配地址的过程只需要Configure-Request、Configure-Ack进行交互即可,每次连接建立后IP地址都保持不变。

②动态分配地址,这种分配方式是由一端(请求方)向另一端(分配方)动态申请地址,每次获得的地址都是新分配的。申请地址的一端首先发送Configure-Request报文,报文中的IP地址值为全0,分配方收到Configure-Request后,如果具有地址分配权,则进行地址动态分配过程。当发现IP地址值为全0时,产生Configure-Nak报文,在该报文中填写上新分配的IP地址值,并将Configure-Nak作为响应;请求方收到Configure-Nak后,取出新分配的IP地址值,将地址值填写到新产生的Configure-Request报文中,并将该报文发送给分配方;分配方收到Configure-Request报文后发现其中的IP地址是本方刚分配给它的IP地址则产生Configure-Ack报文,并回应给请求方;请求方收到Configure-Ack报文后完成IP地址的分配过程。然后分配方会通过Configure-Request报文将自己的地址告诉给请求方,这样双方都具有了IP地址,并且都获知了对方的IP地址。图4-21表示了动态分配地址的过程。图中将Configure简写为Config。

img96

图4-20 静态分配地址过程

img97

图4-21 动态分配地址过程

3.认证协议

PPP另一个非常重要的功能是接入认证,通过认证功能可以保证经过许可的用户才能进入网络。常用的认证方式有PAP认证和CHAP认证。

(1)PAP认证

PAP(Password Authentication Protocol,口令认证协议)是一种两次握手的认证协议,它采用明文方式在网络上传输用户名和口令。PAP认证的过程如图4-22所示。

img98

图4-22 PAP认证过程

用户侧主动发起认证请求,将用户名和密码发送到网络接入服务器(NAS);接入服务器负责检查此用户名是否存在以及密码是否正确。如果此用户名存在且密码正确,则返回确认(Acknowledge)响应,表示认证通过;如果此用户名不存在或密码错误,则返回拒绝(Reject)响应,表示认证不通过。

PAP认证采用的是明码方式,在线路上传输时有可能被截获用户名和密码,安全性较差;对于安全没有保障,可能被监听的线路或安全要求较高的应用,应采用CHAP认证。

(2)CHAP认证

CHAP(Challenge Handshake Authentication Protocol,挑战握手认证协议)是一种三次握手认证协议,它在网络上传输用户名,但不传输密码。CHAP认证的过程如图4-23所示。

img99

图4-23 CHAP认证过程

LCP连接建立成功后,由网络接入服务器发起认证过程。接入服务器先向客户端发送一个Challenge报文,报文中包括接入服务器的标识和一个随机数。客户端收到Challenge报文后,根据Challenge报文中的服务器标识找到自己在这个服务器上的用户名和对应的密码。然后根据Challenge报文中的随机数和自己在这个服务器上的密码用MD5算法生成一个应答,并将应答和自己的用户名回送给接入服务器。接入服务器收到此应答消息后,根据消息中的用户名查出用户密码,然后用Challenge报文中的随机数和该用户密码计算MD5的结果,并与收到的应答进行比较,如果两者相同,则返回确认响应,表示认证通过,否则返回拒绝响应,表示认证不通过。

PAP采用明文的方式在网络上传输用户名、密码,非常容易泄露用户信息,并且只能在PPP链路建立后认证一次,如果要再次认证就必须重新启动LCP的链路建立过程。CHAP采用随机数和MD5的方式进行认证,不直接传输密码信息,安全性较强,认证过程由接入服务器发起,可以在连接期间进行多次认证,进一步提高了可靠性。

4.PPP链路的建立

为了在线路上传送PPP数据报文,首先需要建立PPP的点到点链路。以传统的PSTN网络拨号接入Internet为例,图4-24表示网络结构示意图,用户侧的Modem需要通过PSTN网拨通接入号码,建立起一条电路交换的64kbit/s物理通路,然后启动PPP链路的建立过程。

img100

图4-24 传统PSTN拨号接入示意图

为了建立点对点PPP链路,PPP链路的每一端必须首先发送LCP报文以便设定链路参数和对链路进行测试。在链路建立过程中,LCP所需的可选功能被选定后,开始发送NCP报文以便选择和设定一个或多个网络层协议。当每个被选择的网络层协议都被设定好以后,PPP链路就建立起来了,这时每个网络层协议的数据报都能在链路上进行发送。在本例中需要选择设定IP协议。建立好的PPP链路将保持通信设定不变,直到有LCP和NCP报文关闭链路或物理线路发生中断。

典型的PPP链路建立过程可以分为三个阶段:链路建立阶段、认证阶段和网络层协商阶段。

(1)链路建立阶段

在这个阶段,当物理层检测到64kbit/s的物理通路建立起来后,会向链路层发送一个线路激活信号,用户设备和接入服务器就开始发送LCP Configure-Request报文,并等待响应的LCP Configure-Ack报文,当链路层参数协商完成后就进入了LCP开启状态。

在PPP链路建立过程中可以使用认证,也可以不使用。当LCP报文中协商了要使用认证协议PAP或CHAP进行认证时,则进入认证阶段,否则直接进入网络层协商阶段。

(2)认证阶段

认证阶段进行口令验证协议或挑战握手验证协议的认证过程,客户端会将自己的身份发送给远端的接入服务器。通过安全验证可以避免第三方窃取数据或冒充远程客户进行连接。

只有通过了认证,才能进入到网络层协商阶段,如果认证失败,则转到链路终止阶段。在认证阶段,只有链路控制协议、认证协议和链路质量监视协议的报文是允许接收的,如果接收到其他报文则被丢弃。

(3)网络层协商阶段

PPP协议使用在链路建立阶段所选定的各种网络控制协议来协商PPP链路之上的网络层协议需要的参数。在本例中,使用IP控制协议(IPCP)可以向拨入用户动态分配IP地址和其他IP协议中的参数。

每种网络层协议都会通过相应的网络控制协议进行配置,例如IPCP可以配置IP协议,IPXCP可以配置IPX协议。每种网络控制协议可以随时打开和关闭。当一个网络控制协议的状态机变成Opened状态时,就可以在PPP链路上承载该网络协议的数据报文了。

经过这三个阶段可以建立起一条PPP链路供IP协议使用,并将拨号用户接入到Internet。