PPP,PPPOE,PPTP,L2TP-VPN简介 (之一) PPP协议概览

PPP

PPP是一种数据链路层协议,遵循HDLC(高级数据链路控制协议)族的一般报文格式。PPP是为了在点对点物理链路(例如RS232串口链路、电话ISDN线路等)上传输OSI模型中的网络层报文而设计的,它改进了之前的一个点对点协议–SLIP协议–只能同时运行一个网络协议、无容错控制、无授权等许多缺陷,PPP是现在最流行的点对点链路控制协议。

PPP/HDLC帧格式

上图中PPP的flag字段恒为0x7f,地址(adress)字段恒为0xff,控制(control)字段恒为0×03.协议(protocol)字段表示PPP报文中封装的payload(data字段)的类型,如果为0×0021,则表示PPP封装的IP报文,0x002B表示IPX报文,0×0029表示AppleTalk报文,这几种都属于PPP的数据报文;如果为0×8021则表示PPP的LCP报文(用来协商连接),如果为0xC021则属于PPP的NCP报文(用来协商封装的三层协议),这些属于PPP的控制报文。

PPP协议状态机如下图所示:

ppp有限状态机

在上图的链接建立阶段(建立),PPP使用LCP报文来协商连接(一种发送配置请求,然后接收响应的简单“握手”过程,不做过多介绍,感兴趣可以去细读RFC1661),协商中双方获得当前点对点连接的状态配置等,之后的“鉴别”阶段使用哪种鉴别方式也在这个协商中确定下来。

鉴别阶段是可选的,如果链接协商阶段并没有设置鉴别方式,则将忽略本阶段直接进入“网络”阶段。鉴别阶段使用链接协商阶段确定下来的鉴别方式来为连接授权,以起到保证点对点连接安全,防止非法终端接入点对点链路的功能。常用的鉴别认证方式有CHAP和PAP方式。

CHAP方式的原理是由一端定期发起挑战“challenge”,收到“challenge”的一端将收到的“challenge”报文中的密钥使用之前双发协商好的一种算法加密后再把结果发回发起端,这种算法应该是结果唯一(不同输入必得到不同输出)且不可逆(由输出无法得到输入)的,发起端也使用该算法计算后验证结果是否正确来为对端授权认证。一个常用的方案实例是:发起端发送随机长度及内容的字符串加上自己的用户名作为“密钥”发送出来,接受到“challenge”的一方将收到的字符串和与对方用户名相对应的本端用户的密码使用MD5算法计算后发回,然后发起端将收到的计算结果和本端MD5计算该随机字符串加自己密码的结果相对照,如果双发一致,则认证成功。

另一种认证方式PAP方式相比就简单很多,直接由被验证方将自己的用户名和密码明文方式发送给对端,由对端对用户名和密码验证来决定是否认证成功。所以,比较而言,CHAP是一种相对更安全一些的验证方式。

需要注意的是,PPP两端双方向的鉴权方式可以不同,即A端为B端鉴权时使用PAP方式(B发送自己的用户名和密码给请A认证),而同时B端使用CHAP方式为A端鉴权(B向A发起CHAP挑战),是完全可以的。

如果鉴别阶段成功,则PPP状态机进入“网络”阶段。这个阶段主要是使用NCP报文来协商将PPP封装怎样的网络层的问题。NCP报文及协商流程和LCP极为相似,就不过多介绍了。

经过网络阶段后,PPP状态机进入OPEN打开状态,在这个状态下,PPP链路上的三层数据报文即可正常通信了。

参考链接:

RFC 1661 The Point-to-Point Protocol

RFC 1994 PPP Challenge Handshake Authentication Protocol

RFC 1334 PPP Authentication Protocols

由于点对点链路的私密性和专有性以及PPP协议在这种点对点链路上的较完美的设计,在TCP/IP广域互联网时代的今天,PPP又在虚拟私有专用网也就是VPN领域发挥了重要的作用,这些将在后面的文章中展开介绍。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>