概述
Point-to-Point Protocol,点到点协议,工作于数据链路层,在链路层上传输网络层协议前验证链路的对端,主要用于在全双工的同异步链路上进行点到点的数据传输。
PPP主要是用来通过拨号或专线方式在两个网络节点之间建立连接、发送数据。PPP是各类型主机、网桥和路由器之间简单连接的一种解决方案。在RFC1661中有详细的描述。PPP协议是目前广域网上应用最广泛的协议之一,它的优点在于简单、具备用户验证能力、可以解决IP分配等。
PPP协议是IETF在1992年制定的。经过1993年和1994年的修订,在1994年就已成为互联网的正式标准。
PPP
PPP包含如下三个部分:
- 在串行链路上封装数据报的方法。PPP既支持异步链路(无奇偶检验的8比特数据),也支持面向比特的同步链路。IP数据报在PPP帧中就是其信息部分。这个信息部分的长度受最大传送单元MTU的限制;
- 建立、配置和测试数据链路连接的链路控制协议(Link Control Protocol,LCP),用于对封装格式选项的自动协商、建立和终止连接,探测链路错误和配置错误;
- 建立和配置不同网络层协议的一组网络控制协议(Network Control Protocol,NCP),PPP协议规定针对每一种网络层协议都有相应的网络控制协议,并用他们来管理各个协议不同的需求。
PPP协议定义三种认证协议:
- PAP:Password Authentication Protocol,密码验证协议
- CHAP:Challenge-Handshake Authentication Protocol,挑战—握手验证协议
- EAP:Extensible Authentication Protocol,扩展认证协议
特点
- PPP既支持同步传输又支持异步传输,而X.25、FR(Frame Relay)等数据链路层协议仅支持同步传输,SLIP仅支持异步传输
- PPP 协议具有很好的扩展性。如,当需要在以太网链路上承载PPP协议时,PPP可扩展为PPPoE
- PPP提供LCP协议,用于各种链路层参数的协商
- PPP提供各种NCP协议(如IPCP、IPXCP),用于各网络层参数的协商,更好地支持网络层协议
- PPP 提供认证协议CHAP、PAP,更好地保证网络安全性
- 无重传机制,网络开销小,速度快
一个典型的PPP链路建立过程分为三个阶段:
- 创建阶段:将对基本的通信方式进行选择。链路两端设备通过LCP向对方发送配置信息,建立链路。在链路创建阶段,只是对验证协议进行选择,具体的用户验证过程在认证阶段实现
- 认证阶段:客户端会将自己的身份发送给远端的接入服务器。该阶段使用一种安全的验证方式避免第三方窃取数据或冒充远程客户接管与客户端的连接。认证成功,则转到网络层协商阶段。如果认证失败,则链路终止
- 网络层协商阶段:认证阶段完成之后,PPP将调用在链路创建阶段选定的各种NCP协商高层协议问题,例如,在该阶段IP控制协议可以向拨入用户分配动态地址。
报文格式
包含字段:
- Flag域:标识一个物理帧的起始和结束,该字节为二进制序列01111110(0x7E)
- Address域:字节固定为11111111(0xFF),是一个广播地址
- Control域:默认为00000011(0X03),表明为无序号帧
- Protocol字段:用来说明PPP所封装的协议报文类型;典型字段值有:0xC021代表LCP,0xC023代表PAP报,0xC223代表CHAP报文。如果协议字段被设为0xC021,则说明通信双方正通过LCP报文进行PPP链路的协商和建立
- Information字段:包含协议字段中指定协议的数据包
- Code 字段:主要是用来标识LCP数据报文的类型。典型的报文类型有:配置信息报文(Configure Packets:0x01),配置成功信息报文(Configure-Ack:0x02),终止请求报文(Terminate-Request:0x05)
- Identifier域:1个字节,用来匹配请求和响应
- Data字段:默认最大长度(不包括协议字段)称为最大接收单元MRU(Maximum Receive Unit),MRU缺省值为1500字节
- FCS:Drame Check Sequence,帧校验序列,是个16位的校验和,用于检查PPP帧的完整性
字节填充
当信息字段中出现和标志字段一样的比特(0x7E)组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。
当PPP使用异步传输时,它把转义符定义为0x7D(即01111101),并使用字节填充,RFC 1662规定如下填充方法:
- 把信息字段中出现的每一个0x7E字节转变成为2字节序列(0x7D, 0x5E)
- 若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把0x7D转变成为2字节序列(0x7D, 0x5D)
- 若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是传输结束,ETX)就要把它转变为2字节序列(0x7D, 0x23)
由于在发送端进行字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。
零比特填充
PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP协议采用零比特填充方法来实现透明传输。
具体做法是:在发送端,先扫描整个信息字段(通常用硬件实现,也可用软件实现,只是会慢些)。只要发现有5个连续1,则立即填入一个0。经过这种零比特填充后的数据,可保证在信息字段中不会出现6个连续1。接收端在收到一个帧时,先找到标志字段F以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现5个连续1时,就把这5个连续1后的一个0删除,以还原成原来的信息比特流。这样就保证透明传输:在所传送的数据比特流中可以传送任意组合的比特流,而不会引起对帧边界的错误判断。
建立状态机
包含如下几个阶段:
- Dead阶段:也称为物理层不可用阶段。当通信双方的两端检测到物理线路激活时,就会从Dead阶段迁移至Established阶段,即链路建立阶段
- Established阶段:PPP链路进行LCP参数协商。协商内容包括最大接收单元MRU、认证方式、魔术字(Magic Number)等选项。LCP参数协商成功后会进入Opened状态,表示底层链路已经建立
- Authenticate阶段:多数情况下,链路两端的设备是需要经过认证阶段(Authenticate)后才能够进入到网络层协议阶段。PPP链路在缺省情况下是不要求进行认证的。如果要求认证,则在链路建立阶段必须指定认证协议。认证方式是在链路建立阶段双方进行协商的。如果在这个阶段再次收到Configure-Request报文,则又会返回到链路建立阶段
- Network阶段:PPP链路进行NCP协商。通过NCP协商来选择和配置一个网络层协议并进行网络层参数协商。只有相应的网络层协议协商成功后,该网络层协议才可以通过这条PPP链路发送报文。如果在这个阶段收到Configure-Request报文,也会返回到链路建立阶段。NCP协商成功后,PPP链路将保持通信状态
- Terminate:PPP运行过程中,可以随时中断连接,例如物理链路断开、认证失败、超时定时器时间、管理员通过配置关闭连接等动作都可能导致链路进入Terminate阶段。在Terminate阶段,如果所有的资源都被释放,通信双方将回到Dead阶段,直到通信双方重新建立PPP连接。
工作原理
当用户拨号接入ISP后,就建立一条从用户个人电脑到ISP的物理连接。这时,用户个人电脑向ISP发送一系列的链路控制协议LCP分组(封装多个PPP帧),以便建立LCP连接。这些分组及其响应选择了将要使用的一些PPP参数。接着进行网络层配置,网络控制协议NCP给新接入的用户个人电脑分配了一个临时的IP地址,这样,用户个人电脑就成为互联网上的一个有IP地址的主机了。当用户通信完毕时,NCP释放网络层连接,收回原来分配出去的IP地址,接着,LCP释放数据链路层连接,最后释放物理层连接。
步骤:
- 当用户个人电脑通过调制解调器呼叫路由器时(比如点屏幕上点击宽带连接),路由器就能够检测到调制解调器发出的载波信号。在双方建立了物理层连接后,PPP进入链路建立状态(Link Establish),其目的是建立链路层的LCP连接。
- 接下来,LCP开始协商一些配置选项,即发送LCP的配置请求帧,这是一个PPP帧,其协议字段为LCP对应的代码(0xC021),信息字段包含特定的配置请求。LCP配置选项包括:链路上的最大帧长、所使用的鉴别协议的规约(如果有)、不使用PPP帧中的地址和控制字段(因为这两个字段的值是固定的,没有任何信息量,可以在PPP帧的首部忽略这两个字节)。链路的另一端可以发送以下几种响应中的一种:
- 配置确认帧(Configure-Ack):所有选项都接受
- 配置否认帧(Configure-Nak):所有选项都理解但不能接受
- 配置拒绝帧(Configure-Reject):有的选项无法识别或不能接受,需要协商
- 协商结束后,双方就建立LCP链路,接着就进入鉴别状态(Authenticate)。在这一状态,只允许传送LCP协议的分组、鉴别协议的分组、监测链路质量的分组。若使用口令鉴别协议PAP(Password Authentication Protocol),则需要发起通信的一方发送身份标识符和口令。系统可允许用户重试若干次。如果需要有更好的安全性,则可使用更加复杂的口令握手鉴别协议CHAP(Challenge-Handshake Authentication Protocol)。若鉴别身份失败,则转到
链路终止
状态(Link Terminate),若鉴别成功,则进入网络层协议
状态(Network Layer Protocol) - 在网络层协议状态,PPP链路的两端的网络控制协议NCP根据网络层的不同协议互相交换网络层特定的网络控制分组,现在的路由器都能够同时支持多种网络层协议,PPP协议的两端的网络层可以运行不同的网络层协议,但仍然使用同一个PPP协议。如果PPP链路上运行的是IP协议,则对PPP链路的每一端配置IP协议模块时(如分配IP地址)就要使用NCP中支持的协议—IP控制协议IPCP(IP Control Protocol)。IPCP分组也封账成PPP帧(协议字段为OX8021)在PPP链路上传送。在低速链路上运行时,双方还可以协商使用压缩的TCP和IP首部,以减少在链路上发送的比特数
- 当网络层配置完毕后,链路就进入可进行数据通信的
链路打开
状态(Link Open)。链路的两端可以向彼此发送分组。两端还可发送回送请求LCP分组(Echo-Request)和回送回答LCP分组(Echo-Reply),以检查链路的状态。数据传输结束后,可以由链路的一端发出终止请求LCP分组(Terminate-Request),请求终止链路连接。在收到对方发来的终止确认LCP分组后(Terminate-Ack),转到链路终止
状态。如果链路出现故障,也会从链路打开
状态转到链路终止
状态。当调制解调器的载波停止后,则回到链路静止
状态。
从设备无链路开始,先建立物理链路,再建立链路控制协议LCP链路。经过鉴别后,再建立网络控制协议NCP链路,然后才能交换数据。可见,PPP协议已不是纯粹的数据链路层的协议,它包含物理层和网络层的内容。
PAP
PAP是一种简单的明文验证方式。网络接入服务器要求用户提供用户名和口令,PAP以明文方式返回用户信息,并且对回送或者重复验证和错误攻击没有保护措施。
很明显,这种验证方式的安全性较差,第三方可以很容易地获取被传送的用户名和口令,并利用这些信息与网络接入服务器建立连接获取网络接入服务器提供的资源。所以,一旦用户密码被第三方窃取,PAP无法提供避免受到第三方攻击的保障措施。
CHAP
CHAP是一种加密的验证方式,能够避免建立连接时传送用户的明文密码。网络接入服务器向远程用户发送一个挑战口令,其中包括会话ID和一个任意生成的挑战字串。远程客户端使用MD5散列算法返回用户名和加密的挑战口令、会话ID及用户口令。
CHAP对PAP进行了改进,不再直接通过链路发送明文口令,而是使用挑战口令以散列算法对口令进行加密。因为服务器端存有客户的明文口令,所以服务器可以重复客户端进行的散列操作,并将结果与用户返回的口令进行对照。
CHAP为每一次验证任意生成一个挑战字串来防止受到攻击。在整个连接过程中,CHAP将不定时地随机向客户端重复发送挑战口令,从而避免非法入侵者冒充远程客户进行攻击。
CHAP优点:
- 通过可变的挑战口令和随机地、重复地发挑战口令,CHAP防止重放攻击
- 该认证方法依赖于认证者和对端共享的密钥,密钥不是通过链路发送的
- 虽然该认证是单向的,但是在两个方向都进行CHAP协商,同一密钥可以很容易地实现交互认证
- 由于CHAP可以用在许多不同的系统认证中,因此可以用用户名作为索引,以便在一张大型密钥表中查找正确的密钥。这样也可以在一个系统中支持多个用户名—密钥对,在会话中随时改变密钥。
CHAP在设计上的要求:
- CHAP算法要求密钥长度必须至少是1字节,至少应该不易让人猜出,密钥最好至少是散列算法所选用的散列码的长度,如此可以保证密钥不易受到穷举搜索攻击。所选用的散列算法,必须保证从已知挑战口令和响应值来确定密钥在计算上是不可行的。
- 每一个挑战口令应该是唯一的,否则在同一密钥下,重复挑战口令将使攻击者能够用以前截获的响应值应答挑战口令。由于希望同一密钥可以用于地理上分散的不同服务器的认证,因此挑战口令应该做到全局临时唯一。
- 每一个挑战口令也应该是不可预计的,否则攻击者可以欺骗对方,让对方响应一个预计的挑战口令,然后用该响应冒充对端欺骗认证者。虽然CHAP不能防止实时地主动搭线窃听攻击,但是只要能产生不可预计的挑战口令就可以防范大多数的主动攻击。
EAP
EAP是一个用于PPP认证的通用协议,可以支持多种认证方法。EAP并不在链路控制阶段而是在认证阶段指定认证方法,这样认证方就可以在得到更多的信息以后再决定使用什么认证方法。这种机制还允许PPP认证方简单地把收到的认证信息传给后方的认证服务器,由后方的认证服务器来真正实现各种认证方法。
EAP的认证过程:在链路阶段完成以后,认证方向对端发送一个或多个请求报文。在请求报文中有一个类型字用来指明认证方所请求的信息类型,例如,可以是对端的ID、MD5的挑战口令、一次性密码及通用密码卡等。MD5的挑战口令对应于CHAP认证协议的挑战口令。典型情况下,认证方首先发送一个ID请求报文随后再发送其他的请求报文。对端对每一个请求报文响应一个应答报文。和请求报文一样,应答报文中也包含一个类型字段,对应于所回应的请求报文中的类型字段。认证方再通过发送一个成功或者失败的报文来结束认证过程。
优点:它可以支持多种认证机制,而不需要在建立连接阶段指定;某些设备,例如,网络接入服务器,不需要关心每一个请求信息的真正含义,而是作为一个代理把认证报文直接传给后端的认证服务器,设备只需关心认证结果是成功还是失败,然后结束认证阶段。
缺点:需要在LCP中增加一个新的认证协议,这样现有的PPP要想使用EAP就必须进行修改。同时,使用EAP也和现有的在LCP协商阶段指定认证方法的模型不一致。
参考
- 数据链路层-点对点协议PPP