ppp 协议记录

1:PPP 协议
     

PPP协议支持以下功能:

  • IP地址的动态分配和管理
  • 同步或异步的物理层通信
  • 链路的配置、质量检测和纠错
  • 多种配置参数选项的协商


PPP协议的六个阶段

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

(一)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

Data: 信息字段,即PPP帧的负载(如LCP帧、NCP帧).信息域缺省时最大长度不能超过1500字节,其中包括填充域的内容 
Pad: 填充字段 
FCS:循环冗余码。 覆盖了两个Flag(不包括)之间的字段。

PPP工作流程


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


一、 LCP 协商

  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 数据包类型

根据代码域的不同,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 已经处于打开状态,则必须发送协议拒绝数据帧来通知对方,信息域中包括拒绝的协议和信息;但如果在其它状态,则直接丢弃数据帧。


•    回应请求数据帧/回应应答数据帧(Echo-Request/Echo-Reply)

Echo-Request:代码域:9  Echo-Reply:代码域:10 LCP 包含 Echo-Request 和 Echo-Reply 代码用于训练双方通信的数据链路层上的循环通信机制。通信一方发送一个 Echo-Request 包,其中代码域为 9,在信息域中插入本地魔数(Magic-Number,关于魔数,见下文)和任何用于测试的数据。接收到Echo-Request 的一方则用 Echo-Reply 来回应,其中代码域为 10,标志域从请求数据帧中复制,然后在信息域中插入本地魔数,并将请求数据包的内容拷贝到应答数据包中。数据帧格式如下表:
•    丢弃请求数据帧(Discard-Request):代码域:11
该数据帧提供了一种在数据链路层上的测试机制,一方发送该数据帧,另一方接收后直接丢弃。

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)


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



Ident:标识域。LCP报文的序列号,用于匹配Request和Reply报文。 由Request帧的发送者生成,在之后的序列帧中递增。对于应答报文(如ACK,NACK,REJECT应答报文, Ident帧的值是从Request报文中copy过来的。(由此,Request方可以通过Ident字段识别Rely的对应关系)。 

Length: LCP报文的长度,以字节为单位。 Code+Ident+Length+LCP Data 
LCP Data: LCP数据报文。

不同类型的LCP帧的作用:

帧 类型 用途
configure 帧 对链路两端进行最基本的配置
Terminate帧 链路通信完成时,对链路连接进行清理操作
echo 帧 用来确认一些操作, 一个活动的链路随时会发送echo帧
discard-request 帧 用于测量链路的性能
identification 帧 Time-Remaining帧 用于一些管理操作

总的来说,LCP帧根据用途可以分为三大类, 链路配置报文,链路终止报文,链路维护报文:


(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链路仍在活跃状态。

LCP协商过程



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功能,则回将此选项拒绝掉。









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

上面的lcp都可以参考rfc1661, CHAP可以参考rfc1994,ipcp可以参考rfc1332


实际例子
>
ff 03 c0 21 01 00 00 14 02 06 00 00 00 00  05 06 f7 ad b0 29 07 02 08 02 a565
<
ff 03 c0 21 01 00 00 19 02 06 00 00 00 00 03 05 c2 23 05 05 06 01 06 aa aa 07 02 08 02 18d8
>
ff 03 c0 21 03 00 00 08 03 04 c0 23 f7d7
<
ff 03 c0 21 02 00 00 14 02 06 00 00 00 00 05 06 f7 ad b0 29 07 02 08 02 4e0c
<
ff 03 c0 21 01 01 00 18 02 06 00 00 00 00 03 04 c0 23 05 06 01 06 aa aa 07 02 08 02 0aed
>
ff 03 c0 21 02 01 00 18 02 06 00 00 00 00 03 04 c0 23 05 06 01 06 aa aa 07 02 08 02 c600



二. 认证阶段


  PPP认证,常用认证协议有PAP(口令验证协议 CO 23)和CHAP(挑战握手验证协议) 
  会话双方通过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


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


实际例子

PAP 校验
>
c0 23 01 01 00 10 05 64 75 6d 6d 79 05 64 75 6d 6d 79 f4d3
<
c0 23 02 01 00 05 00 fd 30


三. 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协商协议的基本流程如下:

用户和接入设备对IP服务阶段的一些要求进行多次协商,以决定双方都能够接收的约定。 
  通LCP类似,当Request中的一些选项不被接收方接受时, 接收方不会回复Configuration-ACK报文,而是回复其他如Configuration-NACK报文。


实际例子
>
80 21 01 00 00 16 03( IP ) 06 00 00 00 00 81(dns1) 06 00 00 00 00 83(dns2) 06 00 00 00 00 627c
<
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
<
80 21 01 00 00 04 67c3
>
80 21 02 00 00 04 aae6
<
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
>
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
<
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









Session Keep-alive

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

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。


































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章