Point-to-Point Protocl
2007-11
1. 介绍
PPP协议为在同等单元之间传输数据包的简单链路而设计的。链接提供了全双工的双向操作,并按照顺序传递数据包。PPP协议意在为各种类型的主机、网桥和路由器提供通用的解决方案。 封装
PPP封装为不同网络层协议同时提供基于相同链接的多路技术。PPP封装大多数支持的硬件保持兼容而精心设计。
当默认的HDLC链接帧时,PPP封装只有8个附加的字节。在节省宽带费用方面,封装可以短到2或4个字节。
为了支持高速操作,默认封装使用简单域。默认的头和信息域以32位为单位,而数据包尾可以任意填充。
链接控制协议
为了有效的适用于各种不同的情况,PPP协议提供了链接控制协议(Link Control Protocol),简称LCP。链接控制协议用于自动协商封装格式选项、处理包大小变化的限制、删除回环链接和其他通用杂项配置错误,以及终止链接。链接控制协议提供在链接中的对端的身份认证,决定链接成功或者失败。 网络控制协议
PPP链接专著于当前网络协议家族的许多恶化的问题。例如,IP地址的分配和管理,在局域网环境它是一个简单的问题,而在电路交换的点对点链接(如拨号调制解调器服务器)中它则特别的困难。在PPP协议中这些问题由网络控制协议(Network Control Protocol,简称NCP)家族处理,每个管理由各自的网络层协议管理。网络控制协议在其它的文档中定义。
配置
配置旨在与让PPP链接变得易于配置。通过设计,标准默认处理所有通用配置。这个实施能改进默认没有端点干涉的情况下自动配置。
自己配置是在可扩展的协商机制下进行。链接中的各点描述对另外一端的接收能力和必备条件。尽管可选的协商机制在链接控制协议(LCP)中描述,但相同的方式也设计用于其它控制协议,尤其是网络控制协议家族。
1.1.要求规格
在这个文档中,几个关键字用于标示规格的要求。这些关键字是:
MUST:必须。这个关键字意味着定义一个绝对的要求。
MUST NOT:必须不。这个关键字定义意味着绝对不的规格要求。
SHOULD:应该。这个关键字定义意味着可能在特定的条件存在无效的原因而忽略它,但全部的含义是在选择不同的方法前,必须要明白和仔细地衡量。
MAY:可能。这个关键字定义意味着这项是个二选一。
1.2.术语
这个文档经常使用以下的术语。
datagram:数据报文,这个单元传输在网络层(如IP层)。一个数据报文(datagram)必须封装在一个或者多个链路层数据中传递。
frame:数据帧,这个单元传输在链路层。一个数据帧包括一个头和/或尾,在其中是一个或多个数据单元。
packet:数据包,封装的基本单元,它可以传递在网络层和数据链路层。一个数据包通常映射在数据帧中,除非数据链路层分片或者多个数据包组成一个单数据帧。
peer:端点,是PPP链接中的另外一端。
silently discard:丢弃,执行不经过处理的丢弃数据包。这个执行应该(SHOULD)提供标致错误的能力,包括丢弃的数据包的内容,同时应该(SHOULD)记录这个事件的统计计数。
2. PPP封包
PPP封包用于消除多协议数据报文(datagram)的歧义。这个封包要求组帧指示封包的开始和结束。
PPP封包的概图如下图1所示。数据传输从左至右。
图1:PPP封装
协议域:1字节或者2字节,它用于识别封包的数据报文中的信息域。这个域的结构与ISO 3309对于地址域的外延机制一致。所有的协议必须(MUST)是奇数,最后一个字节的最后一位必须是‘1’。
协议域的值0x0000~0x3FFF范围标示特定数据包的网络层协议,0x8000~0xBFFF范围标示为网络控制协议,0xC000~0xFFFF范围标示链路控制协议(如LCP)。
协议域值与对应的协议名如表1所示。
表1:协议域值与对应的协议名
序号 | 协议域值 | 协议名 |
1 | 0x0001 | Padding Protocol |
2 | 0x0003~0x001F | reserved (transparency inefficient) |
3 | 0x007D | reserved (Control Escape) |
4 | 0x00CF | reserved (PPP NLPID) |
5 | 0x00FF | reserved (compression inefficient) |
6 | 0x8001~0x801F | unused |
7 | 0x807D | unused |
8 | 0x80CF | unused |
9 | 0x80FF | unused |
10 | 0xC021 | Link Control Protocol |
11 | 0xC023 | Password Authentication Protocol |
12 | 0xC025 | Link Quality Report |
13 | 0xC223 | Challenge Handshake Authentication Protocol |
| | |
新协议的开发者必须从IANA(Internet Assigned Numbers Authority)获得协议域的数值。
信息域:可以是0字节或者多个字节。信息域包含了数据报文协议域指定的协议。
信息域的最大长度,包括填充,但不包括协议域,成为最大接收单元(Maximum Receive Unit简称MRU),默认是1500字节。通过协商,PPP可以使用其它值的MRU。
填充域:在传输时,信息域可以用任意8位的数据填充以达到MRU值。每个协议都有区别填充字节的能力,通过真实的信息。
3. PPP链接操作
3.1.概述
为了在点对点链接上建立通信,PPP链接的每端必须发送链接控制协议(LCP)数据包来配置和测试数据链接。链接建立后,对端可以被识别。
然后,PPP链接必须发送网络控制协议(NCP)数据包来选择和配置1个或者多个网络层
协议。一旦选择的网络层协议被配置,来之每个网络层协议的数据报文就能够在链接上发送。
链接将维持为通信设置的配置,直到LCP或者NCP包关闭链接,或者直到一些外部事件出现(如不激活定时器超时或者网络管理员干预)。
3.2.状态转移图
在PPP链接的配置、维持和终止处理过程中,PPP链接要经过好几个不同的状态,其状态定义如下图2所示。
图2:PPP链接状态图
3.3.链路静止阶段/Link Dead(物理层没有准备好)
一个连接的开始和结束都要经历这个阶段。当一个外部事件指示物理层已准备好并可使用时,PPP进入建立连接阶段。此时,LCP自动机处于初始阶段。当它向链路建立阶段转换时将给LCP自动机发送一个UP事件信号。
3.4.链接建立阶段/Link Establish
LCP用于交换配置信息包、建立连接。一旦一个配置成功的信息包发送且被接收,就完成了交换,进入LCP开启状态。所有的配置选项都假定使用默认值,除非在配置交换过程中被改变。只有那些与特定的网络层协议无关的选项才会被LCP配置。收到LCP配置数据包将使链路从网络层协议阶段或者认证阶段返回到链路建立阶段。
3.5.认证阶段/Authentication
在某些连接情况下,希望在允许网络层协议交换数据前对等实行认证。默认情况下,是不要求认证的。认证要求必须在建立连接阶段提出,然后进入认证阶段。如果认证失败,将进入连接终止阶段。在此阶段只对连接协议、认证协议、连接质量测试数据包进行处理。
3.6.网络层协议阶段/Network
一旦PPP完成上述阶段,便进入网络协议阶段。每一个网络层协议 (例如IP、IPX、AppleTalk等)必须有相应的网络控制协议(NCP)单独配置,每个网络控制协议都可以随时打开或关闭。此阶段,LCP协议自动状态机处于打开状态,接收到的任何不支持的协议数据包都会被返回一个协议拒绝包,而接收到的所有支持的数据包都将被丢弃。此时,链路上流通的是LCP数据包、NCP数据包以及网络协议数据包。
3.7.终止阶段/Termination
PPP连接可以随时被终止。LCP通过交换连接终止包来终止连接。当连接被终止时,PPP会通知物理层采取相应的动作。只有当物理层断开,连接才会真正被终止。此阶段,接收到的所有非LCP数据包都将被丢弃。
4. 自动协商机制
有限状态自动机器由事件、动作和状态转换定义。事件包括接收外部命令,如打开、关闭、重新开始定时器溢出,和接收到来之对端的数据包。动作包括重新开始定时器的开始、来之
对端的数据包的传输。
一些类型的数据包——配置应答(Configure-Naks)包和配置拒绝(Configure-Rejects)包,或者代码拒绝(Code-Rejects)包和协议拒绝(Protocol-Rejects)包,或者回环请求(Echo-Requests)包、回环应答(Echo-Replies)包和丢弃请求(Discard-Requests)包,是不被区别的在自动协商时。它们在后面描述,这些包服务于不同的功能。然而,他们总也引起同样的转换。
4.1.状态转化表
4.2.状态(States)
4.3.事件(Events)
4.4.动作(Actions)
4.5.回环避免(Loop Avoidance)
4.5.计数器和定时器(Counters and Timers)
5. LCP包格式
有3类的LCP数据包:
用于建立和配置链接的链接配置包:配置请求、配置应答、配置非应答、配置拒绝。
用于终止链接的连接终止包:终止请求、终止应答。
用于维持和调试链接的链接维持包:代码拒绝、协议拒绝、回环请求、回环应答、丢弃请求。
有趣的是,在LCP包中没有版本域。正确的LCP机能执行总应答不知名的协议和代码,用易于组织的LCP包。因此,对于别的版本的执行提供了一个确定性的退却机制。
不论配置选项使能,所有的LCP链接配置、链接终止和代码拒绝包(代码从1到7)总是被发送,如果没有配置选项协商。在特殊情况,配置选项使用默认值。这确保LCP包总能被确认,即使链接结束被误认为是链接打开。
严格地说,LCP包是打包在PPP的信息域,PPP包的协议域指示协议类型为0xC021(链接控制协议)。
LCP包的格式如下图3所示。
图3:LCP的帧格式
Code:1字节,用于标示LCP包的类型。当收到一个代码(Code)域不认识的包时,将发送代码拒绝(Code-Reject)包。
代码定义如下表2所示。
表2:LCP包的代码域定义
代码(Code) | 描 述 |
1 | Configure-Request |
2 | Configure-Ack |
3 | Configure-Nak |
4 | Configure-Reject |
5 | Terminate-Request |
6 | Terminate-Ack |
7 | Code-Reject |
8 | Protocol-Reject |
9 | Echo-Request |
10 | Echo-Reply |
11 | Discard-Request |
| |
Identifier:1字节,目的在于匹配请求和应答。当接收到一个带无效的标示ID(Identifier)的LCP包时,接收端不做任何处理的丢弃这个包。
Length:2字节,标示LCP包的长度,这个长度包括代码(Code)、标示(Identifier)、长度(Length)和数据。这个长度不能超过链接的MRU。