您的位置 首页 > 数码极客

如何得到一个ppp封装的数据包

1.PPP基本原理

1.1概念简介

PPP(Point-to-Point Protocol)协议是一种点到点链路层协议,主要用于在全双工的同异步链路上进行点到点的数据传输。

PPP处在TCP/IP协议栈的数据链路层。

1.1协议族组成

PPP主要由三类协议族组成:

  • 链路控制协议族(Link Control Protocol),主要用来建立、拆除和监控PPP数据链路。
  • 网络层控制协议族(Network Control Protocol),主要用来协商在该数据链路上所传输的数据包的格式与类型。
  • 扩展协议族CHAP(Challenge-Handshake Authentication Protocol)和PAP(Password Authentication Protocol),主要用于网络安全方面的验证。

如果把PPP比喻成一条路的话,LCP犹如修路,而NCP在协商跑什么车,认证的作用是看车有没有合法的通行证。

1.2PPP报文头详解

Flag

Flag域标识一个物理帧的起始和结束,该字节为0x7E。

Address

Address域可以唯一标识对端。PPP协议是被运用在点对点的链路上,因此,使用PPP协议互连的两个通信设备无须知道对方的数据链路层地址。按照协议的规定将该字节填充为全1的广播地址,对于PPP协议来说,该字段无实际意义。

Control

该字段默认值为0x03,表明为无序号帧,PPP默认没有采用序列号和确认应答来实现可靠传输。

综上,Address和Control实际上是固定的,PPP报文头为FF03,以此标识报文为PPP报文。

Protocol

Protocol域可用来区分PPP数据帧中信息域所承载的数据包类型。例如以下常用类型:

0021----Internet Protocol

C021----Link Control Protocol

C023----Password Authentication Protocol

C223----Challenge Handshake Authentication Protocol

0057----Internet Protocol version 6

Information

Information域取决于Protocol中的值所对应的数据包类型,可能是LCP、也可能是IPv6包,最大长度即最大接收单元MRU(Maximum Receive Unit),缺省是1500字节。

FCS

FCS域的功能主要对PPP数据帧传输的正确性进行检测。

在数据帧中引入了一些传输的保证机制,会引入更多的开销,这样可能会增加应用层交互的延迟。

1.3PPP建链状态机

PPP整个建链过程,就是围绕着LCP协商、NCP协商和认证这三方面主要工作进行的,最初始的状态为Dead阶段(链路不可用阶段),过程简单描述如下:

  1. 通信双方开始建立PPP链路时,先进入到Establish阶段。
  2. 在Establish阶段,PPP链路进行LCP协商。协商内容包括工作方式是SP(Single-link PPP)还是MP(Multilink PPP)、最大接收单元MRU(Maximum Receive Unit)、验证方式和魔术字(magic number)等选项。LCP协商成功后进入Opened状态,表示底层链路已经建立。
  3. 如果配置了验证,将进入Authenticate阶段,开始CHAP或PAP验证。如果没有配置验证,则直接进入Network阶段。
  4. 在Authenticate阶段,如果验证失败,进入Terminate阶段,拆除链路,LCP状态转为Down。如果验证成功,进入Network阶段,此时LCP状态仍为Opened。
  5. 在Network阶段,PPP链路进行NCP协商。通过NCP协商来选择和配置一个网络层协议并进行网络层参数协商。只有相应的网络层协议协商成功后,该网络层协议才可以通过这条PPP链路发送报文。NCP协商包括IPCP(IP Control Protocol)、MPLSCP(MPLS Control Protocol)等协商。IPCP协商内容主要包括双方的IP地址。

6.NCP协商成功后,PPP链路将一直保持通信。PPP运行过程中,可以随时中断连接,物理链路断开、认证失败、超时定时器时间到、管理员通过配置关闭连接等动作都可能导致链路进入Terminate阶段。

7.在Terminate阶段,如果所有的资源都被释放,通信双方将回到Dead阶段,直到通信双方重新建立PPP连接,开始新的PPP链路建立。

以华为AR系列路由器为例,图中是一条成功建链后PPP链路的状态,可以看到LCP opened,IPCP opened(代表可以跑IPv4了),IP6CP(代表可以跑IPv6了)

2.链路控制协议族(Link Control Protocol)

LCP是用来为PPP协商链路的建立、拆除和监控的。LCP报文作为PPP的净载荷被封装在PPP数据帧的Information域中,报文的格式如图所示:

2.1LCP报文详解

Code域

Code域的长度为一个字节,主要是用来标识LCP数据报文的类型。常用的如下:

Configure-Request(0x01)和Configure-Ack(0x02)

在链路建立阶段,LCP的状态机会发生如下改变。

  • 当链路处于不可用阶段时,此时LCP的状态机处于初始化Initial状态或准备启动Starting状态。当检测到链路可用时,则物理层会向链路层发送一个Up事件。链路层收到该事件后,会将LCP的状态机从当前状态改变为Request-Sent(请求发送)状态,根据此时的状态机LCP会进行相应的动作,也就是开始发送Configure-Request报文来配置数据链路。
  • 如果本端设备先收到Configure-Ack报文,则LCP的状态机从Request-Sent状态改变为Ack-Received状态,本端向对端发送Configure-Ack报文以后,LCP的状态机从Ack-Received状态改变为Opened状态。
  • 如果本端设备先向对端发送Configure-Ack报文,则LCP的状态机从Request-Sent状态改变为Ack-Sent状态,本端收到对端发送的Configure-Ack报文以后,LCP的状态机从Ack-Sent状态改变为Opened状态。
  • LCP状态机变为Open状态以后就完成当前阶段的协商,并向下一个阶段跃迁。

Echo-Request(0x09)和Echo-Reply(0x0A)

除此之外还有

Configure-Nak(0x03)、Configure-Reject(0x04)、Terminate-Request(0x05)、Terminate-Ack(0x06)、Code-Reject(0x07)、Protocol-Reject(0x08)、Discard-Request(0x0B)、Reserved(0x0C)。

Identifier域

Identifier域为1个字节,用来匹配请求和响应,当Identifier域值为非法时,该报文将被丢弃。

通常一个配置请求报文的ID是从0x01开始逐步加1的。当对端接收到该配置请求报文后,无论使用何种报文回应对方,但必须要求回应报文中的ID要与接收报文中的ID一致。

Length域

Length域的值就是该LCP报文的总字节数据。它是Code域、Identifier域、Length域和Data域四个域长度的总和。

Data域

Data域所包含的是协商报文的内容,这个内容包含以下字段。

  • Type为协商选项类型。例如:定义最大接收单元的Maximum-Receive-Unit(0x01)、魔术字Magic-Number(0x05)等。
  • Length为协商选项长度,它是指Data域的总长度,也就是包含Type、Length和Data。
  • Data为协商选项的详细信息。

3.Authenticate

缺省情况下,PPP链路不进行验证。如果要求验证,在链路建立阶段必须指定验证协议。PPP提供密码验证协议PAP(Password Authentication Protocol)和质询握手验证协议CHAP(Challenge-Handshake Authentication Protocol)两种验证方式。

3.1PAP(Password Authentication Protocol)

该认证过程简单,即明文发送用户名和密码进行验证,通过则回复Ack,不通过则发送Nak。

3.2CHAP(Challenge-Handshake Authentication Protocol)

CHAP单向验证过程分为两种情况:验证方配置了用户名和验证方没有配置用户名。

  • 验证方配置了用户名的验证过程
  • 验证方主动发起验证请求,验证方向被验证方发送一些随机产生的报文(Challenge),并同时将本端的用户名附带上一起发送给被验证方。

  • 被验证方接到验证方的验证请求后,先检查本端接口上是否配置了ppp chap password命令,如果配置了该命令,则被验证方用报文ID、命令中配置的用户密码和MD5算法对该随机报文进行加密,将生成的密文和自己的用户名发回验证方(Response)。图为配置了ppp chap password的情况。

  • 如果接口上未配置ppp chap password命令,则根据此报文中验证方的用户名在本端的用户表查找该用户对应的密码,用报文ID、此用户的密钥(密码)和MD5算法对该随机报文进行加密,将生成的密文和被验证方自己的用户名发回验证方(Response)。

没有配置ppp chap password那被验证方会根据验证方发过来的用户名,即“BigYaoezi”,去本地查找是否有这个用户对应的密码,即便接口上配置是的testuser@yaoezi.com这个用户。

  • 验证方用自己保存的被验证方密码和MD5算法对原随机报文加密,比较二者的密文,若比较结果一致,认证通过,若比较结果不一致,认证失败。最终成功的结果如下图所示。

  • 验证方没有配置用户名的验证过程
  • 验证方主动发起验证请求,验证方向被验证方发送一些随机产生的报文(Challenge)。
  • 被验证方接到验证方的验证请求后,利用报文ID、ppp chap password命令配置的CHAP密码和MD5算法对该随机报文进行加密,将生成的密文和自己的用户名发回验证方(Response)。
  • 验证方用自己保存的被验证方密码和MD5算法对原随机报文加密,比较二者的密文,若比较结果一致,认证通过,若比较结果不一致,认证失败。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“如何得到一个ppp封装的数据包”边界阅读