PPP协议支持以下功能:
- IP地址的动态分配和管理
- 同步或异步的物理层通信
- 链路的配置、质量检测和纠错
- 多种配置参数选项的协商
2. 链路建立阶段: LCP协商,(协商认证方式等)
3. 验证阶段: PAP/CHAP验证
**4. 网络层协议阶段:**NCP协商
5. PPP会话维持阶段: 维持PPP会话, 定时发送Echo Request报文,并等待Echo Reply报文
(一)PPP 帧
PPP帧从HDLC(High-level link Control)。
- Flag:标志位、用于标识帧的开始和结束
- Addr:地址位,用于标识Station地址。PPP帧发源自HDLC帧,保留了此字段。对于PPP帧来说,由于是点对点协议,不需要地址位。PPP帧的地址位恒为0xFF。(PPP协议被运用在点对点链路上,不需要知道对端的链路地址,因为点对点链路,如PPPoE帧头中,已经确定了对端的地址)。
- Control:在DHLC帧中,Control位用来标识帧的顺序和重传行为,但由于该功能在PPP协议中并没有普遍实现,因此PPP帧中,Control值固定为)0x03.
- Protocol:协议字段,标识所携带报文的类型。如0x0021时,表示PPP帧的信息字段是IP数据报文。不同的Protocol标识Data字段的不同含义。
ISO标准下 的协议域类型:
Protocol | 对应的Data域的含义 |
---|---|
0x0***-0x3*** | 网络层的数据报文 |
0x4***-0x7*** | 与NCP无关的第整流量 |
0x8***-0xb*** | 网络控制协议(NCP)的数据报文 |
0xc***-0xf*** | 链路控制协议(LCP)的数据报文 |
常用的几种Protocol取值:
Protocol | 信息字段 |
---|---|
0x0021 | IP数据报 |
0x8021 | 网络控制数据NCP |
0xC021 | 链路控制数据LCP |
0xC023 | 安全性认证PAP |
0xC223 | 安全性认证CHAP |
+ Pad: 填充字段
PPP工作流程
b)认证阶段: LCP向对端发送协商请求, 双方确定链路的配置参数后,LCP向认证层发送Up事件。常用的认证协议有PAP(口令验证协议)和CHAP(挑战握手验证协议)。
c) NCP协商阶段(IPCP等协议):调用链路层创建阶段选定的网络控制层协议。主要包括动态分配IP地址功能等。常用的NCP协议有IPCP协议。
d)会话维持阶段:进行PPPoE心跳保活
LCP(Link Control Protocol)用来创建链路完成链路的启动、测试、任选参数的协商和最终链路的断开
LCP的操作只关注连接的两端,而不在乎Mac层协议(如以太网协议、WIFI),也就是不需要考虑具体的传输媒介是什么。
LCP帧
LCP帧以PPP帧为基础。格式如下:
LCP帧有自己特有的四个字段:Code、Ident、Length、LCP Data。
另外,(PPP帧的)字段Protocol的值应为0xC021,标识该PPP帧为LCP帧。
+ Code: 表示LCP数据报文(Request或Reply)类型。 值如下:
Code | Description | Code | Description | |
---|---|---|---|---|
0x01 | configure-request | 0x08 | Protocol-REJECT | |
0x02 | configure-ACK | 0x09 | echo-request | |
0x03 | configure-NACK | 0x0A | echo-reply | |
0x04 | configure-REJECT | 0x0B | discard-request | |
0x05 | teminate-request | 0x0C | identification | |
0x06 | terminate-ACK | 0x0D | Time-Remaining | |
0x07 | code-REJECT |
根据代码域的不同,LCP 数据包可以分为以下数据帧:
• 配置请求数据帧(Configure-Request):代码域:1
为了打开一个 LCP 连接,必须发送一个配置请求数据包,欲设置的数据在 LCP 的数据域中设置,接收到该数据包后必须应答。配置选项的内容在下文论述。
• 配置确认数据帧(Configure-ACK):代码域:2
• 配置否认数据帧(Configure-NAK):代码域:3
如果在接收到的配置数据帧中有参数无法接受,则用该数据帧应答。将无法接受的选项的内容修改为可以接受的值后按顺序添加到数据域中,如果还有其它选项需要协商,也可以增加到数据域中。
• 配置拒绝数据帧(Configure-Reject):代码域:4
如果接收到的配置请求数据帧中有部分选项无法识别或不允许使用,则用配置拒绝数据帧应答。此时,复制标志域并将请求数据帧中的要拒绝的选项按原来的顺序复制到数据域中。
• 终止请求数据帧/终止确认数据帧(Terminate-Request/Terminate-ACK)
终止请求数据帧:代码域为 5;终止确认数据帧:代码域为6如果通信一方要终止链路连接,则应该发送终止请求数据帧,代码域设为 5,数据域为任何附加信息;接收到终止请求的一方发送终止确认数据帧,此时代码域为 6,标志域和
数据域从接收到的请求数据帧中拷贝。
• 代码拒绝数据帧(Code-Reject):代码域:7
如果接收到的数据帧的代码域为无效代码,则用代码拒绝帧应答,表示该错误无法恢复。接收到代码拒绝数据帧的主机应该报告错误。
• 协议拒绝数据帧(Protocol-Reject):代码域:8
如果在 PPP 封装中接收到一个未知的通信协议,表示对方想要使用一个本机不支持的协议。此时,如果 LCP 已经处于打开状态,则必须发送协议拒绝数据帧来通知对方,信息域中包括拒绝的协议和信息;但如果在其它状态,则直接丢弃数据帧。
LCP 配置选项允许在一个点对点链路上通过协商修订标准特性值,这些选项包括:最大接收单元,异步控制字符映射、链路鉴权协议等。如果一个配置选项没有在配置请求数据包(Configure-Request)中出现,那么该配置选项将使用默认值。配置选项列表的结束由LCP 数据包的长度标识。在协商过程中,除非特别声明,这些配置选项应用在半双工方式,经过协商后的值仅在接收配置请求数据包的方向上有效。配置选项是 LCP 配置请求等数据帧的数据域内的值。配置选项格式如下:
选项类型:1 字节,指示配置选项类别。
选项长度:1 字节,表示该选项的长度,包括类型、长度和数据。
数据:指示该选项的配置内容,它的格式和长度由选项类型决定。
选项类型分别如下:
• 最大接收单元(Maximum-Receive-Unit, MRU)
该选项用来通知对方该实现可以接收的最大数据包长度,如果要将数据包长度设置为较小值,必须保证在链路同步丢失后仍然能够接收 1500 个字节的数据包。
• 异步控制字符映射(Asynchronous-Control-Character-Map, ACCM)
这个配置选项提供了一个在异步链路上协商控制字符映射表的方法。默认的,PPP 将所有的控制字符映射到相应的两字符序列。然而,很少有必要将所有控制字符都进行转义映射。因此,应用程序可以通过该选项去通知对方哪些控制字符需要进行转义。控制字符映射表通过 4 个字节来表示,其中的每一位表示相应的值是否映射,0 表示不进行映射,1 表示进行映射。在传输过程中最先传输的是第 31 位,最后传输的是 0 位。其中,第 0 位对应的是ASCII 码 NUL。
• 鉴权协议(Authentication-Protocol)
一般在网络层交换数据前要求进行鉴权,这个配置选项提供了一种协商鉴权协议的方法。默认不进行鉴权。在请求鉴权的过时,每次只能使用一个鉴权协议选项,只有当该协议被拒绝以后,才能再请求使用别的协议进行。
• 质量协议(Quality-Protocol)
在一些连接中,可能需要决定什么时候、多久进行数据发送,这一过程称为质量监控。这个配置选项提供了一种协商使用的质量监控协议的方法。默认不使用质量监控协议。
• 魔数(Magic-Number)
该选项提供了一种探测短路连接和其它数据链路层异常的方法,它可能在其它配置选项中用到。使用魔数检测链路的基本思想是:当一方接收到带有魔数选项的配置请求数据帧后,将接收到的魔数与上次发送的魔数进行比较,如果不相同就认为没有发生短路。如果两个魔数相同,则需要发送一个携带不同魔数的配置否认帧,然后将接收到的魔数与发送的魔数进行比较。
• 协议域压缩(Protocol-Field-Compression)
该选项提供了一种压缩数据链路层协议域的方法。在标准的PPP 中,协议编号为两个字节,经过协商后,可以把编号小于 256 的协议压缩为一个字节传输,比如传输 IP 信息时,协议编号可以由 0021 压缩为 21,但是编号大于 256 的协议无法压缩。默认不使用协议压缩。
选项类型:7 选项长度:2
• 地址和控制域压缩(Address-and-Control-Field-Compression)
+ Length: LCP报文的长度,以字节为单位。 Code+Ident+Length+LCP Data
+ LCP Data: LCP数据报文。
不同类型的LCP帧的作用:
帧 类型 | 用途 |
---|---|
configure 帧 | 对链路两端进行最基本的配置 |
Terminate帧 | 链路通信完成时,对链路连接进行清理操作 |
echo 帧 | 用来确认一些操作, 一个活动的链路随时会发送echo帧 |
discard-request 帧 | 用于测量链路的性能 |
identification 帧 Time-Remaining帧 | 用于一些管理操作 |
总的来说,LCP帧根据用途可以分为三大类, 链路配置报文,链路终止报文,链路维护报文:
包含Config-Request、Config-Ack、Config-Nak和Config-Reject四种报文。
当通信双方需要建立链路时,双方都需要发送Config-Request报文并携带自已所希望协商的配置参数选项。当接收方收到Config-Request报文时,会根据是否识别、认可Configure-Request报文中的配置参数来在剩下的三种配置报文中选择一种应答。 如果识别且认可全部参数,则应答Configure-ACK报文(携带全部配置参数); 如果识别,但只认可部分配置参数,则应答configure-NACK报文(携带不认可的配置参数); 如果不能识别所有的配置,则应答configure-Reject报文(携带全部报文)。
(2). 链路终止报文:
包含Terminate-Request和Terminate-Reply两种报文。
LCP报文中提供了一种机制来关闭一个点对点的连接,想要关断链路的一端会持续发送Terminate-Request报文,直到收到一个 Terminate-Reply为止。接收端一旦收到了一个Terminate-Request报文后,必须回应一个Terminate-Reply报 文,同时等待对端先将链路断开后,再完成本端的所有断开的操作。
(3). 链路维护报文:
链路维护报文中比较杂。比如,我们需要定时进行PPP保活(确认当前PPP链路是否仍在活跃状态),则PPP链路双方分别发送Echo Request报文,如果对方回复了Echo Reply报文,则表示PPP链路仍在活跃状态。
LCP协商过程
二. 认证阶段
+ PAP验证: 两次握手,明文传输口令,安全性低
+ CHAP验证: 三次握手, 密文传输口令。
在 PPP 连接过程中, LCP 协议定义了一种使用鉴权协议进行鉴权的方法。这种机制可以使用不同的协议进行鉴权,目前支持的鉴权协议包括 PAP(Password Authentication Protocol)和CHAP(Challenge Handshake Authentication Protocol)。
1.密码鉴权协议(PAP)PAP 提供了一种通过双向握手进行身份确认的简单方法。在LCP 链路建立后,被鉴权者将身份和密码发送给鉴权者,然后等待对方的确认信息。因为用户的身份和密码是通过链路以明码的方式发送的,所以 PAP 不是一种绝对安全的鉴权方法。
(1)PAP 数据帧格式
(2)数据帧类型
• 鉴权请求(Authenticate-Request)
鉴权请求用于启动密码认证协议,将本地的身份标识和密码发送给对方,并等待对方应答。该过程可以多次重复直到接收到对方的应答信息。
• 鉴权确认/鉴权否认(Authenticate-ACK/Authenticate-NAK)
如果接收到的鉴权请求数据帧中的用户标识和密码都合法,那么通信终端将使用鉴权确认数据帧进行确认,以通知对方已经通过了身份验证;如果接收到的信息不合法,则使用鉴权否认数据帧通知对方。在鉴权确认数据帧的数据域中可以包含一些用于显示的信息。
2.挑战握手鉴权协议(CHAP)
CHAP 协议使用三方握手来周期性的确定对方的身份,它可以在链路建立后的任何时候进行。当链路建立后,鉴权者向对方发送一个“挑战”信息,对方使用单向链表(one-way hash)函数计算后发送结果,鉴权者将接收到的信息与自己计算出来的结果进行比较,如果两者相同,则鉴权成功;否则,鉴权失败,连接被终止。同 PAP 相比,CHAP 更具有安全性。首先,鉴权过程中使用不断变化的挑战信息和身份标识,这使得攻击者很难有机会进行破解;其次,鉴权由鉴权者控制,它可以随时对对方进行身份确认。使用 CHAP 时,必须配合一种链表算法,目前与 CHAP 配合使用的算法是 MD5 算法。在 PPP 中使用CHAP必须在 LCP 协商时配置相应的鉴权算法为 CHAP,配置选项格式如下:
(2)CHAP 数据帧类型
• 挑战和应答数据帧
挑战数据帧用来启动 CHAP。鉴权者在 LCP 协商后主动发送挑战信息来验证用户身份。对方在接收到挑战信息后用单向链表算法进行计算,然后将计算后的结果用应答数据帧进行应答。数据帧格式如下:
代码:挑战数据帧为 1;应答数据帧为 2
标识:一个字节。每次发送挑战数据帧时必须使用不同的标识码;应答数据帧必须将挑战数据帧的标识码复制后发送。
挑战值长度:一个字节,指示挑战值的长度。
挑战值:一个以上的字节,首先发送高位字节。挑战值是一个可变的字节流,每次挑战要使用不同的数值;应答数据帧中该域存放经过计算后的信息流,信息流的长度取决于使用的链表算法,比如 MD5 算法计算的结果是 16 字节。
名称:标识传输数据包的系统的名称,但是该域的值并没有限制,可以采用不同数值进行发送。
• 成功和失败数据帧如果接收到的应答信息是正确的,那么主机使用成功数据
代码:成功数据帧为 3;失败数据帧为 4
标识:必须从应答数据帧中复制该值。
信息:信息域是可选的而且其内容是由具体的应用来决定的,一般来说,信息域存放的是可以显示的 ASCII 码。
下面是一个PAP鉴权过程的命令
c0 23:PAP;AuthReq :01;id :01;长度:00 14;用户名长度:0d;用户名:77 65 72 74 33 34 35 36 24 25 35 3637;密码长度:01;密码71
用户名为:wert3456$%567;密码为:q;
sent [ PAP AuthReq id=0x1 user="wert3456$%567" password=<hidden>]
ff 03 c0 23 01 01 00 14 0d77 65 72 74 33 34 35 36 24 25 35 36 37 01 71
rcvd [ PAP AuthAck id=0x1 "" ]
ff 03 c0 23 02 01 0005 00
下面是CHAP鉴权的过程,没有二进制的命令,读者可试着自行解析为二进制。
rcvd [CHAP Challenge id=0x1<cefafe87223004753244f465e862a987>, name = "UMTS_CHAP_SRVR"]
sent [CHAP Response id=0x1 <b811aff6568ff284cd4609d3f08cf5a8>, name= "test"]
rcvd [CHAP Success id=0x1""]
CHAP authentication succeeded
三. NCP协商协议
NCP有很多种,如IPCP、BCP、IPv6CP,最为常用的是IPCP(Internet Protocol Control Protocol)协议。NCP的主要功能是协商PPP报文的网络层参数,如IP地址,DNS Server IP地址,WINS Server IP地址等。PPPoE用户主要通过IPCP来获取访问网络的IP地址或IP地址段。
NCP流程与LCP流程类似,用户与ME设备之间互相发送NCP Config-Request报文并且互相回应NCP Config-Ack报文后,标志NCP己协商完,用户上线成功,可以正常访问网络了。
NCP协商协议的基本流程如下:
Session Keep-alive
设备主动发送Echo Request进行PPPoE心跳保活,若3次未得到服务器的响应,则设备主动释放地址。发LCP Echo Request 的时候,魔术字字段要和之前通信的Configure_Request使用的魔术字字段保持一致。
有些设备或终端不支持主动发送 Echo-Request 报文, 只能支持回应Echo-Reply报文。