1 PPP与PPPoE
1.1 PPP协议
点对点协议(英语:Point-to-Point Protocol,缩写:PPP)工作在数据链路层(以OSI参考模型的观点)。它通常用在两节点间创建直接的连接,并可以提供连接认证、传输加密(使用ECP,RFC 1968)以及压缩。
1.2 PPP的功能
PPP协议支持以下功能:
- IP地址的动态分配和管理
- 同步或异步的物理层通信
- 链路的配置、质量检测和纠错
- 多种配置参数选项的协商
同步传输与异步传输
同步传输的基本单元是帧,如果从这个层面上而言,当前网络大部分都是基于同步网络的。异步传输的基本单元是编码字符。一个一个编码字符按照顺序进行发送,这些编码字符传输的过程中,不需要一个个挨着进行传输,换言之,我们可以把该“编码字符”理解成一个小数据帧。这个方法适合一些同步性能不好,或者信道质量不好的情况。不过异步传输的缺点是,传输效率低,每一个字符都要额外的起始位和停止位。
1.3 PPP与PPPoE
PPP协议要求通信双方是点对点的关系,但是面对广播类型的以太网和另外一些多点访问类型,于是就产生了PPPOE协议。PPPOE协议提供了在广播式的网络(如以太网)中多台主机连接到远端的访问集中器(我们对目前能完成上述功能的设备为宽带接入服务器)上的一种标准。
2 PPPoE协商流程
2.1 总体协商流程
PPPoE总体协商流程可以细分为5个阶段:
- 发现阶段:客户端发现服务端,为会话阶段做准备
- 链路协商阶段:会话开始,启动链路,进行配置
- 认证阶段:认证客户端身份
- 网络协商阶段:协商PPP报文的网络层参数
- 终止阶段:会话释放
整个流程能够看到是PPPoE协议包裹(封装)了PPP协议,如下图所示:
下面是协商时各阶段的序列图
2.2 发现阶段
发现阶段使用发现协议PPPoED,包含下述五种分组:
2.2.1 PADI(PPPoE Active Discovery Initiation)
主机广播发起分组,分组的目的地址为以太网的广播地址 0xffffffffffff,CODE(代码)字段值为0×09(PADI Code),SESSION-ID(会话ID)字段值为0x0000。PADI分组必须至少包含一个服务名称类型的标签(Service Name Tag,字段值为0x0101),向接入集中器提出所要求提供的服务。
2.2.2 PADO(PPPoE Active Discovery Offer)
接入集中器收到在服务范围内的PADI分组,发送PPPoE有效发现提供包分组,以响应请求。其中CODE字段值为0×07(PADO Code),SESSION-ID字段值仍为0x0000。PADO分组必须包含一个接入集中器名称类型的标签(Access Concentrator Name Tag,字段值为0x0102),以及一个或多个服务名称类型标签,表明可向主机提供的服务种类。PADO和PADI的Host-Uniq Tag值相同。
2.2.3 PADR(PPPoE Active Discovery Request)
主机在可能收到的多个PADO分组中选择一个合适的PADO分组,然后向所选择的接入集中器发送PPPoE有效发现请求分组。其中CODE字段为0x19(PADR Code),SESSION_ID字段值仍为0x0000。PADR分组必须包含一个服务名称类型标签,确定向接入集线器(或交换机)请求的服务种类。当主机在指定的时间内没有接收到PADO,它应该重新发送它的PADI分组,并且加倍等待时间,这个过程会被重复期望的次数。
2.2.4 PADS(PPPoE Active Discovery Session-confirmation)
接入集中器收到PADR分组后准备开始PPP会话,它发送一个PPPoE有效发现会话确认PADS分组。其中CODE字段值为0×65(PADS Code),SESSION-ID字段值为接入集中器所产生的一个惟一的PPPoE会话标识号码。PADS分组也必须包含一个接入集中器名称类型的标签以确认向主机提供的服务。当主机收到PADS 分组确认后,双方就进入PPP会话阶段。
2.3 链路协商阶段
PPP会话的建立,需要两端的设备都根据LCP协议来配置和测试数据通信链路。
2.3.1 LCP(Link Control Protocol)
- Config-ACK:若完全支持对端的LCP选项,则回应Config-ACK报文,报文中必须完全协带对端Request报文中的选项。
- Config-NAK:若支持对端的协商选项,但不认可该项协商的内容,则回应Config-NAK报文,在Config-NAK的选项中填上自己期望的内容,如:对端MRU值为1500,而自己期望MRU值为1492,则在Config-NAK报文中埴上自己的期望值1492。
- Config-Reject:若不能支持对端的协商选项,则回应Config-Reject报文,报文中带上不能支持的选项,如Windows拨号器会协商CBCP(被叫回呼),而ME60不支持CBCP功能,则回将此选项拒绝掉。
2.4 认证阶段
会话双方通过LCP协商好的认证方法进行认证,如果认证通过了,才可以进行下面的网络层的协商。认证过程在链路协商结束后就进行。
2.4.1 CHAP(Challenge Handshake Authentication Protocol)
CHAP为三次握手协议。只在网络上传输用户名,并不传输用户口令,因此它的安全性要比PAP高。CHAP的验证过程为:
首先由验证方(Server)向被验证方(Client)发送一些随机产生的报文,并同时将本端的主机名附带上一起发送给被验证方。被验证方接到对端对本端的验证请求(Challenge)时,便根据此报文中验证方的主机名和本端的用户表查找用户口令字,如找到用户表中与验证方主机名相同的用户,便利用报文ID、此用户的密钥用Md5算法生成应答(Response),随后将应答和自己的主机名送回。验证方接到此应答后,用报文ID、本方保留的口令字(密钥)和随机报文用Md5算法得出结果,与被验证方应答比较,根据比较结果返回相应的结果(ACK or NAK)
经过以上三次报文交互后,CHAP认证完成。
2.5 网络协商阶段
认证成功后,开始配置网络层,为接入做最后的准备,双方通过NCP协议来协商参数。NCP有很多种,如IPCP、BCP、IPv6CP,最为常用的是IPCP。
2.5.1 IPCP(Internet Protocol Control Protocol)
NCP流程与LCP流程类似,用户与ME设备之间互相发送NCP Config-Request报文并且互相回应NCP Config-Ack报文后,标志NCP己协商完,用户上线成功,可以正常访问网络了。
IPCP协商过程中,协商包文可包含多个选项,即参数。各个选项的拒绝或否认都不能影响IPCP的UP,IPCP可以无选项协商,无选项协商也同样能够UP。选项有IP Address、网关、掩码等,其中IP Address是最重要的一个选项。
2.6 终止阶段
终止可以由双方任意一方主动发起,如:客户端主动下线、客户端失去心跳被动下线、服务端重启等。该阶段涉及之前说明的两个协议:LCP和PPPoED,由于协议是栈式的,因此断开时由外至内,先用LCP协议发起终止请求,收到回应后,又用PADT(PPPOE Active Discovery Terminate)终止PPPoE会话。当对方接收到一个 PADT(PPPOE Active Discovery Terminate)分组,就不再允许使用这个会话来发送PPP业务。PPP对端应该使用PPP协议自身来终止PPPoE会话,但是当PPP不能使用时,可以使用PADT。
最后来看一下Wireshark抓包情况,回顾下整个PPPoE协商流程
3 PPPoE帧结构
PPPoE帧结构如图所示,可以看到以太帧封装PPPoE,PPPoE封装PPP,而PPP包含LCP、NCP等内容
具体例子如下:
4 PPPoE总结
4.1 PPPoE的优缺点
优点:
- 安全性高,支持PAP或CHAP认证
- 付费方式灵活,针对每个连接进行计费
- 应用广泛、成熟,有良好的市场基础,标准性、互通性好
缺点:
- 认证机制比较复杂,认证阶段耗时多,需要用户等待
- 需要用户安装客户端软件
- 带宽损耗,上网速度比正常带宽速度要慢。因为PPPOE比正常的宽带包多了两个协议层,一个是PPPOE协议层,另一个是PPP协议层,这两层都会加在正常数据包头中,多出了额外的数据。
本文参考了以下网站: