TCP/IP 详解(第 2 版) 笔记 / 3 链路层 / 3.6 点对点协议(Point-to-Point Protocol (PPP)) / 3.6.1 链路控制协议(LCP)

目录、参考文献


3.6 点对点协议(Point-to-Point Protocol (PPP))

PPP 表示点对点协议(Point-to-Point Protocol)[RFC1661][RFC1662][RFC2153]
是一种通过串行链路传输 IP 数据报的流行方法 — 从低速拨号调制解调器到高速光纤链路 [RFC2615]
一些 DSL 服务商广泛部署了 PPP
这些服务商还用它来分配 Internet 系统参数(如初始 IP 地址和域名服务器,见第 6 章)

理解:
这里说的串行链路,指一个节点只有两个端口,一个输入,一个输出
因此不需要决策向哪个端口路由,一个端口进入的数据只需要向另一个端口发出即可
所谓点对点,指的是在串行链路中一个节点与另一个节点间只有一条线连着,所以协议本身不需要地址信息
点对点不需要地址信息,但点对点帧的有效载荷中可以携带高层协议的地址,如 IP 地址,但不是自己用的

在很大程度上,PPP 应该被视为多个协议的集合,而不是单个协议
PPP 为一种用于建立链路的被称为链路控制协议(Link Control Protocol (LCP))的基本方法提供支持
同时 PPP 还为一系列的 NCP 提供支持
这些 NCP 用于在 LCP 建立了基本链路之后为多种协议(包括 IPv4、IPv6 以及可能的非 IP 协议)建立网络层链路
一些相关的标准涵盖了对 PPP 进行压缩与加密的控制,并且在建立链路时可以采用多种认证方法

3.6.1 链路控制协议(Link Control Protocol (LCP))

PPP 的 LCP 部分用于建立和维护点对点链路上的低级两方(two-party)通信路径
因此,PPP 的操作只需要关注单个链路的两端,而不需要像以太网和 Wi-Fi 的 MAC 层协议那样处理对共享资源的访问调解问题

PPP,更具体地说是 LCP,通常会最大限度地降低对其下层的点对点链路的要求
链路必须支持双向操作(LCP 要用到确认( acknowledgments)),并且既要支持异步操作也要支持同步操作
通常,LCP 使用基于高级数据链路控制(High-Level Data Link Control (HDLC))协议的简单位级(bit-level)帧格式来建立链路
在设计 PPP [ISO3309] [ISO4335] 的时候,HDLC 就已经是一种成熟的帧格式了
IBM 将其修改为同步数据链路控制(Synchronous Data Link Control (SDLC))协议
SDLC 是一种在其专有的系统网络体系结构(System Network Architecture (SNA))协议族中用作链路层的协议
HDLC 还被用作 802.2 中逻辑链路控制(Logical Link Control (LLC))标准的基础,最终也被用于 PPP
图 3-22 展示了 LCP 的格式
TCP/IP 详解(第 2 版) 笔记 / 3 链路层 / 3.6 点对点协议(Point-to-Point Protocol (PPP)) / 3.6.1 链路控制协议(LCP)_第1张图片
图 3-22
PPP 借用了 HDLC 协议的基本帧格式
该帧格式提供了协议标识符、有效负载区域以及 2 或 4 字节的 FCS
其它字段可能存在也可能不存在,具体取决于压缩选项

如图 3-22 所示,在使用类似 HDLC 协议帧的常见情况下
PPP 帧格式被两个包含固定值 0x7E 的 1 字节标志(Flag)字段所包围
点对点链路两端的站点用这个字段来定位帧的开始与结束
如果帧内包含 0x7E,则定位会有问题
有两种方式可以解决这个问题,用哪种方法取决于 PPP 是在异步还是同步链路上运行
对于异步链路,PPP 使用字符填充(character stuffing)(也被称为字节填充(byte stuffing))
如果标志字符出现在帧中,则会被 2 字节序列 0x7D5E 替换(0x7D 是 PPP 的转义字符)
如果转义字符本身出现在帧中,则将其替换为 2 字节序列 0x7D5D
接收方在接收时将 0x7D5E 替换为 0x7E,将 0x7D5D 替换为 0x7D 即可
在同步链路(如 T1 线路、T3 线路)中,PPP 使用位填充(bit stuffing)
标志字符的位模式为 01111110(6 个连续的 1
位填充(bit stuffing)会在标志字符以外的任何 5 个连续 1 之后插入一个 0
这样做意味着字节可能会以超过 8 位的形式发送
但这通常没有问题,因为串行处理硬件的低层能对比特流进行取消填充的操作,将其恢复为填充前的模式

在第一个标志(Flag)字段后边,PPP 采用了 HDLC 协议的地址(Address (Addr))和控制(Control)字段
在 HDLC 中,地址(Address)字段本应该被设置为目的站点的地址
但由于 PPP 只连接了一个唯一的站点,因此这个字段总是被定义为 0xFF(表示所有站点)
HDLC 使用控制(Control)字段来指示帧排序和重传行为
由于 PPP 通常不负责实现这种链路层可靠性功能,因此在 PPP 中控制(Control)字段被设置为固定值 0x03
由于地址(Address)与控制(Control)字段在 PPP 中都是固定的常量
所以通常会使用地址和控制字段压缩(Address and Control Field Compression (ACFC))的选项来省略它们

注意:
多年以来,关于链路层网络应该提供多少可靠性(如果提供了的话)的争论相当激烈
以太网最多尝试 16 次重传
尽管 PPP 确实存在添加重传的规范 [RFC1663] ,但通常被配置为不进行重传
对是否添加重传的权衡比较微妙,取决于传输的流量类型
[RFC3366] 包含了对这些注意事项的详细讨论

PPP 帧的协议(Protocol)字段指示了携带的数据的类型,PPP 帧可以携带许多不同类型的协议
点对点协议字段分配(Point-to-Point Protocol Field Assignments)” 文档 [PPPn] 给出了协议(Protocol)字段有效值的官方列表与可分配的编号
在符合 HDLC 协议规范的情况下,任何协议编号的分配都使得最高有效字节的最低有效位等于 0,最低有效字节的最低有效位等于 1
0x0000 - 0x3FFF 范围的值用于标识网络层协议
0x8000 - 0xBFFF 范围的值用于标识属于相关的 NCP 的数据
0x4000 - 0x7FFF 范围的值用于没有相关的 NCP 的 “ 低容量(low volume)” 协议
0xC000 - 0XEFFF 范围的值用于标识像 LCP 这样的控制协议
在某些情况下,如果协议字段压缩(Protocol Field Compression (PFC))选项在链接建立的过程中协商成功,则协议(Protocol)字段可以被压缩为单个字节
这适用于协议编号在 0x0000 - 0x00FF 范围内的协议,其中包括大多数流行的网络层协议
但是请注意,LCP 的数据包总是使用 2 字节的未压缩格式

PPP 帧的最后部分包含一个 16 位的 FCS(一个 CRC16),使用生成多项式 10001000000100001
覆盖整个帧中除了 FCS 字段本身与标志(Flag)字节以外的部分
注意,要在执行任何字节或位填充(stuffing)之前用 FCS 的值覆盖帧
使用 LCP 选项(见:第 3.6.1.2 节),循环冗余校验(Cyclic Redundancy Check (CRC))可以从 16 位扩展到 32 位
这个例子使用的是与之前以太网使用的相同的 CRC32 多项式

3.6.1.1 LCP 操作

LCP 在基本的 PPP 数据包的基础上进行了简单的封装

如图 3-23 所示
TCP/IP 详解(第 2 版) 笔记 / 3 链路层 / 3.6 点对点协议(Point-to-Point Protocol (PPP)) / 3.6.1 链路控制协议(LCP)_第2张图片
图 3-23
LCP 数据包是一种相当通用的格式,能够识别封装数据的类型及其长度
LCP 帧主要用于建立 PPP 链路,但这种基本格式也是许多网络控制协议的基础

LCP 的 PPP 协议(Protocol)字段值始终为 0xC021,不会用 PFC 将其消除,以尽量减少歧义
标识符(Ident)字段是由 LCP 请求帧的发送方提供的序列号,其值随着每个后续消息递增
在构建回复(ACK、NACK 或 REJECT 响应)时,将请求中的标识符(Ident)字段值复制到响应数据的标识符(Ident)字段
通过这种方式,请求方可以通过匹配标识符来识别当前响应是对哪个请求数据包的回复
编码(Code)字段表示操作类型,既包括请求操作也包括响应操作:配置-请求(configure-request)(0x01), 配置-确认(configure-ACK)(0x02), 配置-否定确认(configure-NACK)(0x03), 配置-拒绝(configure-REJECT)(0x04), 终止-请求(terminate-request)(0x05), 终止-确认(terminate-ACK)(0x06), 编码-拒绝(code-REJECT)(0x07), 协议-拒绝(protocol-REJECT)(0x08), 回音-请求(echo-request)(0x09), 回音-应答(echo-reply)(0x0A), 丢弃-请求(discard-request)(0x0B), 识别(identification)(0x0C), 剩余时间(time remaining)(0x0D).
通常,确认(ACK)消息表示接受一组选项,否定确认(NACK)消息表示部分拒绝,并给出建议的备选方案
拒绝(REJECT)消息完全拒绝一个或多个选项
被拒绝的代码表示之前的数据包中包含着一个未知的字段值
长度(Length)字段表示 LCP 包的长度,单位为字节,长度不允许超过链路的最大接收单元(Maximum Received Unit (MRU))
MRU 是稍后将讨论的最大建议帧限制(Maximum Advised Frame Limit)的一种形式
长度(Length)字段是 LCP 的一部分,PPP 协议一般不提供这个字段

LCP 的主要工作是将点对点链路建立到一个最低水平
配置(Configure)消息使链路的每一端启动基本的配置过程,并建立商定的选项
终止(Termination)消息用于在完成时清除链路
LCP 还提供了一些前面提到的附加功能
回音-请求/应答(Echo-Request/Reply)消息可以在任何 LCP 处于活动状态的时候进行交换,用于验证对方的操作
丢弃-请求(Discard-Request)消息可用于性能测量,它指示对方丢弃数据包,不响应该消息
识别(Identification)与剩余时间(Time-Remaining)消息用于管理目的:了解对方系统的类型,并指示允许链路保持建立状态的时间(例如,出于管理或安全的原因)

从历史上看,如果远程站处于环回模式(loopback mode)或被称为 “ 环路 ”,则点对点链路会出现一个常见问题
电话公司的广域数据电路有时会被置于环回模式以进行测试 — 一端发送的数据单纯地从另一端返回
这虽然可能对线路测试有用,但对数据通信一点帮助都没有
因此 LCP 提供了一个方法,可以发送一个幻数(magic number)(由发送者选择的任意数字)以查看对方是否立即以相同消息类型返回
如果是,则这条线路被检测为环路,可能需要维护

为了更好地了解 PPP 链路是如何建立的以及选项是如何协商的
图 3-24 展示了一个简化的数据包交换时间线以及一个简化的状态机(在链路的两端实现)
TCP/IP 详解(第 2 版) 笔记 / 3 链路层 / 3.6 点对点协议(Point-to-Point Protocol (PPP)) / 3.6.1 链路控制协议(LCP)_第3张图片
图 3-24
LCP 被对等节点用来建立 PPP 链路以及商定选项
典型的交换有:
含有一个选项列表的配置请求与确认(ACK) 对、鉴权交换、数据交换(图中没有画出)、终止交换
因为 PPP 是一个由许多部分组成的通用协议,所以在链路的建立和终止之间可能还会发生许多其它类型的操作

当下一层的协议层指示关联已激活的时候(如对于调制解调器来说,就是检测到了载波),链路就被认为建立了
链路质量测试也可以在此期间完成,包括交换链路质量报告与确认(见第 3.6.1.2 节)
如果链路需要认证,如向 ISP 拨号时,可能需要进行一些额外的交换来确定连接到链路的一方或双方的真实性
当下层协议或硬件指示关联停止时(如载波丢失)或当发送链路终止请求并从对方接收到终止确认(ACK)时,链路会被终止

3.6.1.2 LCP 选项

当 LCP 建立供一个或多个 NCP 使用的链路时,可以对多个选项(options)进行协商,我们将讨论两个常见的选项
异步控制字符映射(Asynchronous Control Character Map (ACCM))或简称 “ asyncmap ” 选项
定义了 PPP 操作需要转义哪些控制字符(即 0x000x1F 范围内的 ASCII 字符)
将一个字符替换为转义字符意味着不发送该字符的真实值,而是将 PPP 转义标识符(0x7D)填充在由原始控制字符与值 0x20 异或得到的值的前面
XOFF 字符(0x13)会被替换为 0x7D33 发送
当控制字符可能会影响到下层硬件操作的时候会使用 ACCM
例如,如果启用了使用 XON/XOFF 字符的软件流控制,而 XOFF 字符未被替换为转义字符
则当其通过链路时,数据传输会停止,直到硬件观察到 XON 字符
asyncmap 选项通常为 32 位十六进制数
其中第 n 个最低有效位位置的 1 表示应该转义值为 n 的控制字符
如 asyncmap 选项 0xffffffff 将转义所有控制字符,0x00000000 一个控制字符也不会转义,而 0x000A0000 将转义 XON(值 0x11)和 XOFF(值 0x13
尽管 asyncmap 选项的默认值为 0xffffffff,但许多链路都可以在将 asyncmap 设置为 0x00000000 的情况下安全运行

注意:
转义某个控制字符,表示将这个控制字符替换为对应的转义字符

PPP 没有长度(Length)字段,并且串行线路通常不提供帧,因此理论上没有对 PPP 帧的长度设置直接的硬性限制
在实践中,通常会通过指定 MRU 给出最大帧大小
当主机指定了 MRU 选项(类型 0x01)时,端点被要求永远不发送比 MRU 选项值更长的帧
MRU 的值是数据字段的长度,单位为字节,不算其它各种 PPP 开销字段(即,协议(Protocol)、FCS、标志(Flag)字段)
典型的值为 1500 或 1492,最大可到 65535,IPv6 操作至少需要 1280
协议标准要求 PPP 的实现接受最大 1500 字节的帧
MRU 更多是作为对端点选择数据包大小的建议,而不是硬性限制
当较小的数据包与较大的数据包在同一条 PPP 链路上交错传输时
较大的数据包会占用低带宽链路的大部分带宽,从而损害较小的数据包
这会导致抖动(延迟差异),从而对交互式应用产生负面影响,如远程登录和 VoIP 等
配置较小的 MRU(或 MTU)可以以更高的开销为代价缓解此问题

PPP 支持一种用于交换链路质量报告信息的机制
在选项协商的过程中,可以包括一个含有特定质量协议请求的配置消息
该选项保留了 16 位来指定特定的质量协议
最常见的协议是一个涉及链路质量报告(Link Quality Reports (LQRs))[RFC1989] 的 PPP 标准
该协议对应的 PPP 协议(Protocol)字段值为 0xC025
如果启用了此功能,则端点会被要求以某个周期率提供 LQR
请求的 LQR 之间的最大时间间隔被编码为配置选项中的一个 32 位的数字,以 1/100 秒为单位
端点生成 LQR 的频率可能会高于请求的频率
LQR 包括以下信息:幻数、发送和接收的数据包与字节的数量、传入的错误数据包数量、丢弃的数据包数量、交换的LQR 总数
一个典型的实现允许用户配置从端点请求 LQR 的频率
有些实现还提供了在质量历史没有达到某些配置的阈值时终止链路的方法
在 PPP 链路进入建立状态后,可能会请求 LQR
每个 LQR 都有一个序列号,即便被重新排序了,仍然可以确定其随时间变化的趋势

许多 PPP 实现支持回调(callback)功能
在典型的回调设置中,PPP 拨号回调客户端调用 PPP 回调服务器,提供身份验证信息,服务器断开连接并回调客户端
这在通话费用不对称或为了某种程度的安全性时可能有用
用于协商回调的协议是值为 0x0D 的 LCP 选项 [RFC1570]
如果达成一致,则通过回调控制协议(Callback Control Protocol (CBCP))来完成协商

一些与 PPP 一起使用的压缩与加密算法在运行时需要一定的最小字节数,称为块大小(block size)
当数据不够长时,可以添加填充(padding)来使长度变为块大小的偶数倍
填充如果存在,则位于数据区域之外,PPP 的 FCS 字段之前
一种被称为自描述填充(self-describing padding)[RFC1570] 的填充方法,其填充的值是非零的
填充中的每一个字节的值都等于其在填充区域中的偏移量
因此,填充中的第一个字节的值为 0x01,最后一个字节的值为添加的填充的字节数
最多支持 255 个字节的填充
自描述填充选项(类型 10)向端点指出需要具备理解这种形式的填充的能力
并包括最大填充值(maximum pad value (MPV)),表示当前允许的最大填充值
虽然基本的 PPP 帧没有一个显式的长度(Length)字段
但接收方可以通过自描述填充来确定应该从接收到的数据区域中修剪掉多少填充字节

为了减少在每个帧上发送帧头的固定成本,引入了一种可以将可能具有不同协议的多个不同的有效载荷复用到同一个 PPP 帧中的方法,这种方法被称为 PPPMux [RFC3153]
主 PPP 帧头的协议(Protocol)字段被设置为多路复用帧(multiplexed frame)(0x0059),然后将每个有效载荷块插入到帧中
这是通过在每个有效载荷块前引入一个 1 到 4 字节的子帧帧头来实现的
子帧帧头中包括 1 位用于指示子帧帧头中是否包含协议(Protocol)字段的字段(被称为 PFF)
和另 1 位用于指示后面的长度(Length)字段是 1 个字节还是 2 个字节的字段(被称为 LXT)
除此之外,如果存在的话,是一个 1 或 2 字节的协议 ID(Protocol ID),使用与外部 PPP 帧头相同的值和相同的压缩方法
当子帧与默认 PID 匹配时,PFF 字段的值为 0(此时没有 PID 字段)
默认 PID 是在使用 PPPMux 控制协议(PPPMux Control Protocol (PPPMuxCP))设置配置状态时确定的

如图 3-19 所示,在 PPP 帧格式中,普通的 PPP/HDLC FCS 既可以是 16 位的也可以是 32 位的
默认值为 16 位,可以通过 32 位的 FCS 选项启用 32 位的 FCS
其它 LCP 选项包括 PFC 和 ACFC 的使用,以及身份验证算法的选择

国际化(Internationalization)[RFC2484] 提供了一种方式来表示要使用的语言和字符集
字符集的可选值为 “charset registry” [IANA-CHARSET] 中的标准值
语言的可选值为 [RFC5646][RFC4647] 列表中列出的值


目录、参考文献

你可能感兴趣的:(TCP/IP,详解(第,2,版)笔记,协议栈,tcp/ip)