华为认证PPP与PPOE基础知识分享~
PPP协议基本概念
PPP是Point-to-Point Protocol的简称,中文翻译为点到点协议。与以太网协议一样,PPP也是一个数据链路层协议。以太网协议定义了以太帧的格式,PPP协议也定义了自己的帧格式,这种格式的帧称为PPP帧。
PPP协议的前身是SLIP (Serial Line Internet Protocol) 协议和CSLIP (CompressedSLIP)协议,前两种协议现在已基本不再使用,但PPP协议自20世纪90年代推出以来,一直得到了广泛的应用。以太网协议工作在以太网接口和以太网链路上,而PPP协议是工作在串行接口和串行链路上。串行接口本身的种类是多种多样的,例如,EIA RS-232-C接口、EIARS-422接口、EIA RS-423接口、ITU-T V.35接口等,这些都是一些常见的串行接口,并且都能够支持PPP协议。事实上,任何串行接口,只要能够支持全双工通信方式,便是可以支持PPP协议的。另外,PPP协议对于串行接口的信息传输速率没有什么特别的规定,只要求串行链路两端的串行接口在速率上保持一致即可。我们把支持并运行PPP协议的串行接口统称为PPP接口。
刚才提到,PPP 协议的中文说法是点到点协议,现在我们就来解释一下点到点,或Point-to-Point,或P2P的含义。我们知道,利用以太网协议这个数据链路层协议建立的二层网络中是可以包含多个(两个或两个以上)接口的。例如,图12-1所示的网络中包含了两个二层网络(二层网络A和二层网络B),每个二层网络都是一个以太网,每个二层网络中都包含了很多以太接口,每个二层网络内部的不同以太接口之间都可以通过交互以太帧的方式来实现二层通信。因此,我们也把以太网称为一种多点接入网络(Multi-Access Network),其含义是指这样的网络中可以包含多个(两个或两个以上)接口,且网络内部的任意两个接口之间都可以进行二层通信。
利用PPP协议建立的二层网络称为PPP网络。一个PPP网络包含且只能包含两个PPP接口,连接这两个接口的链路称为PPP链路,这两个接口通过交互PPP帧来实现二层通信。例如,图12-2所示的网络中包含了3个二层网络,二层网络A是一个以太网,二层网络B是一个PPP网络,二层网络C是另外一个PPP网络。由于一个PPP网络包含且只能包含两个PPP接口,每个接口被简化地称为一个“点”,所以一个PPP网络也经常被称为一个“点到点网络”或“P2P网络”。
在图12-2中,路由器A有两个接口,一个是以太口,另一个是PPP接口。图12-3显示了图12-2中路由器A的基本工作过程。如图12-3所示,路由器A的以太口从以太链路上接收到一个以太帧后,会将以太帧中的IP报文提取出来,然后将IP报文转移至PPP接口。PPP 接口会将该IP报文封装成一个PPP帧,然后将此PPP帧发送到PPP链路上去。另一方面,路由器A的PPP接口从PPP链路上接收到一个PPP帧后,会将PPP帧中的IP报文提取出来,然后将IP报文转移至以太口。以太口会将该IP报文封装成一个以太帧,然后将此以太帧发送到以太链路上去。
图12-2中,路由器B有两个接口,这两个接口都是PPP接口。图12-4显示了图12-2中路由器B的基本工作过程。如图12-4所示,路由器B的PPP接口Intf-1从PPP链路上接收到一个PPP帧后,会将PPP帧中的IP报文提取出来,然后将IP报文转移至PPP接口Intf-2。Intf-2 会将该IP报文封装成一个 PPP帧,然后将此PPP帧发送到PPP链路上去。另一方面,路由器B的PPP接口Intf-2从PPP链路上接收到一个PPP帧后,会将PPP帧中的IP报文提取出来,然后将IP报文转移至PPP接口Intf-1。Intf-1 会将该IP报文封装成一个PPP帧,然后将此PPP帧发送到PPP链路上去。
从上面的描述我们可以看到,PPP 接口是数据链路层(二层)通信的终结点,所以我们也说,PPP接口是三层接口。认识到这一点是非常重要的。
需要说明的是,PPP协议还包含了若干个附属协议,这些附属协议也称为成员协议。PPP协议的成员协议主要包括一个 被称为LCP (Link Control Protocol) 的链路控制协议,以及一系列的被称为NCP (Network Control Protocol)的网络控制协议。
另外需要说明的是,PPP协议对于PPP链路的长度是没有规定的。PPP链路经常应用在广域网连接中: PPP 技术被称为是一种广域网技术。
PPP帧的格式
图12-5显示了PPP帧的格式,下面是关于PPP帧格式中各个字段的含义的描述。
(1) Flag
该字段的长度为8bit,取值固定为0x7e。该字段标志了一个PPP帧的开始或结束;它既标志了当前PPP帧的开始,同时也标志了前一个PPP帧的结束。
注意,一个PPP帧的Information字段中是不允许出现0x7e的,因为这样就会使得PPP帧的接收方错误地把这个0x7e当成Flag来对待。那么,如果一个PPP帧的Information字段中需要包含0x7e时,那该怎么呢?遇到这样的情况时,Information 字段中的0x7e就必须经过“转意”处理。关于该如何进行"转意”处理,我们这里不作描述。总之,经过“转意”处理之后,Information 字段中就不再可能出现0x7e了。
(2) Address
该字段的长度为8bit, 取值固定为0xff。需要注意的是,该字段并非是一个MAC地址,但它具有广播地址的含义,意思是“所有的接口”。
PPP帧是在一条单一的PPP链路上固定地从此接口运动到彼接口,因此PPP帧不像以太帧那样包含了源MAC地址和目的MAC地址这些信息。事实上,PPP接口根本就不需要属于自己的MAC地址,MAC地址对于PPP接口来说毫无意义。
(3) Control
该字段的长度为8bit,取值固定为0x03。该字段并没有什么特别的作用,至于其取值为何固定为0x03,我们这里不做解释。
(4) Protocol
该字段的长度为16bit, 它的取值决定了Information 字段包含的是什么样的协议报文。该字段的作用类似于以太帧中的类型字段。
图12-5中举例显示了Protocol 字段的不同取值所对应的不同协议。例如,当Protocol字段的取值为0xc021时,就表明Information 字段是一个LCP报文;当Protocol字段的取值为0x8021 时,就表明Information 字段是一个IPCP报文。IPCP是网络控制协议(Network Control Protocol, NCP)的一种。特别地,当Protocol字段的取值为0x0021时,就表明Information字段是一个IP报文。
(5) Information
该字段是PPP帧的载荷数据,其长度是可变的。例如,当Protocol字段的取值为0xc021时,就表明该字段是一个LCP报文;当Protocol字段的取值为0x8021时,就表明该字段是一个IPCP报文。特别地,当Protocol字段的取值为0x0021时,就表明该字段是一个IP报文。
(6) FCS
该字段的长度为16bit,其作用是对PPP帧进行差错校验。关于校验的方法和过程,我们这里不做描述。顺便提一下, FCS 是Frame Checksum的缩写。
PPP的基本工作流程
PPP协议是一种点到点协议,它只涉及位于PPP链路两端的两个接口。当我们在分析和讨论其中一个接口时,习惯上就把这个接口叫做本地接口或本端接口,而把另一个接口叫做对端接口或远端接口,或简称为Peer。
通过串行链路连接起来的本地接口和对端接口在上电之后,并不能马上就开始相互发送携带有诸如IP报文这样的网络层数据单元的PPP帧。本地接口和对端接口在开始相互发送携带有诸如IP报文这样的网络层数据单元的PPP帧之前,必须经过一系列复杂的协商过程(甚至还可能包括认证过程),这一过程也称为PPP的基本工作流程,如图12-6所示。该字段的作用类似于以太帧中的类型字段。
从图12-6中我们可以看到,PPP基本工作流程总共包含了5阶段,分别是: Link Dead阶段( 即链路关闭阶段),Link Establishment阶段(即链路建立阶段),Authentication 阶段(即认证阶段), Network Layer Protocol阶段(即网络层协议阶段),Link Termination阶段(即链路终结阶段)。
PPP基本工作流程的第一个阶段是Link Dead 阶段。在此阶段,PPP 接口的物理层功能尚未进入正常状态。只有当本端接口和对端接口的物理层功能都进入正常状态之后,PPP才能进入到下一个工作阶段,即Link Establishment阶段。当本端接口和对端接口的物理层功能都进入正常状态之后,PPP便会自动进入到Link Establishment 阶段。在此阶段,本端接口会与对端接口相互发送携带有LCP报文的PPP帧。简单地说,此阶段也就是双方交互LCP报文的阶段。通过LCP报文的交互,本端接口会与对端接口协商若干基本而重要的参数,以确保PPP链路可以
正常工作。例如,本端接口会与对端接口对MRU (Maximum Receive Unit)这个参数进行协商。所谓MRU,就是PPP帧中Information 字段所允许的最大长度(字节数)。如果本端接口因为某种原因而要求所接收到的PPP帧的Information 字段的长度不得超过1 800字节(即本端接口的MRU为1 800),而对端接口却发送了Information字段为2 000字节的PPP帧,那么,在这种情况下,本端接口就无法正确地接收和处理这个Information字段为2000字节的PPP帧,通信就会因此而产生故障。因此,为了避免这种情况的发生,本端接口和对端接口在Link Establishment阶段就必须对MRU这个参数进行协商并取得一致意见, 此后,本端接口就不会发送Information字段超过对端MRU的PPP帧,对端接口也不会发送Information 字段超过本端MRU的PPP帧。
在Link Establishment 阶段,本端接口和对端接口还必须约定好是直接进入到Network Layer Protocol阶段呢,还是先进入Authentication 阶段,再进入到Network LayerProtocol阶段。如果需要进入到Authentication阶段,还必须约定好使用什么样的认证协议来进行认证。
如果PPP的Link Establishment 阶段顺利地结束了,并且PPP协议的双方约定无需进行认证,或者双方顺利地结束了认证阶段,那么PPP就会自动进入到Network LayerProtocol阶段。在Network Layer Protocol阶段,PPP协议的双方会首先通过NCP(NetworkControl Protocol) 协议来对网络层协议的参数进行协商,协商一致之后,双方才能够在
PPP链路上传递携带有相应的网络层协议数据单元的PPP帧。
有很多种情况都会导致PPP进入到Link Termination 阶段,例如认证阶段未能顺利完成,例如链路的信号质量太差,例如网络管理员需要主动关闭链路,如此等等。
PPP之链路建立阶段
LCP协议是PPP协议的主要成员协议之一。在PPP的Link Establishment阶段,本端接口和对端接口总是发送携带有LCP报文的PPP帧。LCP报文的格式如图12-7所示。
从图12-7中我们可以看到,如果PPP帧的Protocol字段的值为0xc021,则表明PPP帧的Information字段的内容是一个LCP报文。LCP报文包含了4个字段,分别是Code字段、Identifer 字段、Length 字段和Data字段。LCP报文中,Code字段可以取不同的值,用以区分不同类型的LCP报文。例如,如果Code字段的取值为1,则说明这是一个Configure-Request报文;如果Code字段的取值为2,则说明这是一个Configure-Ack报文;如果Code字段的取值为3,则说明这是一个Configure-Nak报文,如此等等。从图12-7中我们可以看到,LCP报文的类型一共有11种。
LCP报文中的Identifer 字段是用来对本端接口发送的LCP报文和对端接口发送的回应报文进行匹配的。LCP报文中的Length字段表明了该LCP报文的总长度(即Code字段、Identifier 字段、Length字段和Data字段的长度之和)。LCP报文中的Data字段的内容和长度会因LCP报文类型的不同而不同。
在11种LCP报文中,我们将抽取其中的Configure-Request 报文(配置请求报文)进行分析和描述,因为这种报文在Link Establishment 阶段扮演着主角的角色。如图12-8所示,在Link Establishment 阶段,本端接口和对端接口都必须至少向对方发送一个
Configure-Request报文,该报文中包含了发送方对于所有的配置参数的期望值。如果对方对于自己发送的Configure-Request报文回应了一个Configure-Ack 报文,则说明对方已经认可了自己对于所有的配置参数的期望值;如果对方对于自己发送的Configure-Request报文回应了一个Configure-Nak报文,则说明对方否定了自己对于某些配置参数或所有的配置参数的期望值,这也意味着自已必须修改自己对于相应的配置参数的期望值,然后重新向对方发送一个Configure-Request报文,且等待对方的新的回应。此过程可以重复进行。如果最终双方都接收到了对方发送的Configure-Ack 报文,则说明双方对于配置参数的协商已经取得一致, 这同时也标志着Link Establishment阶段的顺利结束。
图12-9显示了Configure-Request 报文的格式。注意,Configure-Request 报文是11种LCP报文中的一种,Code字段的值为1。Configure-Request 报文的Data字段总共可以包含最多8个配置选项,每一个配置选项其实就是一个需要协商的配置参数。每个配置选项都由3个字段组成,分别是Type字段、Length字段和Data字段。如图12-9所示,如果Type字段的值为1,则表明该配置选项是关于MRU这个参数的;如果Type字段的值为2,则表明该配置选项是关于Asynchronisation Control Character Map这个参数的:如果Type字段的值为3,则表明该配置选项是关于Authentication Protocol这个参数....如果Type字段的值为8,则表明该配置选项是关于Address and Control Field Compression这个参数的。
我们来看看MRU这个配置选项。如图12-10 所示,MRU配置选项的Type字段的值为1,Length字段的值为4 (表明MRU配置选项的总长度为4个字节,其中Type字段占了1个字节,Length字段本身占了1个字节,Data字段占了2个字节),Data 字段的值就MRU这个参数。例如,如果Data字段的值为1 800,就表明发送这个Configure Request报文的接口的MRU为1800 字节,也就是说,发送这个Configure-Request 报文的接口希望对端接口不要发送Information字段超过1 800字节的PPP帧;如果Data字段的值为2 000,就表明发送这个Configure Request报文的接口的MRU为2000字节,也就是说,发送这个Configure-Request报文的接口希望对端接口不要发送Information 字段超过2000字节的PPP帧。
我们再来看看Authentication Protocol 这个配置选项。如图12-11 所示,Authentication Protocol配置选项的Type字段的值为3, Length 字段的值为可能为4,可能为5。如果Data字段开始的两个字节的值为0xc023,则Length字段的值为4;如果Data字段开始的两个字节的值为0xc223,则Length字段的值为5。
另一方面,如果Data 字段开始的两个字节的值为0xc023, 则表明发送这个Configure Request报文的接口希望在PPP的Authentication 阶段采用PAP协议来对对端接口进行认证;如果Data 字段开始的两个字节的值为0xc223, 则表明发送这个Configure-Request报文的接口希望在PPP的Authentication 阶段采用CHAP协议来对对端接口进行认证。Data 字段开始的两个字节的值为0xc023时,Data 字段的总长度只有两个字节。Data字段开始的两个字节的值为0xc223时,Data 字段的总长度为3个字节,其中最后一个字节的值用来表示CHAP协议需要采用的加密算法(例如,如果该字节的取值为5,则表明CHAP协议中应采用MD5这种加密算法。MD是Message Digest的简称,关于MD5加密算法,我们不做任何描述)。
需要说明的是,PPP 接口关于Authentication Protocol这个配置选项进行协商后的结果不一定是对称的。协商的结果可以是,此接口会对彼接口进行认证,但彼接口不会对此接口进行认证:也可以是,此接口不会对彼接口进行认证,但彼接口会对此接口进行认证;也可以是,此接口会对彼接口进行认证,同时彼接口也会对此接口进行认证:也可以是,此接口不会对彼接口进行认证,同时彼接口也不会对此接口进行认证。另外,此接口对彼接口进行认证时所采用的认证协议与彼接口对此接口进行认证时所采用的认证协议可以是同一种协议,也可以是不同的协议(例如,此接口是采用PAP协议对彼接口进行认证,但彼接口是采用CHAP协议对此接口进行认证)。
另外,需要特别说明的是,在PPP的Link Establishment阶段,所有需要协商的配置选项总共有8个(注:实质上只有7个,因为其中有一个是预留项),这8个选项是包含在同一个Configure-Request报文中一次性进行协商的, 如图12-9 所示。如果某些配置选项没有出现在Configure-Request报文中,则表明这些配置选项是取PPP协议规定的“缺省值"。例如,如果本端接口发送的Configure Request报文中没有包含MRU配置选项,则表明本端接口的MRU是1500字节(注:PPP协议规定MRU的缺省值为1500字节)。又例如,如果本端接口发送的Configure-Request报文中没有包含Authentication Protocol这个配置选项,则表明本端接口将不会对对端接口进行认证。
PPP认证阶段
如果PPP的Link Establishment阶段顺利结束了,并且某一接口要求对对端接口进行认证,或者双方都要求对对端接口进行认证,那么PPP就会进入到Authentication阶段(即认证阶段)。
Authentication阶段涉及PAP和CHAP这两个认证协议,它们都是PPP协议的成员协议。我们这里仅以PAP协议为例来对PPP的Authentication阶段进行一个简单的描述。
我们先来看看PAP报文的格式,如图12-12所示。从图12-12中我们可以看到,PPP帧的Protocol字段的值为0xc023时,PPP帧的Information 字段便是一个PAP报文。PAP报文的Code字段是用来区分PAP报文的类型的。如果Code字段的值为1,则表明PAP报文是一个Authenticate-Request报文;如果Code字段的值为2,则表明PAP报文是一个Authenticate-Ack 报文;如果Code字段的值为3,则表明PAP报文是一个Authenticate-Nak报文。
我们再来看看Authenticate-Request报文的格式,如图12-13 所示。从图12-13 中我们可以看到,在Authenticate一Request报文中有这样的两个字段,一个是Peer-ID 字段,另一个是Password字段。Peer-ID 字段的内容其实就是用户名,Password 字段的内容其实就是与用户名相对应的密码。关于Authenticate-Ack报文和Authenticate-Nak报文的格式,我们这里不做描述。
如图12-14所示,如果在PPP的Link Establishment 阶段,B接口向A接口发送的Configure Request报文中表明了B将对A进行PAP认证,并且B接口收到了A接口回应的Configure-Ack报文,那么在接下来的Authentication 阶段,作为认证方的B就会对作为被认证方的A进行PAP认证。认证开始时,A会向B发送包含了用户名和密码的Authenticate-Request报文。B在接收到来自A的Authenticate-Request报文后,会从Authenticate-Request报文中提取出A提供的用户名和密码,并在自己的用户列表中查找A提供的用户名。如果B在自己的用户列表中不能查找到A提供的用户名,则B会向A回应一个Authenticate-Nak报文,这就意味着认证失败了。如果B在自己的用户列表中能够查找到A提供的用户名,但用户列表中相应用户的密码与A提供的密码不一致,那么B还是会向A回应一个Authenticate-Nak 报文,表明认证失败。只有当A提供的用户名和密码完全匹配了B的用户列表中的相应条目时,B才会向A回应一个Authenticate Ack报文,这也标志着A成功地通过了B的认证。
需要指出的是,PAP认证时,用户名和密码只能以明文形式包含在Authenticate-Request报文中,这就存在着很大的安全风险。当被认证方在向认证方发送PAP的Authenticate-Request报文时,用户名和密码信息很容易被泄露出去。相比之下,CHAP认,证时,相关的认证信息可以以密文的形式包含在CHAP报文中,所以其安全性保障程度要远远高于PAP认证。