PPP协议详解
摘要
点对点协议(Point-to-Point Protocol,PPP)提供了一种通过点到点链路传输多协议数据报的标准方法。PPP由三个主要部分组成:
- 封装多协议数据报的方法。
- 一种链路控制协议(Link Control Protocol ,LCP),用于建立、配置和测试数据链路连接。
- 用于建立和配置不同网络层协议的一系列网络控制协议(Network Control Protocols,NCPs)。
本文件定义了PPP组织和方法、PPP封装以及可扩展的能够协商大量配置参数选项的协商机制,并提供额外的管理功能。
简介
点对点协议是为在两个对等点之间传输数据包的简单链路而设计的。这些链路提供全双工同时双向操作,并假定按顺序传送数据包。它的目的是提供一个通用的解决方案,方便连接各种各样的主机、网桥和路由器。
封装
PPP封装提供在同一链路上同时复用不同的网络层协议。PPP封装经过精心设计,以保持与最常用的支持硬件的兼容性。
在默认的类HDLC帧中使用时,封装只需要8个额外的字节来。在带宽非常宝贵的环境中,封装和帧可以缩短到2或4字节。
为了协议实现高性能,默认的封装只使用简单的字段,只需检查其中一个字段以进行分解复用。默认的标头和信息字段位于32位边界上,并且尾部可以填充到任意边界。
链路控制协议(Link Control Protocol)
为了协议的的可移植性,PPP提供了一种链路控制协议(LCP)。 LCP用于自动约定封装格式选项,处理数据包大小的不同限制,检测回环链接和其他常见的错误配置并终止链接。
其他可选功能包括对链路上其对等方的身份进行身份验证,以及确定链路何时正常运行以及何时发生故障。
网络控制协议
点对点链路往往会加剧当前网络协议家族的许多问题。例如,IP地址的分配和管理,即使在LAN环境中也是一个问题,在电路交换的点对点链路(如拨号调制解调器服务器)上尤其困难。这些问题由一系列网络控制协议(NCPs)来处理,它们各自管理各自网络层协议的特定需求。
配置
旨在使PPP链接易于配置。 通过设计,标准默认值处理所有常见配置。 实施者可以对默认配置进行改进,这些改进将自动传达给对等方,而无需操作员干预。 最后,操作员可以明确的配置链接选项,使链接能够在原本不可能运行的环境中运行。
这种自我配置是通过扩展的选项协商机制实现的,其中链路的每一端都向对方描述其功能和要求。 尽管本文档中描述的选项协商机制是根据链路控制协议(LCP)进行指定的,但相同的功能仍仍然适用于其他控制协议,尤其是NCPs家族。
术语
名词 | 解释 |
数据报 | 网络层(如IP)的传输单元。传递到数据链路层的数据报可以封装在一个或多个包中。 |
帧 | 数据链路层的传输单元。帧可以包括头部和/或尾部,以及一些数据单元。 |
包 | 封装的基本单位,通过网络层和数据链路层之间的接口传递。 数据包通常映射到一个帧。 例外情况是在执行数据链路层分段时,或者在单个帧中合并了多个数据包时。 |
对端 | 点对点链接的另一端。 |
静默丢弃 | 在没有进一步处理的情况下丢弃数据包。但应该记录包括静默丢弃的数据包的内容的错误,并且应该在统计计数器中记录事件。 |
- PPP封装
PPP封装用于消除多协议数据报的歧义,需要构思封装的开始和结束。配套文件中规定了提供框架的方法。
PPP封装如下所示。从左向右传输字段。
- Protocol字段
协议字段是一个或两个字节,其值标识封装在数据包Information字段中的数据报。首先发送和接收最高有效字节。
该字段的结构与用于地址字段的ISO 3309扩展机制一致。 所有Protocol字段必须是奇数; 最低有效字节的最低有效位必须等于“ 1”。 同样,必须分配所有Protocols,使得最高有效字节的最低有效位等于“ 0”。 收到的不符合这些规则的帧必须被视为无法识别的协议。
“0\*\*\*”到“3\*\*\*”范围内的Protocol字段值标识特定数据包的网络层协议,“8\*\*\*”到“b\*\*\*”范围内的值标识属于网络控制协议(NCP)的数据包。
“4\*\*\*”到“7\*\*\*”范围内的Protocol字段值用于没有相关NCP的低流量协议;“c\*\*\*”到“f\*\*\*”范围内的Protocol字段值将数据包标识为链路层控制协议(如LCP)。
在最新的“Assigned Numbers” RFC中指定了Protocol字段的最新值。 本规范保留以下值:
值 | 解释 |
0x0001 | 填充协议 |
0x 0003 to 0x 001f | 保留(透明度低) |
0x 007d | 保留(控制转义) |
0x 00cf | 保留(PPP NLPID) |
0x 00ff | 保留(压缩效率低) |
0x 8001 to 0x 801f | 未使用 |
0x 807d | 未使用 |
0x 80cf | 未使用 |
0x 80ff | 未使用 |
0x c021 | 链接控制协议(Link Control Protocol) |
0x c023 | 密码认证协议(Password Authentication Protocol) |
0x c025 | 链接质量报告(Link Quality Report) |
0x c223 | 质询握手身份验证协议(Challenge Handshake Authentication Protocol) |
新协议的开发者必须从Internet分配号码授权机构(IANA)处获取一个号码,BAIANA@isi.edu"">地址为IANA@isi.edu。
- Information字段
Information字段为零或多个字节。Information字段包含Protocol字段中指定的协议数据报。
Information字段的最大长度(包括填充,但不包括协议字段)称为最大接收单元(MRU),默认为1500个八位字节。通过协商,PPP实施使用其他的MRU值。
- Padding字段
在传输时,Information字段可以填充任意的字节数到MRU。每个协议都有责任区分填充字节和真实信息。
PPP链路操作
概述
为了在点到点链路上建立通信,PPP链路的每一端必须首先发送LCP分组来配置和测试数据链路。在链路建立之后,对等方可以进行认证。
然后,PPP必须发送NCP数据包以选择和配置一个或多个网络层协议。配置完成后,的就可以通过链路发送来自每个配置的网络层协议的数据报。
链路保持配置以进行通信,直到LCP或NCP数据包关闭链路或发生某些外部事件(不活动定时器到期或网络管理员干预)。
- 状态机
在配置,维护和终止点对点链路的过程中,PPP链路会经历几个不同的阶段,其状态转换图如下:
并非所有的转换都在上图中。必须遵循以下语义。
- 链路失效(物理层未就绪)
链接必定以这个阶段开始和结束。当外部事件(如载波检测或网络管理员配置)表示物理层准备好了,PPP将进入链路建立阶段。
在此阶段,LCP状态机(稍后描述)将处于Initial或Starting状态。向链路建立阶段转化会向LCP状态发送一个Up事件信号。
实现提示:
通常,在调制解调器断开后,链路将自动返回此阶段。在硬连线连接的情况下,这个阶段可能非常短——仅仅能检测存在的设备。
- 链路建立阶段
链路控制协议(LCP)用于通过交换配置数据包建立连接。一旦发送和接收到Configure Ack数据包(稍后描述),此交换完成,并进入LCP Opened状态。
如果配置交换不更改配置选项,则所有配置选项都为默认值。
需要注意的是,LCP只配置独立于特定网络层协议的配置选项。在网络层协议阶段,各个网络层协议的配置由单独的网络控制协议(NCP)处理。
在此阶段接收到的任何非LCP数据包都必须静默丢弃。
接收到LCP Configure-Request会导致从网络层协议阶段或认证阶段返回到链路建立阶段。
- 身份验证阶段
在某些链路上,在允许交换网络层协议包之前,可能需要一个对等方对自己进行身份验证。
身份验证默认不是强制性的。 如果程序希望对等体通过某种特定的认证协议进行认证,则它必须在链路建立阶段中请求使用该认证协议。
建立链接后应尽快进行认证。但是,确定链路质量可能会同时发生。程序必须不允许链路质量确定包的交换无限期地延迟认证。
在验证完成之前,绝不能发生从验证阶段到网络层协议阶段的升级。 如果认证失败,则认证者应该继续进行到链路终止阶段。
在此阶段只允许使用链路控制协议、身份验证协议和链路质量监视数据包。在此阶段接收到的所有其他数据包必须以静默丢弃。
实现说明:一个程序不应该仅仅由于超时或缺乏响应而使认证失败。 认证应该允许某种重传方法,并且仅在超过多次认证尝试之后才进入链路终止阶段。
负责链路终止阶段的程序是拒绝对等方身份验证的程序。
- 网络层协议阶段
一旦PPP完成了前面的阶段,则必须由相应的网络控制协议(NCP)配置每个网络层协议(如IP、IPX或AppleTalk)。
每个NCP可以随时打开和关闭。
实现提示:因为最初可能会使用大量的时间来确定链路质量,所以在等待对等方配置NCP时,应该不使用固定的超时。
NCP处于 “打开”状态时,PPP将携带相应的网络层协议数据包。 当相应的NCP不处于“打开”状态时,接收到的任何支持的网络层协议包必须静默丢弃。
实现提示:当LCP处于“打开”状态时,任何不支持的协议包都必须返回Protocol- Reject。只有支持的协议会被静默丢弃。
在此阶段,链路通信由LCP、NCP和网络层协议包的组合组成。
- 链路终止阶段
由于载波丢失、身份验证失败、链路质量失败、空闲时间过长或的关闭链路使PPP可以随时终止链路。
LCP通过交换Terminate数据包来关闭链路。 当链接关闭时,PPP会通知网络层协议,以便它们可以采取适当的措施。
在交换Terminate数据包之后,具体实现应该向物理层发出断开连接的信号,强制链路的终止,尤其是在认证失败的情况下。Terminate-Request的发送方在接收到Terminate-Ack或Restart计数器过期后应断开连接。Terminate-Request的接收者应等待对等方断开连接,并且在发送终止请求后至少要经过一个Restart时间后,才能断开连接。 PPP应该进入Link Dead阶段。
在此阶段接收到的任何非LCP数据包都必须静默丢弃。
实现提示: LCP关闭链接就足够了。无需每个NCP发送大量Terminate数据包。相反,即使一个NCP是当前处于“打开”状态的唯一NCP,该NCP处于Closed的状态也不足以导致PPP链路终止。
- 选项协商状态机
状态机由事件,动作和状态转换组成。事件包括接收的外部命令(如Open and Close)、Restart定时器过期以及接收到来自对等方的数据包动作包括启动Restart定时器和向对等方传输数据包。
在状态机中,某些类型的数据包(如Configure-Naks 和 Configure-Rejects,或 Code-Rejects 和 Protocol-Rejects,或 Echo-Requests, Echo-Replies 和 Discard-Requests)没有区别。这些包确实服务于不同的功能。但是,它们总是导致相同的状态转换。
- 状态转换表
状态转换表如下。水平表示状态,垂直表示事件。状态转换和动作以动作/新状态的形式表示。多个动作用逗号分隔,并且可以根据空间需要在后续行中继续;可以以任何顺序实现多个动作。状态后可以跟一个字母,表示一个解释性脚注。 破折号(’-‘)表示非法转换。
通过出现的TO事件可以识别运行Restart定时器的状态。 只有Send-Configure-Request,Send-Terminate-Request 和 Zero-Restart-Count t操作会启动或重启Restart定时器。 从定时器正在运行的任何状态转换为定时器未运行的状态时,Restart定时器都会停止。
事件和动作是根据消息传递体系结构而不是信令体系结构定义的。 如果需要控制特定信号的操作(例如DTR),则会需要其他操作。
[p] 被动选项;请参阅停止状态讨论。
[r] 重新启动选项;请参阅打开事件讨论。
[x] 交叉连接;见RCA事件讨论。
- 状态
下面详细描述状态机的每个状态。
- 初始
在初始状态下,下层不可用(Down),并且未发生任何Open,Restart定时器在初始状态下未运行。
- 启动
启动状态是初始状态相对应的打开状态。管理打开已启动,下层仍不可用(Down)。Restar定时器在启动状态下未运行。
当下层可用时(Up),则发送Configure-Request。
- 关闭
在关闭状态下,下层可用(Up),并且未发生Open。 Restart定时器未运行。
收到Configure-Request数据包后,将发送一个Terminate-Ack。 Terminate-Acks静默丢弃,以避免创建循环。
- 停止
停止状态是关闭状态相对应的打开状态。 在This-Layer-Finished动作之后或在发送Terminate-Ack之后,状态机正在等待Down事件时进入此状态。Restart定时器未运行。
收到Configure-Request数据包后,将发送适当的响应。 收到其他数据包后,将发送一个Terminate-Ack。 Terminate-Acks被静默丢弃,以避免创建循环。
基本原理:停止状态是链路终止、链路配置故障和其他状态机故障模式的连接点状态。这些可能独立的状态已经合并为停止状态。
在Down事件响应(来自This-Layer-Finished动作)和Receive-Configure-Request事件之间存在竞争条件。 当Configure-Request在Down事件之前到达时,状态机返回到启动状态来取代Down事件。 这样可以防止重复攻击。
实现提示:在对等方无法响应Configure-Requests之后,可以被动地等待对等方发送Configure-Requests。在这种情况下,This-Layer-Finished动作不用于状态为Req-Sent, Ack- Rcvd 和 Ack-Sent的TO-event。
该选项适用于专用电路或没有状态信号的电路,但不应用于开关电路。
- 正在关闭
在此状态下,尝试终止连接。已发送Terminate-Request,Restart定时器正在运行,但尚未收到Terminate-Ack。
接收到Terminate-Ack后,进入关闭状态。在Restart定时器过期时,传送新的Terminate-Request,重新启动Restart定时器。Restart定时器超过Max-Terminate次数后,进入关闭状态。
- 正在停止
正在停止状态是与正在关闭状态相对应的打开状态。已发送Terminate-Request,Restart定时器正在运行,但尚未收到Terminate-Ack。
基本原理:停止状态提供了可以在允许新流量之前终止链路的良好的机会。链路终止后,可以通过停止或启动状态进行新的配置。
- 已发送请求
在已发送请求状态下,尝试配置连接。已发送Configure-Request, Restart定时器正在运行,但尚未收到或发送Configure-Ack。
- 已收到确认
在“已收到确认”状态中,已发送Configure-Request,已收到Configure-Ack。因为尚未发送Configure-Ack,Restart定时器仍在运行。
- 已发送确认
在“已发送确认”状态中,已发送Configure-Request和Configure-Ack,但未收到Configure-Ack,Restart定时器仍在运行。
- Opened
在Opened状态下,Configure-Ack已发送和接收。Restart定时器未运行。
当进入Opened状态时,应向上层发出信号,表明已经启动了。相反,当离开Opened状态时,应向上层发出信号,表示现在已关闭。
- 事件
状态机中的状态转换和动作是由事件引起的。
- Up
当下层表示已准备好承载数据包时,发生此事件。
通常,调制解调器处理或呼叫过程或PPP链路与物理介质的其他某种耦合使用此事件,以向LCP发出信号,通知该链路正在进入链路建立阶段。
LCP也可以使用它向每个NCP发出链路正在进入网络层协议阶段的信号。 也就是说,来自LCP的This-Layer-Up动作会触发NCP中的Up事件。
- Down
当下层表示不再准备承载数据包时,发生此事件。
通常,调制解调器处理或呼叫过程或PPP链路与物理介质的其他某种耦合使用此事件,以向LCP发出信号,通知该链路正在进入链路死亡阶段。
LCP也可以使用它向每个NCP发出链路正在离开网络层协议阶段的信号。 也就是说,来自LCP的This-Layer-Down动作会触发NCP中的Down事件。
- Open
此事件表示该链接可用于通信;也就是说,网络管理员(人员或程序)表示允许打开该链接。当此事件发生时,且链接未处于打开状态,状态机尝试向对等方发送配置数据包。
如果状态机无法开始配置(下层为Down,或先前的Close事件尚未完成),则链接的建立会自动延迟。
当接收到Terminate-Request,或发生导致链接不可用的其他事件时,状态机将进入链接准备重新打开的状态。不需要额外的干预。
实现选项:经验表明,当用户想要重新协商链接时,他们将执行一个额外的Open命令,表示要协商新的值。由于这不是Open事件的含义,建议在Open、Closing、Stopping或Stopped状态下执行Open 用户命令时,先发出Down事件,紧接着发出Up事件。必须注意,不能从另一个来源同时发生Down事件。Down后Up通过从Starting状态进入Request-Sent状态,引起有序地重新协商链接,没有任何副作用。
- Close
此事件表示该链接不可用于传输;也就是说,网络管理员(人员或程序)表示不允许打开该链接。 发生此事件,且链接未处于Closed状态时,状态机将尝试终止连接。 在发生新的Open事件之前,将拒绝重新配置链接的尝试。
实现提示:当认证失败时,应终止链接,以防止重复攻击从而拒绝向其他用户提供服务。由于链接在管理上是可用的(根据定义),因此可以通过模拟LCP的Close事件,紧接着是Open事件来实现。必须注意,不能从另一个来源同时发生Close事件。
先Close后Open通过Closing进入Stopping状态引起链接有序终止,This-Layer-Finished操作可以断开链接。自动机在Stopped或Starting状态下等待下一次连接。
- Timeout (TO+,TO-)
此事件表示Restart定时器过期。Restart定时器用于对Configure-Request 和 Terminate-Request的响应进行计时。
TO+事件表示Restart计数器大于零,相应的Configure-Request或Terminate-Request数据包需要重新发送。
TO-事件表示Restart计数器不大于零,不再需要重新发送数据包。
- Receive-Configure-Request (RCR+,RCR-)
从对等方接收到Configure-Request数据包时,会发生此事件。Configure-Request包表示希望打开连接,并指定配置选项。
RCR+事件表示接受Configure-Request,并触发发送Configure-Ack数据包。
RCR-事件表示不接受Configure-Requeste,并触发发送Configure Nak或Configure Reject。
实现提示:这些事件发生在已经处于Opened状态的连接上。程序必须准备立即重新协商配置选项。
- Receive-Configure-Ack (RCA)
从对等方收到有效的Configure-Ack数据包时,发生此事件。Configure-Ack数据包是对Configure-Request数据包的肯定响应。无效的数据包被静默丢弃。
实现提示:由于在到达Ack-Rcvd或Opened状态之前已经收到了正确的数据包,因此另一个这样的数据包将极不可能到达。按照规定,所有无效的Ack/Nak/ Rej数据包都静默丢弃,并且不会影响状态机的状态转换。
但是,正确形成的数据包通过巧合的定时交叉连接到达是可能的,这很可能是实现错误的结果。应该记录这种情况。
- Receive-Configure-Nak/Rej (RCN)
从对等方收到有效的Configure-Nak或Configure-Reject数据包时,发生此事件。Configure-Nak和Configure-Reject数据包是对Configure-Request数据包的否定响应。无效的数据包被静默丢弃。
实现提示:尽管Configure-Nak和Configure-Reject在状态机中引起相同的状态转换,这两个数据包对在Configure-Request数据包中发送的配置选项产生明显不同的影响。
- Receive-Terminate-Request (RTR)
当接收到Terminate-Request数据包时,会发生此事件。Terminate-Request数据包表示对等方希望关闭连接。
实现提示:此事件与Close事件(见上文)不同,并且不会覆盖本地网络管理员的Open命令。程序必须在没有网络管理员干预的情况下,准备好接收新的Configure-Request。
- Receive-Terminate-Ack (RTA)
当接收到Terminate- Ack数据包时,会发生此事件。Terminate-Ack数据包是对Terminate-Request数据包的响应。 Terminate-Ack数据包还表示对等体处于Closed或stopped状态,并用于重新同步链路配置。
- Receive-Unknown-Code (RUC)
当从对等方接收到不可解释的数据包时,发生此事件。作为响应发送Code-Reject数据包。
- Receive-Code-Reject, Receive-Protocol-Reject (RXJ+,RXJ-)
当接收到Code-Reject 或 a Protocol-Reject数据包时,会发生此事件。
当拒绝值可接受时,例如扩展代码的Code-Reject或NCP的Protocol-Reject,RXJ +事件就会发生。 这些均在正常操作范围内。程序必须停止发送有问题的数据包类型。
当拒绝的值是灾难性的时,例如Configure-Request的Code-Reject或LCP的Protocol-Reject,则发生RXJ事件。 此事件传达了一个终止了连接的不可恢复错误。
- Receive-Echo-Request, Receive-Echo-Reply, Receive-Discard-Request (RXR)
从对等方接收到Echo-Request,Echo-Reply或Discard-Request数据包时,发生此事件。 Echo-Reply是对Echo-Request的响应。 没有对Echo-Reply或Discard-Request数据包的应答包。
- 动作
状态机中的动作是由事件引起的,通常表示数据包的传输和/或Restart定时器的启动或停止。
- Illegal-Event (-)
在正确实现的状态机中无法发生的事件。发生本事件会导致程序一个内部错误,应报告并记录该错误。 不进行任何转换,并且实现不应重置或停止。
- This-Layer-Up (tlu)
此动作向上层表示状态机正在进入Opened状态。
通常,LCP使用该动作向NCP、Authentication Protocol或Link Quality Protocol发送Up事件信号,或者NCP可以使用该动作表示链路可用于网络层通信。
- This-Layer-Down (tld)
此动作向上层表示状态机正在离开Opened状态。
通常,LCP使用该动作向NCP、Authentication Protocol或Link Quality Protocol发送Down事件信号,或者NCP可以使用该动作表示链路对其网络层通信不可用。
- This-Layer-Started (tls)
此动作向低层表示状态机正在进入Starting状态,并且需要低层链路。当低层可用时,低层应以Up事件响应。
动作的结果高度依赖于实现。
- This-Layer-Finished (tlf)
此动作向较低层表示状态机正在进入Initial、Closed或Stopped状态,不再需要低层链路。当低层终止时,低层应响应Down事件。
通常,LCP可以使用该动作来推进到Link Dead阶段,或者NCP可以使用该动作来向LCP表示在没有其他NCP打开时,链路可以终止。
- Initialize-Restart-Count (irc)
此动作将Restart计数器设置为适当的值(Max-Terminate或Max-Configure)。每次传输(包括第一次传输)计数器都递减。
实现提示:除了设置Restart计数器外,在使用Restart定时器回退时,程序还必须将超时时间设置为初始值。
- Zero-Restart-Count (zrc)
此动作设置Restart计数器为零。
实现提示:此动作使FSA能够在进入所需的最终状态之前暂停,从而允许对等方处理通信量。除了将Restart计数器归零外,程序还必须将超时时间设置为适当的值。
- Send-Configure-Request (scr)
发送Configure-Request,表示希望使用指定的配置选项打开连接。当发送Configure-Request数据包时,Restart定时器启动,以防止数据包丢失(超时),Restart计数器递减。
- Send-Configure-Ack (sca)
发送一个Configure-Ack数据包,确认接收到带有一组可接受的配置选项的Configure-Request数据包。
- Send-Configure-Nak (scn)
视情况发送Configure-Nak或Configure-Reject分组。此否定响应报告接收到带有一组不可接受的配置选项的Configure-Request包。
Configure-Nak数据包用于拒绝配置选项值,并建议一个新的可接受值。通常是因为无法识别或实现有关配置选项,Configure-Reject数据包用于拒绝所有协商。
- Send-Terminate-Request (str)
发送一个Terminate-Request数据包,表示希望关闭连接。 发送Terminate-Request数据包时,Restart定时器启动,以防止数据包丢失(超时),Restart计数器递减。
- Send-Terminate-Ack (sta)
发送一个Terminate-Ack数据包,确认了接收到了Terminate-Request数据包,否则将用于同步状态机。
- Send-Code-Reject (scj)
发送Code-Reject包,表示接收到未知类型的数据包。
- Send-Echo-Reply (ser)
发送Echo-Reply包,确认了Echo-Request数据包的接收。
- 避免环路
协议为避免配置选项协商环路做出了合理的尝试,但是,不能保证不会发生环路。与任何协商一样,可以配置两个具有冲突策略(不会达成一致)的PPP实现。也可以配置确实可以达成一致但需要花费大量资源的策略。实现者应该记住这一点,并且应该实现循环检测机制或更高级别的超时。
计数和定时器
Restart定时器
状态机使用一种特殊的定时器,Restart定时器用于对Configure-Request和Terminate-Request数据包的传输计时。Restart定时器到期将导致Timeout事件,并重传相应的Configure-Request或Terminate-Request数据包。重新启动定时器必须是可配置的,但应默认为3秒。
实现提示:Restart定时器应该基于链接的速度。 默认值用于低速(2,400至9,600 bps),高交换延迟链路(典型电话线)。高速或低切换延迟的链路应具有相应更快的重传时间。
Restart定时器可以不是一个恒定值,而是从一个较小的初始值开始,然后逐渐增加到配置的最终值。每个小于最终值的值应至少是先前值的两倍。初始值应足够大,以说明数据包的大小,以链路速度传输的往返时间的两倍,以及至少额外的100毫秒,以允许对等方在响应之前处理数据包。有些电路还增加了200毫秒的卫星延迟。工作在14400 bps的调制解调器的往返时间测量范围为160毫秒到600毫秒以上。
- Max-Terminate
Terminate-Requests有一个必需的重启计数器。 Max-Terminate表示在未接收到Terminate-Ack的情况下发送的Terminate-Request数据包的数量。 Max-Terminate必须是可配置的,默认为2次传输。
- Max-Configure
对于Configure-Request,建议使用类似的计数器。Max- Configure表示在未接收到有效的Configure Ack、Configure Nak或Configure Reject的情况下发送的Configure-Request数据包的数量。Max Configure必须是可配置的,默认为10次传输。
- Max-Failure
对于Configure-Nak,建议使用相关的计数器。Max-Failure表示在未发送Configure-Ack的情况下发送的Configure-Nak数据包的数量。达到最大发送数量的Configure-Nak,转换为Configure-Reject,并不再附加本地所需的选项。Max-Failure必须是可配置的,默认为5次传输。
- LCP 报文格式
有三类LCP数据包:
- 用于建立和配置链路的链路配置包(Configure-Request, Configure-Ack,Configure-Nak 和 Configure-Reject)。
- 用于终止链路的链路终止包(Terminate-Request和Terminate-Ack)。
- 用于管理和调试链路的链路维护数据包(Code-Reject,Protocol-Reject,Echo-Request,Echo-Reply,和Discard-Request)。
为了简单起见,LCP包中没有版本字段。一个正常运行的LCP程序总是用一个容易识别的LCP包来响应未知的协议和代码,从而为其他版本的实现提供一个确定的回退机制。
无论启用了哪个配置选项,所有LCP链路配置,链路终止和Code-Reject包(代码1到7)始终都会被发送,就好像没有协商任何配置选项一样。 特别是,每个配置选项都指定一个默认值。 这样可确保即使链路的一端错误地认为链路已打开,此类LCP数据包也始终可被识别。
在PPP信息字段中封装了正好一个LCP包,其中PPP协议字段为0xc021(链路控制协议)类型。
链路控制协议包格式如下所示。字段从左到右传输。
Code:Code字段占一个字节,用于标识LCP数据包的类型。当接收到具有未知Code域的包时,发送Code-Reject包。
LCP Code字段的最新值在最新的“Assigned Numbers”RFC[2]中指定。本文件涉及以下值:
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:Identifier字段占一个字节,有助于匹配请求和答复。 当接收到带有无效Identifier字段的数据包时,该数据包将被静默丢弃,而不会影响状态机。
Length:Length字段占两个字节,表示LCP数据包的长度,包括Code,Identifier,Length和 Data字段。长度不得超过链接的MRU。
在Length字段范围之外的字节被视为填充,并且在接收时被忽略。 当接收到带有无效Length字段的数据包时,该数据包被静默丢弃,而不会影响状态机。
Data:零个或多个字节,格式由代码字段决定。
- Configure-Request
描述:
希望打开连接的实现必须发送一个Configure-Request。选项字段中填充了对链接默认值的更改。默认的配置选项不应包含在其中。
收到Configure-Request后,必须回复适当的报文。
Configure-Request包格式如下。字段从左到右传输。
Code:1用于Configure-Request。
Identifier:当Options字段的内容更改或当收到上一个请求的有效答复时,都必须更改标识符字段。对于重传,标识符可以保持不变。
Options:选项字段的长度是可变的,包含发送者希望协商的零个或多个配置选项的列表。 所有配置选项总是同时协商的。
- Configure-Ack
描述:
如果在接收到的Configure-Request中的每个配置选项都是可识别的,并且所有值都是可接受的,则实现必须发送一个配置确认。 不得以任何方式对已确认的配置选项进行重新排序或修改。
收到Configure-Ack消息后,Identifier字段必须与最后发送的Configure-Request字段匹配。 另外,Configure-Ack中的配置选项必须与上次发送的Configure-Request中的配置选项完全匹配。 无效的数据包静默丢弃。
Configure-Ack包格式如下。字段从左到右传输。
Code:2用于Configure-Ack。
Identifier:复制与Configure-Ack匹配的Configure-Request中的Identifier字段。
Options:选项字段的长度是可变的,包含发送者确认的零个或多个配置选项的列表。 所有配置选项总是同时确认的。
- Configure-Nak
描述:
如果接收到的配置选项的每个实例都是可识别的,但是有些值是不可接受的,那么实现必须发送Configure-Nak。Options字段仅填充Configure-Request中不可接受的配置项。所有可接受的配置项都将从Configure-Nak中过滤掉,否则,来自于Configure-Request中的配置项不得重新排序。
没有值字段的选项(布尔选项)必须改用Configure-Reject 回复。
必须仅将单个实例允许的每个配置选项都必须修改为Configure-Nak发送者可接受的值。 当默认值与请求值不同时,可以使用默认值。
只允许一个实例的配置选项必须修改为Configure-Nak发送者可以接受的值。当与请求的值不同时,可以使用默认值。
当特殊类型的配置选项可以使用不同的值多次列出时,Configure-Nak必须包含Configure-Nak发送者可接受的该选项的所有值的列表,包括Configure-Request中存在的可接受值。
最后,实现可配置为请求协商特定的配置选项。如果未列出该选项,则该选项可附加到Nak的配置选项列表中,以便提示对等方在其下一个Configure-Request包中包括该选项。任何选项的值字段都必须为Configure-Nak 发送者可接受的值。
接收到的Configure-Nak的Identifier字段必须与上次发送的Configure-Request的Identifier字段匹配。无效的数据包静默丢弃。
接收到有效的Configure-Nak表示当发送新的Configure-Request时,可以按照Configure-Nak中的指定值修改配置选项。当存在一个配置选项的多个实例时,对等体应该选择一个值包含在其下一个Configure-Reques包中。
某些配置选项的长度可变。 由于Nak的选项已被对等方修改,实现必须能够处理与原始Configure-Request不同的选项长度。
Configure- Nak包格式如下。字段从左到右传输。
Code:3用于Configure- Nak。
Identifier:复制与Configure- Nak匹配的Configure-Request中的Identifier字段。
Options:选项字段的长度是可变的,并且包含发送者正在发送零个或多个配置选项的列表。 所有配置选项始终同时是Nak的。
- Configure-Reject
描述:
如果在Configure-Request中收到的某些配置选项无法识别或无法接受协商(由网络管理员配置),则实现必须发送Configure-Reject。 在Options字段中仅填充了Configure-Request中不可接受的配置选项。 所有可识别和可协商的配置选项都从Configure-Reject中过滤掉,但不得以任何方式对配置选项进行重新排序或修改。
接收到的Configure-Nak的Identifier字段必须与上次发送的Configure-Request的Identifier字段匹配。此外,Configure-Reject中的配置选项必须是上次发送的Configure-Request中的配置选项的适当子集。
Configure- Reject包格式如下。字段从左到右传输。
Code:4用于Configure- Reject。
Identifier:复制与Configure- Reject匹配的Configure-Request中的Identifier字段。
Options:Options字段的长度是可变的,包含发送方拒绝的零个或多个配置选项。所有配置选项同时被拒绝。
- Terminate-Request and Terminate-Ack
描述:
LCP包括Terminate-Request和Terminate-Ack,以便提供关闭连接的机制。
希望关闭连接的实现应该持续Terminate-Request,直到接收到Terminate-Ack,底层表示已经关闭,或者已经发送了足够大的数量,使得对等方以合理的确定性关闭 。
一旦接收到Terminate-Request,必须发送Terminate-Ack。
接收到非法的Terminate-Ack表示对等方处于关闭或停止状态,或者需要重新协商。
Terminate-Request和Terminate-Ack包格式如下。字段从左到右传输。
Code:5用于Terminate-Request;6用于Terminate-Ack。
Identifier:
在传输时,每当Data字段的内容改变或每当收到前一个请求的有效答复时,标识符字段都必须改变。 对于重传,标识符可以保持不变。
接收时,将Terminate-Request的Identifier字段复制到Terminate-Ack数据包的Identifier字段中。
Data:Data字段是零个或多个字节,包含供发送方使用的未解释的数据。数据可以包含任何二进制值。 Length表示字段的结尾。
- Code-Reject
描述:
收到具有未知Code的LCP数据包表示对等方使用其他版本进行操作。 必须通过发送Code- Reject将其报告给未知Code的发送者。
在接收到对该协议版本至关重要的Code-Reject后,实现应报告问题并断开连接,因为这种情况不太可能自动纠正。
Configure- Reject包格式如下。字段从左到右传输。
Code:7用于Code-Reject;
Identifier:对每次发送的Code-Reject,必须更改Identifier字段。
Rejected-Packet:Rejected-Packet字段包含被拒绝的从信息字段开始,不包括任何数据链路层头或FCS的LCP数据包的副本。如果包长度超过了MRU,则被拒绝的数据包必须被截断。
- Protocol-Reject
描述:
接收到带有未知Protocol字段的PPP数据包表示对等方正在使用不受支持的协议。这通常发生在对等方尝试配置新协议时。如果LCP状态机处于打开状态,则必须通过发送Protocol-Reject来向对等方报告。
收到Protocol-Reject后,实现必须尽早停止发送指定协议的数据包。
Protocol-Reject包只能在LCP处于Opened状态下发送,任何其他状态下接收的Protocol-Reject数据包都应静默丢弃。
Protocol-Reject包格式如下。字段从左到右传输。
Code:8用于Protocol-Reject;
Identifier:每次发送Protocol-Reject,必须更改Identifier字段。
Rejected-Protocol:Rejected-Protocol字段两个字节,包含被拒绝的PPP包的Protocol字段。
Rejected-Information:拒绝信息字段包含被拒绝的从信息字段开始,不包括任何数据链路层头或FCS数据包的副本。如果包长度超过了MRU,则被拒绝的数据包必须被截断。
- Echo-Request and Echo-Reply
描述:
LCP包括Echo-Request和Echo-Reply,以提供用于链路的两个方向的数据链路层环回机制。 这对于调试,链接质量确定,性能测试以及许多其他功能很有帮助。
在在LCP处于Opened状态下一旦接收Echo-Request时,必须发送Echo-Reply。
Echo-Request和Echo- Reply包只能在LCP处于Opened状态下发送,任何其他状态下接收的Echo-Request和Echo- Reply包都应静默丢弃。
Echo-Request和Echo- Reply包格式如下。字段从左到右传输。
Code:9用于Echo-Request;10用于Echo- Reply。
Identifier:
在传输时,每当Data字段的内容改变或每当收到前一个请求的有效答复时,标识符字段都必须改变。 对于重传,标识符可以保持不变。
接收时,将Echo-Request的Identifier字段复制到Echo- Reply数据包的Identifier字段中。
Magic-Number:Magic-Number字段占四个字节,有助于检测处于环回状态的链接。在协商Magic-Number配置选项成功之前,Magic-Number必须全为零。
Data:Data字段是零个或多个字节,包含供发送方使用的未解释的数据。数据可以包含任何二进制值。 Length表示字段的结尾。
- Discard-Request
描述:
LCP包括Discard-Request,以提供用于执行链路中本地到远程方向的数据链路层接收器机制。 这对于调试,性能测试以及许多其他功能很有帮助。
Discard-Request包只能在LCP处于Opened状态下发送。
一旦在接收到Discard-Request,接收方必须必须将其静默丢弃。
Discard-Request包格式如下。字段从左到右传输。
Code:11用于Discard-Request。
Identifier:每次发送Protocol-Reject,必须更改Identifier字段。
Magic-Number:Magic-Number字段占四个字节,有助于检测处于环回状态的链接。在协商Magic-Number配置选项成功之前,Magic-Number必须全为零。
Data:Data字段是零个或多个字节,包含供发送方使用的未解释的数据。数据可以包含任何二进制值。 Length表示Data字段的结尾。
- LCP配置选项
LCP配置选项在点到点链路上允许通过协商对默认特性进行修改。Configure-Request数据包中不包含的配置选项,则使用默认值。
某些配置选项可以列出多次。其效果与具体的配置选项相关,由每个配置选项描述其效果。(本规范中配置选项都不能多次列出。)
Length表示配置选项的结尾。
除非另有规定,否则所有配置选项从配置请求发送方的角度来看,在链路的接收方向都以半双工方式应用。
- 设计理念
选项表示请求选项的程序的附加功能或要求。不理解任何选项的程序应该与实现每个选项的程序进行互操作。
每个选项都有默认值,尽管性能可能不太理想,但可以使链接在不协商选项的情况下能正确运行。
除非明确指定,否则对选项的确认不要求对等方采取默认操作以外的其他任何操作。
使用默认值的配置选项不必在Configure-Request中发送。
配置选项格式如下,字段从左向右传输。
Type:Type字段占一个字节,表示配置选项的类型。Type字段的最新值在最新的“Assigned Numbers”RFC[2]中指定。本文件涉及以下值:
0 RESERVED
1 Maximum-Receive-Unit
3 Authentication-Protocol
4 Quality-Protocol
5 Magic-Number
7 Protocol-Field-Compression
8 Address-and-Control-Field-Compression
Length:Length字段占一个字节,表示此配置选项的长度,包括Type、Length和Data字段。
如果在Configure-Request中接收到长度无效或无法识别的可协商的配置选项,则应发送Configure-Nak,其中包括所希望的具有适当长度和数据的配置选项。
Data:Data字段占零个或多个的字节,并且包含特定的配置选项的信息。data字段的格式和长度由Type和Length字段决定。
当Data字段超出Length表示的Information字段末尾之外的长度指时,整个数据包在不影响状态机的情况下静默丢弃。
- Maximum-Receive-Unit (MRU)
描述:
发送本配置选项来通知对等方可以接收较大的分组,或者请求对等方发送较小的分组。
默认为1500个字节。如果请求较小的数据包,为了防止链路同步丢失,程序仍必须能够接收完整的1500个字节信息。
实现提示:
此选项用于表示程序的接收能力。对等方不需要最大限度地利用。例如,当表示MRU是2048个字节时,对等方不需要发送的报文都是2048个字节。对等方不需要发送Configure-Nak来表示它只发送较小的数据包,因为程序至少支持1500个字节的。
Maximum-Receive-Unit配置选项格式如下。字段从左到右传输。
Type:1。
Length:4。
Maximum-Receive-Unit:Maximum-Receive-Unit字段占两个字节,并指定Information和Padding字段最大字节数。它不包括帧、协议字段、FCS,也不包括任何透明位或字节。
- Authentication-Protocol
描述:
在某些链路上,在允许交换网络层协议包之前,需要对等方对自己进行身份验证。
此配置选项提供了协商使用某一协议进行身份验证的方法。默认不需要身份验证。
实现不能在其Configure-Request包中包含多个身份验证协议配置选项。相反,它应该首先尝试配置最理想的协议。如果该协议对等方不接受,那么实现应该在下一个Configure-Request中尝试下一个最理想的协议。
发送Configure-Request的实现表明它需要来自对等方的身份验证。如果实现发送Configure-Ack,那么它同意使用指定的协议进行身份验证。接收Configure-Ack的实现认为对等方使用已确认的协议进行身份验证。
不要求身份验证是全双工的,也不要求在两个方向上使用相同的协议。可以在每个方向上使用不同的协议,这将取决于协商的的具体协议。
Authentication-Protocol配置选项格式如下。字段从左到右传输。
Type:3。
Length:>= 4。
Authentication-Protocol:Authentication- Protocol字段占两个字节,表示所希望的身份验证协议。此字段的值始终与同一身份验证协议的PPP的Protocol字段值相同。
Authentication-Protocol字段的最新值在最新的“Assigned Numbers”RFC[2]中指定。当前值分配如下:
0x c023 Password Authentication Protocol
0x c223 Challenge Handshake Authentication Protocol
Data:Data字段占零个或多个字节,包含由特定协议确定的附加数据。
- Quality-Protocol
在某些链路上,希望确定何时,多频繁的丢包。这叫做链路质量监控。
此配置选项提供了协商一种用于链路质量监控使用的协议的方法。链路质量监控默认未启用。
发送Configure-Request的实现表示它希望从对等方接收监控信息。如果实现发送了Configure-Ack,则表示它同意发送指定的协议。接收到Configure-Ack的实现希望对等方发送确认的协议。
没有要求质量监控是全双工的,也没有要求在两个方向上使用相同的协议。完全可以在每个方向上使用不同的协议,这将取决于具体的协议协商。
Authentication-Protocol配置选项格式如下。字段从左到右传输。
Type:4。
Length:>= 4。
Quality-Protocol:质量协议字段占两个字节,表示所希望的链路质量监控协议。此字段的值始终与监控协议的PPP的Protocol字段值相同。
Quality -Protocol字段的最新值在最新的“Assigned Numbers”RFC[2]中指定。当前值分配如下:
0xc025 Link Quality Report
Data:Data字段占零个或多个字节,包含由特定协议确定的附加数据。
- Magic-Number
描述:
此配置选项提供了一种检测环回链路和数据链路层其他异常的方法。某些其他配置选项(如Quality-Protocol配置选项)需要此配置选项。默认不协商幻数,在使用幻数的地方插入零。
在请求此配置选项之前,实现必须选择其Magic-Number。建议以随机的方式选择Magic-Number,以保证实现以很高的概率得到唯一数。选择唯一随机数的好方法是从唯一的种子开始。建议唯一数的来源包括机器序列号、其他网络硬件地址、时钟等。特别好的随机数种子是物理事件的到达间隔时间的精确测量,例如在其他连接的网络上的分组接收、服务器响应时间或人类用户的键入速率。还建议同时使用尽可能多的来源。
当接收到带有Magic-Number配置选项的Configure-Request时,会将接收到的Magic-Number与发送给对等方的最后一个Configure-Request的Magic-Number进行比较。如果两个Magic-Number是不相等,那么链接不存在环路,并且应该确认Magic-Number。如果这两个Magic-Number相等,则链接可能(不确定)存在环路,并且此Configure-Reques实际上是最后发送的哪个请求。要确定这一点,必须发送Magic-Number不同的 Configure-Nak。新的Configure-Request不应发送到对等方,直到正常处理会导致它被发送(也就是说,直到收到Configure-Nak或重启计时器用完)。
接收到的Configure-Nak的Magic-Number不同于发送给对等方的最后一个Configure-Nak的Magic-Number表明链路没有环路,表示唯一的Magic-Number。如果Magic-Number等于最后一个Configure Nak中发送的Magic-Number,则增加了环回链路的可能性,则必须选择一个新的幻数。在任何一种情况下,都应该发送一个具有新Magic-Number的新的Configure-Request。
如果链路确实是环路,则会一遍又一遍地重复此序列(发送Configure-Request,接收Configure-Request,发送Configure-Nak,接收Configure-Nak)。如果链接没有被环回,这个序列可能会出现几次,但是重复出现的可能性非常小。更有可能的是,在两端选择的幻数会迅速发散,终止序列。下表显示了假设链接的两端的Magic-Number完全均匀分布的冲突概率:
这种分歧的发生需要良好的唯一性或随机性来源。如果找不到良好的唯一性源,建议不要启用此配置选项;不应传输带有此选项的Configure-Request,并且应确认或拒绝对等方发送的任何Magic-Number配置选项。在这种情况下,环路链路不能被实现可靠地检测到,尽管它们仍然可以被对等方检测到。
如果程序发送带有Magic-Number配置选项的Configure-Request,那么当它接收到带有Magic-Number配置选项的Configure-Request时,就不能使用Configure-Reject进行响应。也就是说,如果程序希望使用Magic-Number,那么它还必须允许它的对等方这样做。如果一个实现收到一个Configure-Reject,那么它只能意味着链接没有环路,并且对等方不会使用Magic-Number。在这种情况下,实现应该像协商成功一样工作(就像它收到了Configure-Ack)。
Magic-Number还可以用于在正常操作期间检测环路链接。所有的LCP Echo-Request,Echo-Reply和Discard-Request数据包都有一个Magic-Number字段。在成功协商了Magic-Number数情况下,则程序发送的这些包中其Magic-Number字段必须为协商的Magic-Number。
这些包的Magic-Number字段应该在接收时检查。根据对等方是否协商了Magic-Number,所接收到的Magic-Number字段必须等于零或对等方的唯一幻数。接收到的等于经协商的本地Magic-Number的Magic-Number字段表示存在环路。 接收到的Magic-Number不等于经协商的本地Magic-Number,对等方的协商的Magic-Number以及零,则表示已(错误)配置了与其他对等方通信的链接。
存在环路时,有两种方案。一种是假设状态机收到LCP的Down事件。直到环路条件终止,并且成功协商幻数,则Open事件开始重新建立链接的过程才能完成。另一种则是开始发送LCP 的Echo-Request包,直到接收到表示环路终止的适当的Echo-Reply。
Magic-Number配置选项格式如下。字段从左到右传输。
Type:5。
Length:6。
Magic-Number:Magic-Number字段占四个字节,该数字对于链接的一端是唯一的。Magic-Numbe为零是非法的。如果Magic-Number没有被拒绝,则必须始终是Nak’d。
- Protocol-Field-Compression (PFC)
描述:
此配置选项提供了协商PPP协议字段压缩的方法。所有实现默认都使用两个字节PPP协议字段来传输数据包。
选择PPP协议字段号,以便将一些值压缩成单个字节形式。发送此配置选项是通知对等方,实现可以接收这样的单字节协议字段。
如前所述,协议字段使用与地址字段的iso3309扩展机制一致的扩展机制;每个字节的最低有效位(LSB)用于指示协议字段的扩展。LSB为“0”表示Protocol字段继续使用以下字节。LSB为“1”表示协议字段的最后一个字节。请注意,任何数量的“0”八位字节都可以在字段前面,并且仍然指示相同的值(考虑000000011和000000000000011的两个二进制表示法)。
使用低速链路时,希望发送尽可能少的冗余数据来节省带宽。Protocol-Field-Compression配置选项允许在实现简单性和带宽效率之间进行权衡。如果协商成功,可以使用iso3309扩展机制将Protocol字段压缩为一个字节而不是两个字节。,因为数据协议分配的Protocol字段值通常小于256,所以大多数数据包是可压缩的。
除非已协商此配置选项,否则不能传输Compressed Protocol字段。协商时,PPP实现必须同时接受具有双字节以及单字节的Protocol字段的PPP数据包,并且不能区分它们。
为了明确识别LCP包,LCP数据包从不压缩Protocol字段。
Protocol字段被压缩时,数据链路层FCS字段在压缩帧上计算。
Protocol-Field-Compression配置选项格式如下。字段从左到右传输。
Type:7。
Length:2。
- Address-and-Control-Field-Compression (ACFC)
描述:
此配置选项提供协商数据链路层地址和控制字段压缩的方法。所有实现默认都传输具有与链接帧相适应的地址和控制字段的帧。
对于点到点链接,这些字段通常具有常量值,很容易被压缩。发送此配置选项是为了通知对等方程序可以接收压缩的地址和控制字段。
Address-and-Control-Field-Compression未经协商时,收到压缩帧,则程序会静默丢弃该帧。
为了明确识别LCP包,LCP数据包从不压缩地址和控制字段。
地址和控制字段被压缩时,数据链路层FCS字段在压缩帧上计算。
Address-and-Control-Field-Compression配置选项格式如下。字段从左到右传输。
Type:8。
Length:2。
- 安全考虑
在有关身份验证阶段、Close事件和Authentication-Protocol协议配置选项的部分讨论了安全问题。
还没有评论,来说两句吧...