第一章:PPP 协议简介
PPP 协议是数据链路层协议,因此我们应该对数据链路层有简单的了解。数据链路层在
OSI 七层模型中位于最底层物理层之上,网络层之下(如图 1.1)。它一方面从物理层的 SAP
(服务访问点)得到物理层的服务,主要是信号的编码和译码、为进行同步用的前同步码的
产生和去除、比特的传输和接收等;另一方面也通过本层的 SAP 向网络层提供服务,主要
是数据链路的建立和释放帧的封装与拆卸、差错控制等。
应用层 应用层
表示层 表示层
会话层 会话层
运输层 通信子网 运输层
网络层 网络层 网络层
数据链路层 数据链路层 数据链路层
物理层 物理层 物理层
物 理 媒 质
OSI 参考模型
图 1.1
数据路层主要讨论在数据链路上帧流的传输问题。这一层协议的内容包括:帧的格式,
帧的类型,比特填充技术,数据链路的建立和终止信息流量控制,差错控制,向物理层报告
一个不可恢复的错误等。这一层协议的目的是保障在相邻的站与节点或节点与节点之间正确
地、有次序、有节奏地传输数据帧。常见的数据链路协议有两类:一是面向字符的传输控制
规程,如基本型传输控制规程(BSC);另一类是面向比特的传输控制规程,如高级数据链
路控制规程(HDLC)。主要是后一类。
用户接入 Internet,在传送数据时都需要有数据链路层协议,其中最为广泛的是串行线
路网际协议(SLIP)和点对点协议(PPP)。SLIP(Serial Line Internet Protocol)意为串行线
路 Internet 协议。它是通过直接连接和用调制解调器连接的 TCP/IP。由于 SLIP 具有仅支
持 IP 等缺点,主要用于低速(不超过 19.2kbit/s)的交互性业务,它并未成为 Internet 的标
准协议。为了改进 SLIP,人们制订了点对点 PPP(Point-to-Point Protocol)协议。PPP 协议
用于实现与 SLIP 一样的目的和作用,它在实现其作用的方式上比 SLIP 要优越得多。PPP
连接协议包括出错检测和纠正,以及分组验证,这是一个安全性特征,它能确保接收的数据
分组确实来自于发送者。这些特性合起来使得通过电话线可以建立更为安全的连接。PPP 是
一种被认可的 Internet 标准协议,所以目前得到最广泛的开发支持。
PPP 点到点协议是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。这
种链路提供全双工操作,并按照顺序传递数据包。设计目的主要是用来通过拨号或专线方式
建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解
决方案。
其功能有以下几点:
(1)PPP 具有动态分配 IP 地址的能力;
(2)PPP 支持多种网络协议,比如 TCP/IP、NetBEUI、NWLINK 等;
(3)PPP 具有错误检测以及纠错能力,支持数据压缩;
(4)PPP 具有身份验证功能。
PPP 协议中提供了一整套方案来解决链路建立、维护、拆除、上层协议协商、认证等问
题。PPP 协议包含这样几个部分:链路控制协议 LCP(Link Control Protocol);网络控制协
议 NCP(Network Control Protocol);认证协议,最常用的包括口令验证协议 PAP(Password
Authentication Protocol)和挑战握手验证协议 CHAP(Challenge-Handshake Authentication
Protocol)。LCP 负责创建,维护或终止一次物理连接。NCP 是一族协议,负责解决物理连
接上运行什么网络协议,以及解决上层网络协议发生的问题。
第二章:PPP 封装
PPP 协议为串行链路上传输的数据报定义了一种封装方法,它基于高层数据链路控制
(HDLC)标准。PPP 数据帧的格式如表格所示:
标志
0x7E
1Byte
地址
0xff
1Byte
控制
0x03
1Byte
协议
2 Byte
数据(<1500 字节)
FCS
2 Byte
标志
0x7E
1 Byte
(1)PPP 的帧格式前 3 个字段固定为:0x7E、0xFF 和 0x03。
(2)PPP 帧的长度都是整数个字节。
(3)若封装在 PPP 帧中的数据出现字节 0x7E,则用 2 字节序列 0x7D、0x5E 取代; 若
出现字节 0x7D,则用 2 字节序列 0x7D、0x5D 取代;
(4)若信息字段中出现 ASCII 码的控制字符(即小于 0x20 的字符),则在该字符前面要
加入一个 0x7D 字节,并且要将该字符转为与 0x20 进行与操作后的结果。这样做的目的是
防止这些表面上的 ASCII 码控制符(在这里实际上已不是控制符了)被错误地解释为控制符。
(5)协议字段由两个字节组成。字段中第八位必须是 0,最后一位必须为 1。链路若
收到不符合这些规则的帧,必须被视为带有不被承认的协议。
在范围"0x0***"到"0x3***"内的协议字段,标志着特殊数据包的网络层协议。
在范围"0x8***" 到"0xb***"内的协议字段,标志着数据包属于网络控制协议(NCP)。
在范围"0x4***"到"0x7***"内的协议字段,用于没有相关 NCP 的低通信量协议。
在范围"0xc***"到"0xf***"内的协议字段,标志着使用链路层控制协议(LCP)的包。
以下的值作为保留:
0xC021 链路控制协议 LCP(Link control protocol)
0xC023 密码认证协议 PAP(Password authentication protocol)
0xC025 链路品质报告 Link Quality Report
0xC223 挑战握手验证协议 CHAP(Challenge handshake authentication protocol)
0x8021 IP 控制协议 IPCP(Internet protocol control protocol)
0x0021 Internet protocol(IP)
0x0001 填料协议 (Padding Protocol)
0x0003~0x001F reserved (transparency inefficient)保留(透明度效率低的)
0x007D reserved (Control Escape)保留(控制逃逸)
0x00CF reserved (PPP NLPID)保留(PPP NLPID)
0x00FF reserved (compression inefficient)保留(压缩效率低的)
0x8001~0x801F 未使用
0x807D 未使用
0x80CF 未使用
0x80FF 未使用
(6) FCS 字段为整个帧的循环冗余校验码,用来检测传输中可能出现的数据错误。(计算
范围为 PPP 帧扣去帧头尾标志-7E 两个字节的范围)
(7) 数据字段是零或更多的字节。数据字段的最大长度,包含填料但不包含协议字段,
术语叫做最大接收单元(MRU),默认值是 1500 字节。若经过协商同意,也可以使用其它
的值作为 MRU。在传输的时候,信息字段会被填充若干字节以达到 MRU。每个协议负责
根据实际信息的大小确定填料的字节数。
(8) 即使使用所有的帧头字段,PPP 协议帧也只需要 8 个字节就可以形成封装。如果在
低速链路上或者带宽需要付费的情况下,PPP 协议允许只使用最基本的字段,将帧头的开销
压缩到 2 或 4 个字节的长度,这就是所谓的 PPP 帧头压缩。
为了加深认识,我们看一下下面这段截取的 PPP 报文:
7E FF 7D 23 C0 21 7D 21 7D 23 7D 20 7D 3D …… B1 2C 7E
根据以上规则,首先要将报文段中转意的字符转化回来。即将 7D 后的 5D、5E 转为 7D、
7E,其余的字符都减去一个 0x20。例如以上报文就转为:
7E FF 03 C0 21 01 03 00 1D …… B1 2C 7E
标志 地址 控制 LCP 协议 CRC 码 标志
这个数据包就是下一章我们要说的 LCP 链路控制协议包。
第三章:LCP 协议
§3-1:LCP 数据包
LCP 链路控制协议,用于 HDLC 的上层,用于协商适合于数据链路的选项,如指出链路
的一边同意接收的最大数据报大小即最大接收单元(MRU)。探测链路回路和其它普通的配置
错误,以及终止链路。
一个 LCP 包被封装在 PPP 数据域中,该 PPP 协议域表示为 0xC021(链路控制协议)。
LCP 包的格式如下:
代码
1Byte
标识符
1 Byte
长度
2 Byte
数据
(1)代码
代码域确定 LCP 包的种类,不同的包有不同的格式。
(2)标识符
标识符域在匹配请求和回复中有用。当带有无效标识符域的包被接收时候,该包将不影
响 LCP 自动机制,将被静静的丢弃。
(3)长度
长度域指出 LCP 包的长度,包括代码,标识符,长度和数据域。该长度必须不超过链
路的 MRU。长度域以外的字节被当作填料而忽略处理。
(4)数据
数据域是零或多个八位字节,由长度域声明。数据域的格式由代码域决定。
LCP 包有 3 类:
1.链路配置包,用于建立和配置链路:Configure-Request(匹配请求),Configure-Ack
(匹配正确应答),Configure-Nak(匹配不应答),和 Configure-Reject(匹配拒绝)。
2.链路结束包被用于结束一个链路:Terminate-Request(终止请求) 和 Terminate-Ack
(终止应答)。
3.链路维修包被用于管理和调试一个链路:Code-Reject(代码拒绝), Protocol-Reject(协
议拒绝), Echo-Request(回波请求), Echo-Reply(回波应答), 和 Discard-Request(抛弃
请求)。
下面依次介绍不同种类的 LCP 包的格式:
<1> Configure-Request(匹配请求)
一个操作想要打开一个连接必须传送一个 Configure-Request 包, Configure-Request
包的格式如下:
代码
0x01
标识符
1 Byte
长度
2 Byte
选项
标识符
用来标志不同的 Configure-Request 包。只要选项域的内容改变,并且只要收到先
前有效的 Configure-Request 包,标识符域必须被改变,以保证其唯一性,仅仅在重发
时,标识符域可以保持不变。
选项
选项域是长度的变量,并包含零个或多个发送方需要协商的配置选项的列表。列出
的全部配置选项总是被同时协商。
选项域的格式如下:
长度
1Byte
数据
类型
1Byte
类型
类型域用于指出配置选项的类型,不同的值代表不同的配置项目。以下值保留:
0x00 RESERVED(保留)
0x01 Maximum-Receive-Unit(最大-接收-单元)
0x02 Async-Control-Character-Map(异步-控制-字符-映射)
0x03 Authentication-Protocol(鉴定-协议)
0x04 Quality-Protocol(质量-协议)
0x05 Magic-Number
0x07 Protocol-Field-Compression(协议-域-压缩)
0x08 Address-and-Control-Field-Compression(地址-和-控制-域-压缩)
长度
长度域指出该配置选项(包括类型、长度和数据域)的长度。
数据
数据域是零个或者更多的八位字节,并且包含配置选项的特定详细信息,不同的配
置项目含有不同的信息。当数据域长度超过长度域所指出的长度时,整个配置包将被静
静的丢弃。
以下介绍不同的配置选项的格式:
· Maximum-Receive-Unit(最大-接收-单元)
该配置选项通知链路另一端可以接收多大的包。默认值是 1500 个字节。该选项用
于指出一个最大的容量,而不一定使用这个最大容量。例如,当一个 2048 个字节的
Maximum-Receive-Unit(MRU)被协商,一端不需要用 2048 个字节发送每个包,而可以
发送较小的包。MRU 配置选项格式如下:
类型
0x01
长度
0x04
最大接收单元
2Byte
·Async-Control-Character-Map(异步-控制-字符-映射)
该配置选项用于协商在异步链路中透明传输控制字符的方法。异步链路的每端支持
两个异步控制字符映射。接收 ACCM 是 32 位的,而发送 ACCM 可以多达 256 位,也就是
说,链路两端有四个不同的 ACCM,每端两个。
对于异步链路,默认的接收 ACCM 是 0xffffffff。默认的发送 ACCM 是 0xffffffff
加上控制逃逸字符和标记序列本身,再加上将要异步发出的而被标记的字符。对于其它
类型的连接,默认值是 0,因为对其它类型的连接而言,没有必要进行映射。默认的字
符(除了 0x20 外)都能够在所有已知的通信设备上透明传送。
然而,通常不需要映射所有的控制字符,甚至不需要映射任何控制字符。配置选项
用来通知双方哪些控制字符在发送时需要映射。一方可能仍然在映射的格式中传送其它
字符。此时发送方应该采取措施使接收方在接收时忽略这些字符。
下面所示为异步控制字符映射配置选项格式:
类型
ACCM
0x02
长度
0x06
ACCM
4Bytes
ACCM 域表示控制字符的设置。每个编号的位对应一个相同数值的八位数。ACCM 的
最后一位编号为 0,对应 ASCII 字符 NUL.如果某位上置零,表示对应值的控制字符不
被映射。如果位上置一,表示对应值的控制字符必须继续被映射。例如,如果第 19 位
置零,那么对应 ASCII 控制字符 19 要直接以 0x13 发送;反之,要以 0x7D33 发送。
· Authentication-Protocol(认证-协议)
Authentication-Protocol 配置选项格式如下:
类型
0x03
长度
1Byte
认证协议
2 Byte
数据
长度域的值大于或等于 4。认证协议域是两个八位字节,指出认证阶段想要使用的
认证协议,如:
0xC023 密码验证协议
0xC223 挑战握手验证协议
数据域是零或多个八位字节,包含由具体配置协议项目决定的附加数据。
· Quality-Protocol(质量-协议)
该配置选项用于协商链路质量监测协议,Quality-Protocol 配置选项格式如下:
类型
0x04
长度
1Byte
质量协议
2Byte
数据
长度值大于或等于 4。质量协议域指出链路想要使用的质量监测协议,如:
0xC025 链路质量报告
数据域是零或者多个八位字节,包含由具体协议项目决定的附加数据。
· Magic-Number
魔数设置主要是用来监测网络中是否有自环现象。如果Configure-Request包的发送
方反复收到和自己发送包中的魔数相同的Configure-Request包,则认为网络中存在自
环。但由于可能通信双方恰好都选择了相同的Magic-Number,造成双方或一方误认为
有自环存在,因此要有性能良好的随机数函数来产生Magic-Number。协议中建议通信
双方分别选择各自独特的随机数种子,以尽量减少误判。
Magic-Number 配置选项格式如下:
类型
0x05
长度
0x06
Magic-Number
4Byte
· Protocol-Field-Compression(协议域压缩)
Protocol-Field-Compression 配置选项格式如下:
类型
0x07
长度
0x02
该配置选项用于协商 PPP 协议域的压缩。PPP 协议域可以被压缩进一个与原来两字
节协议域有明显区别的单字节形态。该配置选项被发送来通知另一端能接收这种压缩的
协议域。只有在该配置选项协商后,被压缩的协议域才能被传送。在协商成功后,链路
必须具有同时接受双字节和单字节协议域的 PPP 包的能力,即不区别两者。当发送任何
LCP 数据包时不允许压缩协议域,这一规则保证 LCP 包的明确识别。当一个协议域被压
缩,数据链路层 FCS 域在被压缩的帧中计算,而不是最初的未压缩的帧。
· Address-and-Control-Field-Compression(地址和控制域压缩)
Address-and-Control-Field-Compression(ACFC)配置选项格式如下:
类型
0x08
长度
0x02
该配置选项用于协商数据链路层地址和控制域的压缩。由于数据链路层的地址和控
制域是常量,所以易于压缩。该配置选项被发送来通知另一端能接收压缩的地址和控制
域。如果当 ACFC 未被协商时接收到一个压缩了的帧,可以静静的丢弃该帧。当发送任
何 LCP 包时,地址和信息域必须不被压缩。这一规则保证了能明确识别 LCP 包。当地址
和控制域被压缩时,数据链路层 FCS 域在被压缩的帧中计算,而不是最初的未压缩帧。
为了加深对 LCP 数据包的认识,我们看下面一段截取的报文:
7E FF 7D 23 C0 21 7D 21 7D 21 7D 20 7D 3D 7D 21 7D 24 7D 27 D0 7D 27 7D 22
7D 28 7D 22 7D 25 7D 26 27 D2 FE 56 7D 23 7D 25 C0 23 …… 7E
转化结果如下:
7E FF 03 C0 21 01 01 00 1D 01 04 07 D0 07 02 08 02 05 06 27 D2 FE 56 03
05 C0 23 …… 7E
分析结果如下:
7E FF 03 C0 21 01 01 00 1D 01 04 07 D0
LCP 协议 Configure-Request 包 标识 长度 MRU 长度 MRU 大小
07 02 08 02 05 06 27 D2 FE 56
PFC 长度 ACFC 长度 Magic-Number 长度 Magic-Number 值
03 04 C0 23 …… 7E
认证协议 长度 PAP
<2> Configure-Ack
Configure-Ack 包格式如下:
代码
0x02
标识符
1Byte
长度
2Byte
选项
各域的意义与 Configure-Request 包相同。
Configure-Request 包的使用方法如下所述:
如果在收到的 Configure-Request 包中每一个配置选项及其所有的值都是能接受
的,那么必须传送一个 Configure-Ack 包。Configure-Ack 包中的配置选项必须是接受
的 Configure-Request 包中的配置选项的拷贝,且标识符域必须与 Configure-Request
包相同以保证匹配。
接到的与以上要求不符的包将被静静的丢弃。
<3> Configure-Nak
Configure-Nak 包格式如下:
代码
0x03
标识符
1Byte
长度
2Byte
选项
各项的意义与 Configure-Request 相同。
Configure-Nak 包的使用方法如下所述:
如果收到的 Configure-Request 包中的配置项目是可接受的,也是自己愿意协商
的,但是配置项目当中的一些值不能被接受,那么就必须传送一个 Configure-Nak 包。
其中选项域仅由收到的 Configure-Request 包中不可接受的配置选项所填充。
如果在对端列出的配置项目之外还有新的项目要求配置,则 Configure-Nak 也可以
发送新的配置项目和值,以提醒对端将其列入 Congigure-Request 包中,作为下一次发
送的请求项目。
Configure-Nak 包中的标识符域必须匹配应答的 Configure-Request 包。
接到的与以上要求不符的包将被静静的丢弃。
<4 >Configure-Reject
Configure-Reject 包的格式如下: