8.6. 链路控制选项

我们已经遇到了链路控制协议 (LCP),它用于协商链路特性和测试链路。

LCP 协商的两个最重要的选项是异步控制字符映射最大接收单元。还有许多其他 LCP 配置选项,但它们过于专业,不在此处讨论。

异步控制字符映射,俗称 async map,用于异步链路(如电话线),以识别必须转义(替换为特定的双字符序列)的控制字符,以避免它们被用于建立链路的设备解释。例如,您可能希望避免用于软件握手的 XON 和 XOFF 字符,因为配置错误的调制解调器可能会在收到 XOFF 时阻塞。其他候选项包括 Ctrl-l(telnet 转义字符)。PPP 允许您通过在 async map 中指定 ASCII 代码 0 到 31 的任何字符来进行转义。

async map 是一个 32 位宽的位图,以十六进制表示。最低有效位对应于 ASCII NULL 字符,最高有效位对应于 ASCII 31 十进制。这 32 个 ASCII 字符是控制字符。如果在位图中设置了一个位,则表示在跨链路传输之前必须转义相应的字符。

要告诉您的对等方不必转义所有控制字符,而只需转义其中的一部分,您可以向 pppd 指定一个 async map,使用asyncmap选项。例如,如果只有^S^Q(ASCII 17 和 19,通常用于 XON 和 XOFF)必须转义,请使用以下选项
asyncmap 0x000A0000

只要您可以将二进制转换为十六进制,转换就很简单。在您面前铺开 32 位。最右边的位对应于 ASCII 00 (NULL),最左边的位对应于 ASCII 32 十进制。将您要转义的字符对应的位设置为 1,所有其他位设置为零。要将其转换为 pppd 期望的十六进制数,只需取每组 4 位并将其转换为十六进制。您应该得到八个十六进制数字。将它们全部串在一起,并在前面加上 “0x” 以表示它是一个十六进制数,就完成了。

最初,async map 设置为0xffffffff—也就是说,所有控制字符都将被转义。这是一个安全的默认值,但通常远超过您的需要。async map 中出现的每个字符都会导致两个字符跨链路传输,因此转义的代价是链路利用率的提高和相应的性能降低。

在大多数情况下,async map 为0x0工作正常。不执行转义。

最大接收单元 (MRU) 向对等方发出信号,表明我们希望接收的 HDLC 帧的最大大小。虽然这可能会让您想起最大传输单元 (MTU) 值,但这二者几乎没有共同之处。MTU 是内核网络设备的参数,描述了接口能够传输的最大帧大小。MRU 更像是给远程端的建议,不要生成大于 MRU 的帧;但是,接口必须能够接收最大 1,500 字节的帧。

因此,选择 MRU 不在于是链路能够传输什么,而在于什么能给您最佳吞吐量。如果您打算通过链路运行交互式应用程序,则将 MRU 设置为低至 296 的值是一个好主意,这样偶尔较大的数据包(例如,来自 FTP 会话的数据包)不会使您的光标“跳动”。要告诉 pppd 请求 MRU 为 296,您可以为其提供选项mru 296。但是,只有当您使用 VJ 标头压缩(默认情况下启用)时,较小的 MRU 才有意义,因为否则您将浪费大量带宽,仅仅为了携带每个数据报的 IP 标头。

pppd 还理解一些 LCP 选项,这些选项配置协商过程的整体行为,例如在链路终止之前可以交换的最大配置请求数。除非您确切知道自己在做什么,否则您应该不要理会这些选项。

最后,还有两个选项适用于 LCP 回显消息。PPP 定义了两个消息,Echo RequestEcho Responsepppd 使用此功能来检查链路是否仍在运行。您可以使用以下命令启用此功能lcp-echo-interval选项以及以秒为单位的时间。如果在此间隔内未从远程主机收到任何帧,则 pppd 会生成一个 Echo Request 并期望对等方返回一个 Echo Response。如果对等方未生成响应,则在发送一定数量的请求后,链路将被终止。可以使用以下命令设置此数字lcp-echo-failure选项。默认情况下,此功能完全禁用。