RPC系列协议--rfc1661--Point-to-Point Protocol--PPP
- 摘要
- 1.介绍
- 封装(Encapsulation)
- 链路控制协议(Link Control Protocol)
- 网络控制协议(Network Control Protocols)
- 配置(Configuration)
- 术语(Terminology)
- 2.PPP Encapsulation
- 3.PPP Link Operation
- 概述
- Phase Diagram
- Link Dead (physical-layer not ready)
- Link Establishment Phase
- Authentication Phase
- Network-Layer Protocol Phase
- Link Termination Phase
- 4.LCP Packet Formats
- Configure-Request
- Configure-Ack
- Configure-Nak
- Configure-Reject
- Terminate-Request and Terminate-Ack
- Code-Reject
- Protocol-Reject
- Echo-Request and Echo-Reply
- Discard-Request
- 5.LCP Configuration Options
摘要
点对点协议(PPP)提供了一种通过点对点链接传输多协议数据报的标准方法。PPP由三个主要部分组成:
a.一种封装多协议数据报的方法。
b.链路控制协议(LCP),用于建立、配置和测试数据链路连接。
c.一组网络控制协议(NCPs),用于建立和配置不同的网络层协议。
定义了PPP组织和方法,以及PPP封装,以及一个可扩展的选项协商机制,该机制能够协商各种配置参数并提供额外的管理功能。该机制描述了PPP链路控制协议(LCP)。
1.介绍
点对点协议是为在两个对等点之间传输数据包的简单链接而设计的。这些链接提供全双工同步双向操作,并假定按顺序传递数据包。它的目的是PPP提供一个公共的解决方案,方便连接各种各样的主机、网桥和路由器。
封装(Encapsulation)
PPP封装提供了在同一链路上同时多路复用不同的网络层协议。PPP封装经过精心设计,以保持与最常用的支持硬件的兼容性。
当在默认的类HDLC帧中使用时,仅需要8个额外的八位元来形成封装。在带宽很昂贵的环境中,封装和帧可能会被缩短到2或4字节。为了支持高速实现,默认的封装只使用简单的字段,在进行解复用时只需要检查其中一个字段。默认的标题和信息字段位于32位边界上,并且尾部可能被填充到任意的边界上。
链路控制协议(Link Control Protocol)
为了有足够的通用性,以便能够移植到各种各样的环境中,PPP提供了一种链路控制协议(LCP)。LCP用于自动同意封装格式选项,处理对包大小的各种限制,检测回环链接和其他常见的错误配置错误,并终止链接。提供的其他可选功能包括验证链接上的对等节点的身份,以及确定链接何时正常运行以及何时失效。
网络控制协议(Network Control Protocols)
点对点链接往往会加剧当前网络协议家族的许多问题。例如,IP地址的分配和管理,即使在局域网环境中也是一个问题,在线路交换的点对点链接(如拨号调制解调器服务器)上尤其困难。这些问题由一系列网络控制协议(NCPs)处理,每个协议管理各自的网络层协议所需的特定需求。这些NCPs在配套文档中定义。
配置(Configuration)
它的目的是PPP链接易于配置。按照设计,标准默认值处理所有常见配置。实现者可以指定对默认配置的改进,这些改进可以自动地与对等点通信,而无需操作员的干预。最后,操作符可以显式地为链接配置选项,使链接能够在其他情况下不可能操作的环境中进行操作。
这种自配置是通过可扩展的选项协商机制实现的,其中链接的每一端向另一端描述其功能和需求。尽管本文档中描述的选项协商机制是按照链路控制协议(Link Control Protocol, LCP)指定的,但同样的功能也被设计用于其他控制协议,特别是NCPs家族。
术语(Terminology)
datagram:网络层(如IP)中的传输单元。数据报可以封装在传递给数据链路层的一个或多个数据包中。
frame:在数据链路层传输的单位。帧可以包括头部和/或尾部,以及一些数据单元。
packet:封装的基本单元,它通过网络层和数据链路层之间的接口传递。包通常被映射到一个帧;例外情况是当执行数据链路层碎片时,或者当多个包合并到一个帧时。
peer:点对点链接的另一端
silently discard:实现丢弃包而不进行进一步处理。实现应该提供记录错误的功能,包括静默丢弃包的内容,并且应该在统计计数器中记录事件。
2.PPP Encapsulation
PPP封装用于消除多协议数据报的歧义。这种封装需要帧来指示封装的开始和结束。提供帧的方法在附加文档中指定。PPP封装的摘要如下所示。字段从左向右传输。
Protocol | Information | Padding |
---|---|---|
8/16 bits | * | * |
Protocol Field
协议字段是一个或两个八位元,它的值标识包的信息字段中封装的数据报。发送和接收域最重要的八位元。
Value (in hex) | Protocol Name |
---|---|
0001 | Padding Protocol |
0003 to 001f | reserved (transparency inefficient) |
007d | reserved (Control Escape) |
00cf | reserved (PPP NLPID) |
00ff | reserved (compression inefficient) |
8001 to 801f | unused |
807d | unused |
80cf | unused |
80ff | unused |
c021 | Link Control Protocol |
c023 | Password Authentication Protocol |
c025 | Link Quality Report |
c223 | Challenge Handshake Authentication Protocol |
Information Field
信息字段为零或多个八位元。信息字段包含协议字段中指定的协议的数据报。
信息字段的最大长度(包括填充,但不包括协议字段)称为最大接收单元(MRU),它的缺省值为1500字节。通过协商,同意PPP实现可以为MRU使用其他值。
Padding
在传输时,信息字段可以填充到MRU的任意数量的八位元。每个协议的责任是区分填充的八进制数和真实的信息。
3.PPP Link Operation
概述
为了在点对点链路上建立通信,PPP链路的每一端必须首先发送LCP数据包来配置和测试数据链路。建立链接之后,可以对对等点进行身份验证。然后,PPP必须发送NCP数据包来选择和配置一个或多个网络层协议。一旦每个选择的网络层协议被配置好,来自每个网络层协议的数据报就可以通过链接发送。该链接将保持通信配置,直到显式的LCP或NCP数据包关闭该链接,或者直到发生一些外部事件(非活动计时器过期或网络管理员干预)。
Phase Diagram
在点对点链路的配置、维护和终止过程中,PPP链路经历了几个不同的阶段,具体如下简化状态图所示:
Link Dead (physical-layer not ready)
链接必须以这个阶段开始和结束。当外部事件(如载波检测或网络管理员配置)表明物理层可以使用时,PPP将进入链路建立阶段。在此阶段,LCP自动机(稍后将进行描述)将处于初始或启动状态。向链路建立阶段的转换将向LCP自动机发出Up事件的信号。
Link Establishment Phase
链路控制协议(LCP)用于通过交换配置包来建立连接。一旦发送和接收了一个Configure-Ack包(稍后将进行描述),交换就完成了,并进入了LCP打开状态。除非配置交换器更改,否则所有配置选项都假定为默认值。有关LCP配置选项的进一步讨论,请参阅本章。需要注意的是,只有独立于特定网络层协议的配置选项才由LCP配置。在网络层协议阶段,单个网络层协议的配置由单独的网络控制协议(NCPs)处理。在此阶段接收到的任何非lcp数据包都必须静静地丢弃。收到LCP配置请求会导致从网络层协议阶段或身份验证阶段返回到链路建立阶段。
Authentication Phase
在某些链接上,在允许交换网络层协议包之前,可能需要对等点对自己进行身份验证。默认情况下,身份验证不是强制性的。如果实现希望对等方使用某些特定的身份验证协议进行身份验证,则必须在链接建立阶段请求使用该身份验证协议。认证应在链接建立后尽快进行。然而,链路质量的确定可能同时发生。实现不允许交换链路质量确定包来无限期地延迟身份验证。在身份验证完成之前,不能从身份验证阶段推进到网络层协议阶段。如果身份验证失败,则身份验证器应该继续到链接终止阶段。此阶段只允许链路控制协议、认证协议和链路质量监控包。在此阶段接收到的所有其他数据包必须静默丢弃。
Network-Layer Protocol Phase
一旦PPP完成了前面的阶段,每个网络层协议(如IP、IPX或AppleTalk)必须由适当的网络控制协议(NCP)单独配置。每个NCP可以在任何时候打开和关闭。NCP到达打开状态后,PPP将携带相应的网络层协议包。当相应的NCP不处于打开状态时接收到的任何受支持的网络层协议包都必须静静地丢弃。在此阶段,链路流量由LCP、NCP和网络层协议包的任何可能组合组成。
Link Termination Phase
PPP可以在任何时候终止链接。这可能是由于运营商丢失、身份验证失败、链接质量失败、空闲期计时器过期或链接的管理关闭造成的。LCP用于通过交换终止包来关闭链接。当连接关闭时,PPP通知网络层协议,以便他们可以采取适当的行动。在交换终止包之后,实现应该向物理层发出断开的信号,以强制终止链接,特别是在身份验证失败的情况下。Terminate-Request的发送方应在收到Terminate-Ack或重启计数器过期后断开连接。Terminate-Request的接收方应等待对等方断开连接,并且在发送Terminate-Ack之后,在至少一次重新启动时间过去之前,绝不能断开连接。PPP应该进入链路终止阶段。在此阶段接收到的任何非LCP数据包都必须静静地丢弃。
4.LCP Packet Formats
这里有三种类型LCP包:
a.用于建立和配置链接的链接配置包(Configure-Request, Configure-Ack, Configure-Nak and
Configure-Reject)
b.用于终止链接的链路终止包(Terminate-Request and Terminate-Ack)
c.用于管理和调试链接的链接维护包(Code-Reject, Protocol-Reject, Echo-Request, Echo-Reply, and
Discard-Request)
为了简单起见,LCP包中没有版本字段。一个正确运行的LCP实现总是使用一个易于识别的LCP包来响应未知的协议和代码,从而为其他版本的实现提供了确定的后备机制。不管启用了哪些配置选项,所有LCP链接配置、链接终止和代码拒绝包(代码1到7)总是像没有协商任何配置选项一样发送。特别是,每个配置选项都指定一个默认值。这确保了这样的LCP包总是可识别的,即使链接的一端错误地认为链接是打开的。只有一个LCP包封装在PPP信息字段中,其中PPP协议字段指示类型为十六进制c021(链路控制协议)。链路控制协议包格式的摘要如下所示。
Code | Identifier | Length | Data |
---|---|---|---|
1byte | 1byte | 2byte | variable |
Code:代码字段是一个八位元,用来识别LCP包的类型。当接收到带有未知码域的包时,发送一个拒绝码包。LCP代码字段的最新值在最近的“分配号”RFC[2]中指定。
ID | name |
---|---|
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:标识符字段是一个八字节,它帮助匹配请求和应答。当接收到带有无效标识符字段的包时,该包将被静静地丢弃,而不影响自动机。
Length:长度字段是两个八进制数,表示LCP包的长度,包括代码、标识符、长度和数据字段。长度不能超过链路的MRU。长度字段范围之外的八进制数被视为填充,在接收时被忽略。当接收到长度字段无效的数据包时,该数据包将被静静地丢弃,而不影响自动机。
Data:数据字段是零个或多个八位元,由长度字段表示。数据字段的格式由Code字段决定。
Configure-Request
Description | 打开连接的实现必须传输一个配置请求。Options字段填充了对链接默认值的任何更改。配置选项不应该是包含在默认值中。在接收到配置请求后,必须发送适当的回复。 |
---|---|
Options | 长度是可变的,包含发送方希望协商的零个或多个配置选项的列表。所有的配置选项都是同时协商的。 |
Configure-Ack
Description | 如果在配置请求中接收到的每个配置选项都是可识别的,并且所有值都是可接受的,那么实现必须传输一个Configure-Ack。不能以任何方式重新排序或修改已确认的配置选项。在接收Configure-Ack时,标识符字段必须与最后传输的Configure-Request相匹配。此外,Configure-Ack中的配置选项必须与最后传输的Configure-Request的配置选项完全匹配。无效的信息包被静静地丢弃。 |
---|---|
Options | 长度是可变的,包含发送方确认的零个或多个配置选项的列表。所有配置选项总是同时被确认。 |
Configure-Nak
Description | 如果接收到的配置选项的每个实例都是可识别的,但是有些值是不可接受的,那么实现必须传输一个Configure-Nak。Options字段只填充来自Configure-Request的不可接受的配置选项。所有可接受的配置选项都从Configure-Nak中过滤掉,但是来自Configure-Request的配置选项必须不被重新排序。没有值字段的选项(布尔选项)必须使用Configure-Reject应答。 |
---|---|
Options | 长度是可变的,包含发送方Nak’ing的零个或多个配置选项的列表。所有配置选项总是同时关闭。 |
Configure-Reject
Description | 如果在配置请求中接收到的某些配置选项无法识别或协商无法接受(由网络管理员配置),则实现必须传输Configure-Reject。Options字段只填充来自Configure-Request的不可接受的配置选项。所有可识别的和可协商的配置选项都从Configure-Reject中过滤掉了,但是其他配置选项不能以任何方式重新排序或修改。 |
---|---|
Options | 长度是可变的,包含发送方拒绝的零个或多个配置选项的列表。所有配置选项总是同时被拒绝。 |
Terminate-Request and Terminate-Ack
Description | LCP包括Terminate-Request和Terminate-Ack以提供关闭连接的机制,希望关闭连接的实现应该发送一个Terminate-Request,Terminate-Request应该继续发送,直到接收到Terminate-Ack较低的层表明它已经down,或者传输了足够大的数量,使得对等端在合理确定的情况下down。在接收到Terminate-Request时必须传输Terminate-Ack。接收未引出的Terminate-Ack表明对等方处于封闭或停止状态,或者需要重新协商。 |
---|
Code-Reject
Description | 接收到带有未知代码的LCP包表明对等方正在使用不同的版本进行操作。这必须通过发送代码拒绝向未知代码的发送方报告。在接收到对这个协议版本至关重要的代码的代码拒绝之后,实现应该报告问题并断开连接,因为这种情况不太可能自动纠正。 |
---|---|
Rejected-Packet | 包含正在被拒绝的LCP包的副本。它以信息字段开始,不包括任何数据链路层头或FCS。被拒绝的数据包必须被截断以符合对等方建立的MRU。 |
Protocol-Reject
Description | 接收到一个未知协议域的PPP数据包,表明对方正在尝试使用一个不受支持的协议。当对等方尝试配置新协议时,通常会发生这种情况。如果LCP自动机处于打开状态,则必须通过传输Protocol-Reject向对等方报告。接收到Protocol-Reject后,实现必须尽早停止发送所述协议的数据包。Protocol-Reject数据包只能在LCP打开状态下发送。在LCP打开状态之外的任何状态下接收的Protocol-Reject数据包都应该被静默丢弃。 |
---|---|
Rejected-Protocol | 两个八进制数,包含被拒绝的数据包的PPP协议字段。 |
Rejected-Information | 包含正在被拒绝的包的副本。它以信息字段开始,不包括任何数据链路层头或FCS。拒绝信息必须被截断以符合对等方的已建立的MRU。 |
Echo-Request and Echo-Reply
Description | LCP包括Echo-Request和Echo-Reply以提供数据链路层环回机制,用于执行链路的两个方向。这对于调试、链接质量确定、性能测试和许多其他功能都很有用。当接收到处于LCP打开状态的Echo-Request,必须发送Echo-Reply响应。Echo-Request和Echo-Reply只能在LCP打开状态下发送,在LCP打开状态之外的任何状态下接收的Echo-Request和Echo-Reply包都应该被静静地丢弃。 |
---|---|
Magic-Number | 四个八位元,并帮助检测环节,是在回送条件。在成功协商Magic-Number配置选项之前,Magic-Number必须传输为零。 |
Data | 零个或多个八位元,包含发送方使用的未解释的数据。数据可以由任何二进制值组成。字段的结束由长度表示。 |
Discard-Request
Description | LCP包括Discard-Request以便提供数据链路层接收器机制,用于执行链路的本地到远程方向。这对于调试、性能测试和许多其他功能都很有用。Discard-Request包必须仅在LCP打开状态下发送。在接收时,接收方必须静静地丢弃它所接收到的任何Discard-Request。 |
---|---|
Magic-Number | 四个八位元,并帮助检测环节,是在回送条件。在成功协商Magic-Number配置选项之前,Magic-Number必须传输为零。 |
Data | 零个或多个八位元,包含发送方使用的未解释的数据。数据可以由任何二进制值组成。字段的结束由长度表示。 |
5.LCP Configuration Options
LCP配置选项允许对点到点链接的默认特征进行修改协商。如果配置选项不包含在配置请求包中,则假定该配置选项的默认值。某些配置选项可能被列出多次。此效果是特定于配置选项的,并由每个此类配置选项描述指定。
Design Philosophy:这些选项指示正在请求该选项的实现的其他功能或需求。不理解任何选项的实现应该与实现每个选项的实现进行互操作。每个选项都指定了一个默认值,允许链接在没有协商选项的情况下正确运行,尽管可能不会达到最佳性能。除非明确指定,否则确认某个选项不需要对等方采取除默认操作之外的任何其他操作。没有必要发送Configure-Request中的选项的默认值。
Type | Length | Data |
---|---|---|
1byte | 1byte | 2byte |
Type:Type字段是一个八位元,指示配置选项的类型。
ID | Name |
---|---|
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字段是一个八位字节,它指示这个配置选项的长度,包括类型、长度和数据字段。如果在Configure-Request中接收到可协商的配置选项,但该配置选项的长度无效或无法识别,则应传输包含所需配置选项的Configure-Nak,该配置选项具有适当的长度和数据。
Data:数据字段是零个或多个八位元,包含特定于配置选项的信息。数据字段的格式和长度由类型和长度字段决定。当数据字段的长度超出信息字段的末端时,整个数据包将被静静地丢弃,而不影响自动机。
Maximum-Receive-Unit (MRU)
Description | 可以发送此配置选项来通知对等方实现可以接收较大的数据包,或者请求对等方发送较小的数据包。默认值是1500字节。如果请求更小的数据包,在链路同步丢失的情况下,实现必须仍然能够接收完整的1500位信息字段。此选项用于指示实现功能。对等方不需要最大限度地利用能力。例如,当一个MRU被指定为2048字节时,对等端不需要发送任何具有2048字节的数据包。对等端不需要通过Configure-Nak来表明它只会发送较小的数据包,因为实现总是需要至少1500字节的支持。 |
---|---|
Maximum-Receive-Unit | 最大接收单元字段是两个八进制数,它指定信息和填充字段中的最大八进制数。它不包括帧、协议字段、FCS,也不包括任何透明位或字节。 |
Authentication-Protocol
Description | 在某些链接上,在允许交换网络层协议包之前,可能需要对等点对自己进行身份验证。此配置选项提供一种方法来协商使用特定协议进行身份验证。默认情况下,不需要身份验证。一个实现不能在其配置请求包中包含多个身份验证协议配置选项。相反,它应该首先尝试配置最理想的协议。如果该协议是Configure-Nak’d,那么实现应该在下一个Configure-Request中尝试下一个最理想的协议。发送Configure-Request的实现指示它需要来自它的对等方的身份验证。如果实现发送了Configure-Ack,那么它就同意使用指定的协议进行身份验证。接收Configure-Ack的实现应该期望对等方使用已确认的协议进行身份验证。不要求身份验证是全双工的,也不要求在两个方向使用相同的协议。在每个方向上使用不同的协议是完全可以接受的。当然,这将取决于所谈判的具体议定书。 |
---|---|
Data | 零个或多个八位元,并包含由特定协议确定的其他数据。 |
Authentication-Protocol | 身份验证协议字段是两个八进制数,表示所需的身份验证协议。该字段的值总是与相同身份验证协议的PPP协议字段值相同。 |
Value (in hex) | Protocol |
---|---|
c023 | Password Authentication Protocol |
c223 | Challenge Handshake Authentication Protocol |
Quality-Protocol
Description | 在某些链接上,可能需要确定链接何时删除数据,以及删除数据的频率。这个过程称为链路质量监控。此配置选项提供了一种方法来协商使用特定协议进行链接质量监控。默认情况下,链接质量监视是禁用的。发送Configure-Request的实现表明它希望从它的对等方接收监控信息。如果实现发送了一个Configure-Ack,那么它就同意发送指定的协议。接收Configure-Ack的实现应该期望对方发送已确认的协议。没有要求质量监控是全双工的,也没有要求在两个方向使用相同的协议。在每个方向上使用不同的协议是完全可以接受的。当然,这将取决于所谈判的具体议定书。 |
---|---|
Data | 零个或多个八位元,并包含由特定协议确定的其他数据。 |
Quality-Protocol | 字段是两个八进制数,表示所需的链路质量监控协议。该字段的值始终与该监视协议的PPP协议字段值相同。 |
Value (in hex) | Protocol |
---|---|
c025 | Link Quality Report |
Magic-Number
Description | 这个配置选项提供了一种检测环回链路和其他数据链路层异常的方法。其他一些配置选项(如Quality-Protocol配置选项)可能需要此配置选项。默认情况下,不协商 Magic-Number,在可能使用 Magic-Number的地方插入零。在请求此配置选项之前,实现必须选择它的Magic-Number。建议尽可能以最随机的方式选择Magic-Number,以确保非常高的概率实现将到达一个唯一的数字。选择一个唯一的随机数的好方法是从一个唯一的种子开始。建议的惟一性来源包括机器序列号、其他网络硬件地址、时间时钟等。特别好的随机数种子是对物理事件到达时间的精确测量,如其他连接网络上的包接收、服务器响应时间或人类用户的打字速度。还建议同时使用尽可能多的资源。 |
---|---|
Magic-Number | 四个八位元,并指示一个数字,该数字很可能是链接一端的唯一数字。神奇的数字零是非法的,如果它不被彻底拒绝,就必须一直被禁止。 |
Protocol-Field-Compression (PFC)
Description | 此配置选项提供了一种协商压缩PPP协议字段的方法。默认情况下,所有的实现都必须使用两个八位元点对点协议字段来传输数据包。PPP协议字段号的选择使得一些值可以被压缩成一个单一的八字节格式,这与两个八字节格式有明显的区别。发送此配置选项是为了通知对等方实现可以接收这样的单个八字节协议字段。 |
---|
Address-and-Control-Field-Compression (ACFC)
Description | 此配置选项提供一种方法来协商数据链路层地址和控制字段的压缩。默认情况下,所有的实现都必须传输带有适合于链路帧的地址和控制字段的帧。 |
---|
温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!