英文: Point to Point Protocol
中文: 点对点协议
介绍: 是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。

点对点协议(PPP)为在点对点连接上传输多协议数据包提供了一个标准方法。PPP 最初设计是为两个对等节点之间的 IP 流量传输提供一种封装协议。在 TCP-IP 协议集中它是一种用来同步调制连接的数据链路层协议(OSI 模式中的第二层),替代了原来非标准的第二层协议,即 SLIP。

除了 IP 以外 PPP 还可以携带其它协议,包括 DECnet和 Novell的Internet 网包交换(IPX)。

  1. PPP具有动态分配IP地址的能力,允许在连接时刻协商IP地址;
  2. PPP支持多种网络协议,比如TCP/IP、NetBEUI、NWLINK等;
  3. PPP具有错误检测以及纠错能力,支持数据压缩;
  4. PPP具有身份验证功能
  5. PPP可以用于多种类型的物理介质上,包括串口线、电话线、移动电话和光纤(例如SDH),PPP也用于Internet接入。

    一、缩写


PPP Point-to-Point Protocal
LCP   Link Control Protocal
NCP   Network Control Protocal
IPCP   IP Control Protocal
PAP   Password Authentication Protocal 明文加密验证过程
CHAP Chanllege Handshake Authentication Protocal 密文加密验证过程
MRU   Maximum Receive Unit 最大接收单元
FDDI   Fiber Distributed Data Interface
SLIP   Serial Line Internet Protocol

二、定义和功能


PPP协议在RFC 1661、RFC 1662和RFC 1663中进行了描述。  

2.1 背景

PPP协议工作在第二层数据链路层,规定了 1对1连接计算机的协议。
PPP属于纯粹数据链路层,与物理层没有任何关系,仅有PPP无法实现通信,需要物理层的支持。这与以太网、FDDI不同,后两者与链路层、物理层都有关。
PPP是为了在点对点物理链路(例如RS232串口链路、电话ISDN线路等)上传输OSI模型中的网络层报文而设计的,它改进了SLIP协议只能同时运行一个网络协议、无容错控制、无授权等许多缺陷,PPP是现在最流行的点对点链路控制协议。

2.2 组成与功能

PPP(Point to Point Protocol,点对点协议)协议是为在两个对等实体间传输数据包,建立简单连接而设计的。这种连接提供了同时的双向全双工操作,并且假定数据包是按顺序投递的。

PPP协议还满足了动态分配IP地址的需要,并能够对上层的多种协议提供支持。PPP在TCP/IP协议集中是位于数据链路层的协议,其物理实 现方式有两种:一种是通过以太网口(这时称之为PPPoE,即PPP over Ethernet),通过ATM模式(这时叫异步传输模式上的点对点协议,PPPoA),另一种就是利用普通的串行接口。

PPP协议是目前应用得最广的一种广域网协议,它主要由以下3部分组成:
(1) 在串行线路中对上层数据包的封装(HDLC);
(2) 用于建立、配置和检测数据链路连接的链路控制协议(LCP) ;

  • PPP为用户发起呼叫以建立链路;在建立链路时协商参数选择;通信过程中随时测试线路,当线路空闲时释放链路等。
  • 不依赖上层的LCP协议
    • LCP负责建立或断开连接、设置最大接收单元MRU、设置验证协议(PAP或CHAP)、设置是否进行通信质量的监控。
    • PAP协议:有2次握手(被验证方发送密码,验证方返回验证结果),使用明文密码和账号,安全性低。
    • CHAP协议:有3次握手(验证方要求验证,被验证方发送密码,验证方返回验证结果),使用一次性密码OTP(One Time Password)

(3) 用于建立和配置不同网络层协议的网络控制协议(NCP) 协议簇。

  • 当LCP将链路建立好了以后,PPP要开始根据不同用户的需要,配置上层协议所需的环境。
  • PPP使用网络控制协议NCP来为上层提供服务接口。
  • 针对上层不同的协议类型,会使用不同的NCP组件。如对于IP提供IPCP接口,对于IPX提供IPXCP接口,对于APPLETALK提供ATCP接口等
  • 依赖上层的NCP协议
    • 如果上层为IP协议,NCP就是IPCP协议。
    • IPCP负责IP地址设置以及是否进行TCP/IP首部压缩等设置。

学习从PPP协议的封装结构和PPP链路协商两个部分对PPP协议进行详细理解和剖析。

三、PPP数据帧格式


PPP遵循HDLC(高级数据链路控制协议)族的一般报文格式。
PPP 封装用于消除上层多种协议数据包的歧义,加入帧头、帧尾, 使之成为互相独立的串行数据帧。
PPP 采用HDLC 的组帧格式,它是面向字符的。在完整的PPP 帧中,帧头由帧开始标记、地址域、控制域、协议域组成,帧尾由校验域、帧结束标记组成
image.jpeg
image.jpeg
image.jpeg
1、**PPP帧是以标准HDLC标志字节 0x7E(01111110)开始和结束的。
2、缺省情况下,地址字段、控制字段总是常数。
我们熟知网络是分层的,且对等层之间进行相互通信,而下层为上层提供服务。当对等层进行通信时首先需获知对方的地址,而对不同的网络,在数据链路层则表现为需要知道对方的MAC地址、X.21地址、ATM地址等;在网络层则表现为需要知道对方的IP地址、IPX地址等;而在传输层则需要知道对方的协议端口号。例如如果两个以太网上的主机希望能够通信的话,首先发送端需获知对端的MAC地址。

由于PPP协议被运用在点对点的链路上的特殊性,它不像广播或多点访问的网络一样,因为点对点的链路就可以唯一标示对方,因此使用PPP协议互连的通信设备的两端无须知道对方的数据链路层地址,所以该字节已无任何意义,按照协议的规定将该字节填充为全1的广播地址 0xFF。同地址域一样,PPP数据帧的控制域也没有实际意义,按照协议的规定通信双方将该字节的内容填充为0x03。
3、 就PPP协议本身而言,我们最关心的内容应该是它的**协议域信息域**。
协议域可用来区分PPP数据帧中信息域所承载的数据报文的内容。协议域的内容必须依据ISO 3309的地址扩展机制所给出的规定。该机制规定协议域所填充的内容必须为奇数,也即是要求低字节的最低位为“1”,高字节的最低位为“0”。如果当发送端发送的PPP数据帧的协议域字段不符合上述规定,则接收端会认为此数据帧是不可识别的,那么接收端会向发送端发送一个Protocol-Reject报文,在该报文尾部将完整地填充被拒绝的报文。

信息域缺省时最大长度不能超过1500字节,其中包括填充域的内容,1500字节大小等于PPP协议中配置参数选项MRU(Maximum Receive Unit)的缺省值**,在实际应用当中可根据实际需要进行信息域最大封装长度选项的协商。信息域如果不足1500字节时可被填充,但不是必须的,如果填充则需通信双方的两端能辨认出有用与无用的信息方可正常通信。

协议域和信息域是需要合在一起看的,目前主要用到的协议类型有LCP、NCP和普通的IP协议,而他们相对应的协议域字段则为0×C021、0×8021和0×0021,可以看到应证了这句话:也即是要求低字节的最低位为“1”,高字节的最低位为“0”。而后面的信息根据不同协议包含了不同的报文内容。

协议域的值(一级分类) 对应协议 校验
0xC021 LCP协议 校验
0xC023 PAP协议 校验
0xC223 CHAP协议 校验
0x8021 NCP协议 校验
0x0021 IP协议 校验

4、校验域主要是对PPP数据帧传输的正确性进行检测的,当然在数据帧中引入了一些传输的保证机制是好的,但可以反过来说,同样我们会引入更多的开销,这样可能会增加应用层交互的延迟。

3.1 LCP帧格式

3.1.1、LCP帧封装在PPP协议的信息域内(此时协议域的值是 0xC021 )红色部分
image.jpeg
image.jpeg

编码(code)取值(二级分类,LCP) 对应的LCP帧类型 LCP帧的含义
1 configure-request 配置请求(Req)
2 configure-ack 接受配置(Ack)
3 configure-Nak 配置请求接受,其他拒绝(Nak)
4 configure-Reject 配置请求不认识或不被接受(Rej)
5 terminate-request 终止链接
6 terminate-ack 终止确认
7 code-reject
8 protocol-reject
9 echo-request
10 echo-reply
11 discard-request


LCP帧中的长度包含:
code、identify、长度以及后面的配置选项之和。
image.jpeg

3.1.2 LCP帧根据用途可以分为三大类, 链路配置报文,链路终止报文,链路维护报文(只是对上面code的功能分类):
image.jpeg
(1)、链路配置报文:包含Config-Request、Config-Ack、Config-Nak和Config-Reject四种报文。
  当通信双方需要建立链路时,双方都需要发送Config-Request报文并携带自已所希望协商的配置参数选项。当接收方收到Config-Request报文时,会根据是否识别、认可Configure-Request报文中的配置参数来在剩下的三种配置报文中选择一种应答。 如果识别且认可全部参数,则应答Configure-ACK报文(携带全部配置参数); 如果识别,但只认可部分配置参数,则应答configure-NACK报文(携带不认可的配置参数); 如果不能识别所有的配置,则应答configure-Reject报文(携带全部报文)。
  LCP的配置选项(配置报文的数据域),是一些TLV(Type、Length、Value)组。
  
(2)、链路终止报文:包含Terminate-Request和Terminate-Reply两种报文。
  LCP报文中提供了一种机制来关闭一个点对点的连接,想要关断链路的一端会持续发送Terminate-Request报文,直到收到一个 Terminate-Reply为止。接收端一旦收到了一个Terminate-Request报文后,必须回应一个Terminate-Reply报 文,同时等待对端先将链路断开后,再完成本端的所有断开的操作。

(3)、链路维护报文:
  链路维护报文中比较杂。比如,我们需要定时进行PPP保活(确认当前PPP链路是否仍在活跃状态),则PPP链路双方分别发送Echo Request报文,如果对方回复了Echo Reply报文,则表示PPP链路仍在活跃状态。

3.1.3、LCP 配置选项**
LCP 配置选项允许在一个点对点链路上通过协商修订标准特性值,这些选项包括:最大接收单元,异步控制字符映射、链路鉴权协议等。如果一个配置选项没有在配置请求数据包(Configure-Request)中出现,那么该配置选项将使用默认值。配置选项列表的结束由LCP 数据包的长度标识。
在协商过程中,除非特别声明,这些配置选项应用在半双工方式,经过协商后的值仅在接收配置请求数据包的方向上有效。配置选项是 LCP 配置请求等数据帧的数据域内的值。

配置选项格式如下:
  选项类型:1 字节,指示配置选项类别。
  选项长度:1 字节,表示该选项的长度,包括类型、长度和数据。
  数据:指示该选项的配置内容,它的格式和长度由选项类型决定。

  1. 类型取值 含义
  2. 0 RESERVED
  3. 1 Maximum-Receive-Unit
  4. 2 Asynchronous-Control-Character-Map
  5. 3 Authentication-Protocol
  6. 4 Quality-Protocol
  7. 5 Magic-Number
  8. 7 Protocol-Field-Compression
  9. 8 Address-and-Control-Field-Compression


image.jpeg

选项类型分别如下:
• 最大接收单元(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)
该选项提供了一种压缩数据链路层地址和控制域的方法。标准 PPP 协议中必须发送地址和控制域,但由于这些是固定值,因此很容易压缩。在接收过程中,如果没有接收到 FF则认为进行了地址和控制域压缩。
选项类型:8 选项长度:2

3.1.4、一个实例PPP报文-LCP数据报文
7E FF 03 C0 21 01 01 00 18
02 06 00 0A 00 00 03 04 C0
23 05 06 00 00 00 00 07 02
08 02 BE 9B 7E

下面说下里面数据的含义:
7E ——PPP的帧头,帧尾标志
FF ——地址域
03 ——控制域
C0 21 ——协议域,0xC021表示LCP协议,再比如0x8021表示ipcp协议
01 01 00 18 ——第一个01表示LCP包的code为1,即configure_request,
下面那个01表示标识符
00 18表示包的长度它包括code,identifier,长度,及后面的选项域。
02 06 00 0A 00 00 ——表示选项的type为2,06为长度,00 0A 00 00表示ACCM选项的数据域,可以参考rfc1662
03 04 C0 23 ——选项type为3,表示协议认证,04为长度,CO 23表示采用CHAP认证
05 06 00 00 00 00 ——选项type为5,表示magic number,06为长度,后面的是内容
07 02 ——选项type为7表示协议域压缩
08 02 ——选项type为8表示地址控制域压缩
BE 9B ——表示FCS,Fast Frame Check Sequecese,可参考rfc1662

3.1.5、下面为一组LCP协商过程的LOG:**
对第一条LCP报文做一个分析,后面可以由自己练习一下。

Ff 03是ppp协议的地址域和控制域,C0 21表示这个报文是LCP数据包,01是LCP代码,表示配置请求数据帧(Configure-Request),01是LCP标志位,标志两条发送和接收命令的对就关系,00 14是LCP命令的长度,02 06表示异步控制字符映射(Asynchronous-Control-Character-Map, ACCM),0000 00 00 是ACCM的值,表示全部不映射,05 06,表示魔术字,a5 d0 6c aa是魔术字的值,07 02表示协议域压缩(Protocol-Field-Compression),08 02表示地址和控制域压缩(Address-and-Control-Field-Compression)

  1. sent [ LCP ConfReqid=0x1 <asyncmap 0x0> <magic0xa5d06caa> <pcomp> <accomp>]
  2. ff 03 c0 21 01 01 0014 02 06 00 00 00 00 05 06 a5 d0 6c aa 07 02 0802
  3. rcvd [LCP ConfReq id=0xa7 <asyncmap 0x0> <authchap MD5> <magic 0x2d0c577> <pcomp> <accomp>]
  4. rcvd ff 03 c0 21 01 a7 00 19 02 06 00 00 00 00 03 05 c223 05 05 06 02 d0 c5 77 07 02 08 02
  5. sent [ LCP ConfNakid=0xa7 <auth pap>]
  6. sent ff 03 c0 21 03 a7 0008 03 04 c0 23
  7. rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic0xa5d06caa> <pcomp> <accomp>]
  8. rcvd ff 03 c0 21 02 01 00 14 02 06 00 00 00 00 05 06 a5d0 6c aa 07 02 08 02
  9. rcvd [LCP ConfReq id=0xa8 <asyncmap 0x0> <authpap> <magic 0x2d0c577> <pcomp> <accomp>]
  10. rcvd ff 03 c0 21 01 a8 00 18 02 06 00 00 00 00 03 04 c023 05 06 02 d0 c5 77 07 02 08 02
  11. sent [LCP ConfAck id=0xa8 <asyncmap 0x0> <authpap> <magic 0x2d0c577> <pcomp> <accomp>]
  12. sent ff 03 c0 21 02 a8 00 18 02 06 00 00 00 00 03 04 c023 05 06 02 d0 c5 77 07 02 08 02
  13. rcvd [LCP DiscReq id=0xa9 magic=0x2d0c577]
  14. rcvd ff 03 c0 21 0b a9 00 08 02 d0 c5 77

四、PPP协议工作过程

4.1 阶段划分框图


image.jpeg
image.jpeg

4.2 PPP协议的六个阶段

  1. 链路不可用阶段: 初始阶段
    2. 链路建立阶段: LCP协商,(协商认证方式等)
    3. 验证阶段: PAP/CHAP验证
    4. 网络层协议阶段:NCP协商
    5. PPP会话维持阶段: 维持PPP会话, 定时发送Echo Request报文,并等待Echo Reply报文
    6. 网络终止阶段: 终止PPP会话,回到链路不可用阶段。

    4.3 PPP工作流程

    a)LCP协商阶段:创建链路完成链路的启动、测试、任选参数的协商和最终链路的断开
    b)认证阶段: LCP向对端发送协商请求, 双方确定链路的配置参数后,LCP向认证层发送Up事件。常用的认证协议有PAP(口令验证协议)和CHAP(挑战握手验证协议)。
    c) NCP协商阶段(IPCP等协议):调用链路层创建阶段选定的网络控制层协议。主要包括动态分配IP地址功能等。常用的NCP协议有IPCP协议。
    d)会话维持阶段:进行PPPoE心跳保活
    d)PPP正常终结:NCP分别终结,然后LCP终结,最后物理层终结。PPP能在任何时候终止链路:载波丢失、授权失败、链路质量检测失败、管理员人为关闭链路等。

    4.4 LCP协商过程


    image.jpeg
    LCP 两端通过发送LCP Config-Request和Config-Ack交互协商选项。 LCP一方通过发送LCP Config-Request来向另一方请求自己需要的LCP协商选项。如果Config-Request报文的接收方支持并接受这些选项则回复LCP Config-Ack报文。如果Config-Request部分(或者全部)不支持所有的LCP选项则回复其他报文。
    (1)Config-ACK:若完全支持对端的LCP选项,则回应Config-ACK报文,报文中必须完全协带对端Request报文中的选项。
    (2)Config-NAK:若支持对端的协商选项,但不认可该项协商的内容,则回应Config-NAK报文,在Config-NAK的选项中填上自己期望的内容,如:对端MRU值为1500,而自己期望MRU值为1492,则在Config-NAK报文中埴上自己的期望值1492。
    (3)Config-Reject:若不能支持对端的协商选项,则回应Config-Reject报文,报文中带上不能支持的选项,如Windows拨号器会协商CBCP(被叫回呼),而ME60不支持CBCP功能,则回将此选项拒绝掉。

    4.5 鉴权协议

    在 PPP 连接过程中, LCP 协议定义了一种使用鉴权协议进行鉴权的方法。这种机制可以使用不同的协议进行鉴权,目前支持的鉴权协议包括 PAP(Password Authentication Protocol)和CHAP(Challenge Handshake Authentication Protocol)。

    1.密码鉴权协议(PAP)
    PAP 提供了一种通过双向握手进行身份确认的简单方法。在LCP 链路建立后,被鉴权者将身份和密码发送给鉴权者,然后等待对方的确认信息。
    因为用户的身份和密码是通过链路以明码的方式发送的,所以 PAP 不是一种绝对安全的鉴权方法
    (1)PAP 数据帧格式: 参考RFC 1334
    (2)数据帧类型
    • 鉴权请求(Authenticate-Request)
    鉴权请求用于启动密码认证协议,将本地的身份标识和密码发送给对方,并等待对方应答。该过程可以多次重复直到接收到对方的应答信息。
    • 鉴权确认/鉴权否认(Authenticate-ACK/Authenticate-NAK)
    如果接收到的鉴权请求数据帧中的用户标识和密码都合法,那么通信终端将使用鉴权确认数据帧进行确认,以通知对方已经通过了身份验证;如果接收到的信息不合法,则使用鉴权否认数据帧通知对方。在鉴权确认数据帧的数据域中可以包含一些用于显示的信息。
    (3)PAP鉴权过程
    image.jpeg

    2.挑战握手鉴权协议(CHAP)
    CHAP 协议使用三方握手来周期性的确定对方的身份,它可以在链路建立后的任何时候进行。当链路建立后,鉴权者(服务端)**向对方发送一个“挑战”信息,对方使用单向链表(one-way hash)函数计算后发送结果,鉴权者将接收到的信息与自己计算出来的结果进行比较,如果两者相同,则鉴权成功;否则,鉴权失败,连接被终止。

同 PAP 相比,CHAP 更具有安全性。首先,鉴权过程中使用不断变化的挑战信息和身份标识,这使得攻击者很难有机会进行破解;其次,鉴权由鉴权者控制,它可以随时对对方进行身份确认。使用 CHAP 时,必须配合一种链表算法,目前与 CHAP 配合使用的算法是 MD5 算法

在 PPP 中使用CHAP必须在 LCP 协商时配置相应的鉴权算法为 CHAP
(1)CHAP配置选项格式如下: 参考RFC 1994
(2)CHAP 数据帧类型
• 挑战和应答数据帧
挑战数据帧用来启动 CHAP。鉴权者在 LCP 协商后主动发送挑战信息来验证用户身份。对方在接收到挑战信息后用单向链表算法进行计算,然后将计算后的结果用应答数据帧进行应答。数据帧格式如下:参考RFC 1994
代码:挑战数据帧为 1;应答数据帧为 2
标识:一个字节。每次发送挑战数据帧时必须使用不同的标识码;应答数据帧必须将挑战数据帧的标识码复制后发送。
挑战值长度:一个字节,指示挑战值的长度。
挑战值:一个以上的字节,首先发送高位字节。挑战值是一个可变的字节流,每次挑战要使用不同的数值;应答数据帧中该域存放经过计算后的信息流,信息流的长度取决于使用的链表算法,比如 MD5 算法计算的结果是 16 字节。
名称:标识传输数据包的系统的名称,但是该域的值并没有限制,可以采用不同数值进行发送。
• 成功和失败数据帧如果接收到的应答信息是正确的,那么主机使用成功数据
包进行应答;反之,主机发送失败数据包并终止连接。
代码:成功数据帧为 3;失败数据帧为 4
标识:必须从应答数据帧中复制该值。
信息:信息域是可选的而且其内容是由具体的应用来决定的,一般来说,信息域存放的是可以显示的 ASCII 码。
(3)CHAP鉴权过程
image.jpeg

3、下面是一个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;

  1. sent [ PAP AuthReq id=0x1 user="wert3456$%567" password=<hidden>]
  2. ff 03 c0 23 01 01 00 14 0d77 65 72 74 33 34 35 36 24 25 35 36 37 01 71
  3. rcvd [ PAP AuthAck id=0x1 "" ]
  4. ff 03 c0 23 02 01 0005 00

4、下面是CHAP鉴权的过程,没有二进制的命令,读者可试着自行解析为二进制。

  1. rcvd [CHAP Challenge id=0x1<cefafe87223004753244f465e862a987>, name = "UMTS_CHAP_SRVR"]
  2. sent [CHAP Response id=0x1 <b811aff6568ff284cd4609d3f08cf5a8>, name= "test"]
  3. rcvd [CHAP Success id=0x1""]
  4. CHAP authentication succeeded

注:以上两组LOG都是在不需要鉴权的状态下抓取的,所以在AuthAck 时是个空值,在有鉴权的情况下,AuthAck 时的值与LOG可能不同,请读者注意区分。

4.6 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协商协议的基本流程如下:
image.jpeg
用户和接入设备对IP服务阶段的一些要求进行多次协商,以决定双方都能够接收的约定。同LCP类似,当Request中的一些选项不被接收方接受时, 接收方不会回复Configuration-ACK报文,而是回复其他如Configuration-NACK报文。

  1. 实际例子
  2. >
  3. 80 21 01 00 00 16 03( IP ) 06 00 00 00 00 81dns1 06 00 00 00 00 83(dns2) 06 00 00 00 00 627c
  4. <
  5. 80 21 03 00 00 1c 81 06 0a 0b 0c 0d 83 06 0a 0b 0c 0e 82 06 0a 0b 0c 0d 84 06 0a 0b 0c 0e 0951
  6. <
  7. 80 21 01 00 00 04 67c3
  8. >
  9. 80 21 02 00 00 04 aae6
  10. <
  11. 80 21 03 00 00 16 03 06 0a d2 fc d7 81 06 7b 7b 7b 7b 83 06 7b 7b 7b 7c 851a
  12. >
  13. 80 21 01 01 00 16 03 06 0a d2 fc d7 81 06 7b 7b 7b 7b 83 06 7b 7b 7b 7c 4277
  14. <
  15. 80 21 02 01 00 16 03 06 0a d2 fc d7 81 06 7b 7b 7b 7b 83 06 7b 7b 7b 7c b484

4.6.1 IPCP协议
在 LCP 协商和鉴权阶段后, PPP 操作进入网络协议配置阶段。在这个阶段通信双方发送 NCP(Network Control Protocol)数据包来选择和配置一个或多个网络层协议。比如,如果网络层要使用 IP 协议,那么此时必须使用一个网络配置协议来配置双方的 IP 地址、域名服务器 IP 地址等,只有双方获得了这些必要的信息,才能进行网络协议层的数据传输。配置 IP 协议的 PPP 配置协议是 IPCP。IPCP 用来配置、使能、禁用通信双方的 IP 协议模块。IPCP使用与 LCP 相同的协商机制,与 LCP 不同的地方有:
• PPP 中的数据链路层协议域
因为 IPCP 是在 PPP 的数据域中发送的,因此,在 PPP 的协议域中必须设置为 IPCP的协议编号。IPCP 的编号是 8021。
• 使用的代码域 IPCP 使用的数据帧格式与 LCP 相同,只是它的代码只有 1到7 的这 7 种取值,即它只有 7 种数据帧类型,主要用来发送配置请求、接收应答以及拒绝应答等,见上文有关 LCP 数据帧的部分。
• 配置选项

IPCP 使用与 LCP 完全不同的配置选项,见下文详细论述。
1.IPCP 数据帧格式
image.jpeg
image.jpeg
2.IPCP 配置选项
• IP-Addresses:类型域:1
由于该选项在具体应用中存在问题,所以目前不再使用该选项,它由 IP-Address 选项取代。只有在对方发送该协商选项时才使用,否则不要主动使用该选项[29]。
• IP-Compression-Protocol 用来提供协商使用指定的压缩协议,默认不使用压缩选项。选项的格式如下:
IP 压缩协议域指明要使用的压缩协议,协议编号与 PPP 协议域中的协议编号相同。目前支持的协议有 Van JacobsonCompressed TCP/IP[29],编号为 002D(16 进制)。
• IP-Address 用来协商本地使用的IP 地址。该选项允许请求发送者提供自己的IP 地址或请求对方给自己分配 IP 地址,在后一种情况下,请求者发送一个全为 0 的IP 地址,对方在一个 NAK 数据帧中给出请求者的 IP 地址。选项的格式如下:
• Primary DNS Server Address/Secondary DNSServer Address
该选项用来协商远端的主、次 DNS(Domain Name System,域名服务器)服务器地址。将选项的数据域设置为 0 表示要求对方提供 DNS 地址,对方使用 NAK 数据帧来应答 DNS地址。选项格式如下:
• Primary NBNS Server Address/Secondary NBNSServer Address
该选项用来协商远端的主、次 NBNS(NetBIOS Name Server, NetBIOS 名称服务器)节点地址。该选项的数据为 0 表示要求对方提供 NBNS 地址,对方使用 NAK 数据帧来应答NBNS 地址。类型代码分别为 130 和 132。

3.IPCP 协商过程**
客户端首先发送 IP 地址和 DNS 地址都为零的请求数据帧,服务器接收到后用 NAK 数据帧回复动态 IP 地址和DNS 地址,然后客户端再次用接收到地址发送请求,接收到 ACK数据帧即完成了 IPCP 配置。服务器直接将自己的 IP 地址发送给客户端,接收到 ACK 数据帧后 IPCP 配置成功。

这个过程如图 3-8 所示。

  1. sent [ IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns3 0.0.0.0>]
  2. ff 03 80 21 01 01 00 16 0306 00 00 00 00 81 06 00 00 00 00 83 06 00 00 00 00
  3. rcvd [LCP ProtRej id=0xaa 80fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
  4. rcvd ff 03 c0 21 08 aa 00 15 80 fd 01 01 00 0f 1a04 78 00 18 04 78 00 15 03 2f
  5. rcvd [IPCP ConfNak id=0x1<ms-dns1 10.11.12.13> <ms-dns3 10.11.12.14> <ms-wins10.11.12.13> <ms-wins 10.11.12.14>]
  6. rcvd ff 03 80 21 03 01 00 1c 81 06 0a 0b 0c 0d 8306 0a 0b 0c 0e 82 06 0a 0b 0c 0d 84 06 0a 0b 0c 0e
  7. sent [IPCP ConfReq id=0x2<addr 0.0.0.0> <ms-dns1 10.11.12.13> <ms-dns3 10.11.12.14>]
  8. sent ff 03 80 21 01 02 00 16 03 06 00 00 00 00 8106 0a 0b 0c 0d 83 06 0a 0b 0c 0e
  9. rcvd [IPCP ConfReq id=0x2a]
  10. rcvd ff 03 80 21 01 2a 00 04
  11. sent [IPCP ConfNak id=0x2a<addr 0.0.0.0>]
  12. sent ff 03 80 21 03 2a 00 0a 03 06 00 00 00 00
  13. rcvd [IPCP ConfNak id=0x2<addr 10.28.15.174> <ms-dns1 58.22.96.66> <ms-dns3218.104.128.106>]
  14. rcvd ff 03 80 21 03 02 00 16 03 06 0a 1c 0f ae 8106 3a 16 60 42 83 06 da 68 80 6a
  15. sent [IPCP ConfReq id=0x3<addr 10.28.15.174> <ms-dns1 58.22.96.66> <ms-dns3218.104.128.106>]
  16. sent ff 03 80 21 01 03 00 16 03 06 0a 1c 0f ae 8106 3a 16 60 42 83 06 da 68 80 6a
  17. rcvd [IPCP ConfReq id=0x2b]
  18. rcvd ff 03 80 21 01 2b 00 04
  19. sent [IPCP ConfAck id=0x2b]
  20. sent ff 03 80 21 02 2b 00 04
  21. rcvd [IPCP ConfAck id=0x3<addr 10.28.15.174> <ms-dns1 58.22.96.66> <ms-dns3218.104.128.106>]
  22. rcvd ff 03 80 21 02 03 00 16 03 06 0a 1c 0f ae 8106 3a 16 60 42 83 06 da 68 80 6a

4.7 Session Keep-alive会话维持阶段

设备主动发送Echo Request进行PPPoE心跳保活,若3次未得到服务器的响应,则设备主动释放地址。发LCP Echo Request 的时候,魔术字字段要和之前通信的Configure_Request使用的魔术字字段保持一致。
有些设备或终端不支持主动发送 Echo-Request 报文, 只能支持回应Echo-Reply报文。

4.8 Session Termination会话终止阶段

PPPoE 还有一个PADT(PPPOE Active Discovery Terminate)分组,它可以在会话建立后的任何时候发送,来终止PPPoE会话,也就是会话释放。它可以由主机或者接入集中器发送,目的地址填充为对端的以太网的MAC地址。

当对方接收到一个 PADT(PPPOE Active Discovery Terminate)分组,就不再允许使用这个会话来发送PPP业务。PADT分组不需要任何标签,其CODE字段值为0xa7(PADT Code),SESSION-ID字段值为需要终止的PPP会话的会话标识号码。在发送或接收PADT后,即使正常的PPP终止分组也不必发送。PPP对端应该使用PPP协议自身来终止PPPoE会话,但是当PPP不能使用时,可以使用PADT。

4.9 其他

PPP协议的格式虽然严格遵循既定标准,但不同的ISP可以有其自己的协商规范,也就是说协商的过程会因为使用网络的不同而有差别。因此PPP技术的应用,关键的问题是要弄清楚不同的ISP提供商它们各自的一套协商会话流程,一旦协商过程完成,用户获得ISP分配的动态IP,剩下的工作只不过是把用户数 据以IP报文形式封装在一个个PPP报文中进行传输了。