PPP
PPP (Point to Point Protocol、点到点协议) 工作在数据链路层,在两节点间创建直接的连接,并可以提供连接认证、传输加密和压缩
PPP 主要由四类协议族组成 :
- HDLC : High-Level Data Link Control (高级数据链路控制) 作为封装方法
- LCP : Link Control Protocol (链路控制协议) 建立、拆除和监控数据链路
- NCP : Network Control Protocol (网络控制协议) 协商在该数据链路上所传输的数据包的格式与类型
- PAP 与 CHAP : 用于验证对端设备的合法性
- PAP : Password Authentication Protocol (密码认证协议)
- CHAP : Challenge Handshake Authentication Protocol (挑战握手认证协议)
PPP 帧格式
- Flag : 标志字段,标识了一个物理帧的起始和结束,该字节为 0x7
- Address : 地址字段,PPP 运用在点对点的链路上,所以该字节无任何意义,按协议规定填充为全 1 广播地址
- Control : 控制字段,无实际意义,规定值为 0x03。该字段与 Address 一起标识了 PPP 报文,即 PPP 报文头为 FF03
- Protocol : 协议字段,可用来区分 PPP 数据帧中信息域所承载的数据报文的内容
- Information : 信息字段,最大长度等于 PPP 协议中 MRU 的缺省值。可根据实际需要进行信息域最大封装长度选项的协商。如果信息域长度不足 1500 字节,可被填充,但不是必须的。如果填充则需通信双方的两端能辨认出有用与无用的信息方可正常通信
- FCS : 帧检验序列字段,计算范围是除了 Flag 字段的其他字段。主要对 PPP 数据帧传输的正确性进行检测
LCP 格式
- Code : 代码,用来标识 LCP 数据报文的类型
- 0x01 : Configure-Request
- 0x02 : Configure-Ack
- 0x03 : Configure-Nak
- 0x04 : Configure-Reject
- 0x05 : Terminate-Request
- 0x06 : Terminate-Ack
- 0x07 : Code-Reject
- 0x08 : Protocol-Reject
- 0x09 : Echo-Request
- 0x0a : Echo-Replyt
- 0x0b : Discard-Request
- 0x0c : Reserved
- Identifier : 标识字段,表示进行协商报文的匹配关系。 标识域目的是用来匹配请求和响应报文
- Length : 长度字段,表示此协商报文长度,它包含 Code 字段及 Identifier 字段的长度。长度字段的值就是该 LCP 报文的总字节数据。它是四个字段长度的总和
- Data : 数据,包含的是协商报文的内容
- Type : 协商选项类型
- Length : 协商选项长度
- Data : 协商的选项具体内容
PPP 状态机
- Dead : 物理层不可用阶段,当通信双方的两端检测到物理线路激活时,就会从 Dead 阶段跃迁至 Establish 阶段;反之,当一端链路断开时会回到 Dead 阶段
- Establish : 链路建立阶段,在该阶段会进行 LCP 协商,协商内容主要为一下几点 :
- 工作方式 : SP/MP
协商使用单链路工作方式还是多链路工作方式,两端不一致则使用 SP - MRU : 接口最大接收单元
两端不一致,则向小的协商 - 魔术字 : 主要用于检查物理链路的环路,比如光纤打环测试的时候,就会出现发送的 LCP 报文中的魔术字和接收到的 LCP 报文的魔术字相同的情况;如果相同则会重新选取魔术字
- 认证方式 : PAP/CHAP
下一个阶段既可能是验证阶段,也可能是网络层协议阶段。下一阶段的选择是依据链路两端的设备配置的,通常由用户来配置
- 工作方式 : SP/MP
- Authenticate : 验证阶段 (可选),进行 PAP/CHAP 的认证
- Network : 网络层协商阶段,NCP 协商支持 IPCP 协商,IPCP 协商主要包括双方的 IP 地址。通过 NCP 协商来选择和配置一个网络层协议。只有相应的网络层协议协商成功后,该网络层协议才可以通过这条 PPP 链路发送报文
Network 协商不通过也不会进入 Terminate 阶段,因为这样的话,配置了相应的 IP 地址之后,就可以直接发送业务,不需要重新建立链路后,再进行 NCP 协商 - Terminate : 终止阶段。PPP 链路将一直保持通信,直至有明确的 LCP 或 NCP 帧关闭这条链路,或发生了某些外部事件 (例如用户的干预) 则进入 Terminate 阶段
MP : 为了增加带宽,可以将多个 PPP 链路捆绑使用,称为 MultiLink PPP,简称 MP
MP 会将报文分片(小于最小分片包长时不分片)后,从 MP 链路下的多个 PPP 通道发送到 PPP 对端,对端将这些分片组装起来递给网络层
MTU : Maximum Transmission Unit,最大传输单元
接口的 MRU=MTU
MRU : Maximum Receive Unit,最大接收单元
IPCP : Internet Protocol Control Protocol (网际协议控制协议) 负责完成 IP 网络层协议通信所需配置参数的选项协商,负责建立、使能和中止 IP 模块。IPCP 在运行的过程当中,主要是完成点对点通信设备的两端动态的协商 IP 地址。IPCP 包在 PPP 没有达到网络层协商阶段以前不能进行交换,如果有 IPCP 包在到达此阶段前到达会被抛弃
PPP 建立过程
LCP 协商阶段
当链路 UP 时,开始 LCP 协商。Client 发送配置请求 (Configuration Request) ,里面携带参数 (MRU、认证类型、魔术字)。若协商通过,Server 回复 ACK 消息;协商不通过 Server 则回复 NAK 或 Reject 消息。Client 收到 NAK 或者 Reject 消息后,改用新协商参数再次发送 Request (最多发送 10 次)。Server 也会向 Client 进行类似过程,若协商成功进入下一阶段,否侧 PPP 链路无法建立
认证阶段 (可选)
PAP 认证
被认证方把本地用户名和口令以明文的形式发送到认证方,认证方根据本地用户表查看是否有被认证方的用户名,若没有则认证失败;若有,则查看口令是否正确,若口令正确,则认证通过;若口令不正确,则认证失败
CHAP 认证
验证方配置用户名的认证过程
1. 验证方主动发起认证请求,向被验证方发送一些随机产生的挑战报文 (Challenge) 并附上本端的用户名 (挑战报文里面包含一个随机数和 ID)
2. 被验证方接收到请求后,先检查本端接口上是否配置了 PPP CHAP Password 命令 :
a) 如果配置了该命令,则使用命令中配置的用户密码和 MD5 算法对该随机报文进行加密,将生成的密文和接口的用户名发回验证方 (Response)
b) 如果接口上未配置命令,就根据此报文中验证方的用户名在本端的用户表查找该用户对应的密码,用报文 ID、随机数,此用户的密钥和 MD5 算法对该随机报文进行加密,将生成的密文和被验证方自己的用户名发回验证方 (Response)
3. 验证方用自己保存的被验证方密码和 MD5 算法对原随机报文加密,比较二者的密文。若比较结果一致,认证通过;若比较结果不一致,认证失败
验证方没有配置用户名的验证过程
1. 验证方主动发起验证请求,验证方向被验证方发送一些随机产生的报文 (Challenge)
2. 被验证方接到验证方的验证请求后,利用报文 ID 、随机数,命令配置的 CHAP 密码和 MD5 算法对该随机报文进行加密,将生成的密文和接口的用户名发回验证方 (Response)
3. 验证方用自己保存的被验证方密码和 MD5 算法对原随机报文加密,比较二者的密文。若比较结果一致,认证通过;若比较结果不一致,认证失败
认证端接口配置用户名的情况下,被认证端接口用户名一定要配,密码可配可不配;认证端的接口下没有配置用户名的情况下,被认证端的接口下用户名一定要配,此时密码也必须配置。否则认证过程失败
NCP 协商阶段
静态 IPCP 协商
1. R1 向 R2 发送 Configure Request 报文,报文中携带自己接口的 IP 地址 10.0.0.1
2. R2 收到 R1 的配置请求报文后,先检查 IP 地址是否冲突
3. 如果不冲突,检查对方的 IP 地址是否为合法的单播 IP 地址 (不为 0.0.0.0)
4. 如果是合法单播 IP 地址,为对方的接口 IP 地址生成一个 32 位的主机路由
动态 IPCP 协商
1. R1 向 R2发送 Configure Request 报文,报文中携带的 IP 地址为 0.0.0.0
2. R2 收到配置请求报文后,发现对端 IP 地址为 0.0.0.0,回复 Configure NAK 报文,并且从全局地址池中选出的一个 IP 地址 (10.0.0.2),通过 Configure NAK 报文发送给到 R1
3. R1 收到 Configure NAK 报文后,将报文中的 IP 地址作为自己接口的 IP 地址使用,并回复 Configure Request 报文,报文中携带的 IP 地址为 10.0.0.2
4. R2 收到报文检查通过,生成一个 10.0.0.2/32 的主机路由,回复 Configure ACK 报文
PPPoE
PPPoE (Point-to-Point Protocol over Ethernet、以太网上的点对点协议) 是将点对点协议封装在以太网框架中的一种网络隧道协议。可以通过一个远端接入设备为以太网上的主机提供因特网接入服务,并对接入的每个主机实现控制、计费功能
PPPoE 帧格式
- Ver : PPPoE 版本,必须设置为 0x01
- Type : PPPoE 类型,必须设置为 0x01
- Code : 代码,指定报文类型
- 0x00 : 会话数据
- 0x09 : PADI
- 0x07 : PADO 或 PADT
- 0x19 : PADR
- 0x65 : PADS
- Session ID : 会话 ID,与以太网 Source_address 和Destination_address 一起实际地定义了一个 PPP 会话
- Length : 长度,表示 Payload 字段长度
- Payload : 包含 0 个或多个 Tag,每个 Tag 都是 Type-Length-Value 结构
- Tag_Type : 网络字节序
- Tag_Length : 网络字节序的无符号值,表明 Tag_Value 的长度
- Tag_Value : Tag 的数据字段
PPPoE 工作过程
Discovery 阶段
1. PPPoE Client 广播发送一个 PADI 报文,报文中包含 PPPoE Client 想要得到的服务类型信息
2. 所有 PPPoE Server 收到 PADI 报文后,将其中请求的服务与自己能够提供的服务进行比较,如果可以提供,则单播回复一个 PADO 报文
3. 根据网络的拓扑结构,PPPoE Client 可能收到多个 PPPoE Server 发送的 PADO 报文,PPPoE Client 选择最先收到的 PADO 报文对应的 PPPoE Server 做为自己的 PPPoE Server,并单播发送一个 PADR 报文
4. PPPoE Server 产生一个唯一的会话 ID (Session ID),标识和 PPPoE Client 的这个会话,发送一个 PADS 报文把会话 ID 发送给 PPPoE Client,会话建立成功后便进入 Session 阶段
Session 阶段
Session 阶段可分为两部分 : PPP 建立与 PPP 数据传输阶段。PPP 建立成功后,就可以承载 PPP 数据报文,该阶段所有的以太网数据包都是单播发送
Terminate 阶段
PPPoE Client 和 PPPoE Server 都可以通过发送 PADT 报文的方式来结束 PPPoE 连接。PADT 数据包可以在会话建立以后的任意时刻单播发送。在发送或接收到 PADT 后,会话释放