引言当一条“电话线”不够用时我们怎么办在上一章的旅程中我们亲眼见证了一条 PPP 链路是如何通过 LCP 和 NCP 建立起来的。但现实中对于网络带宽的需求往往是无止境的。在百兆光纤普及之前人们在上世纪 90 年代利用的是ISDN综合业务数字网。一条 ISDN 线路只有 64kbps想要跑流畅的视频或者下载稍大一点的文件简直是痴人说梦。那当时的工程师是怎么解决的他们想出了一个极其朴素但又非常实用的办法一条不够我用两条、三条甚至四条捆绑起来而今天这两页书讲的正是 PPP 协议中解决这个核心问题的MP多链路 PPP技术以及如何动态管理这些链路BACP/BAP、如何在低速链路上压缩数据CCP以及早期 PPP 踩过的“认证巨坑”PAP。这是 PPP 协议家族中极具实战价值的一段精彩历史。第一部分把“电话线”搓成“麻花绳”——多链路 PPPMP的底层封装1.1 为什么要“搓麻花”现实困境如果你需要 256kbps 的带宽你是装一条 256k 的专线昂贵还是开通 4 条 64k 的 ISDN 线路捆绑使用便宜在当年的拨号时代答案是显而易见的。但是网络层比如 IP 数据包并不知道底层的物理线缆有 4 条。它只能看到上层有一条网络通道。1.2 巧妙的分片与重组深入 MP 帧头部为了让网络层以为只有一条链路MP多链路 PPP在底层承担了“分发与拼装”的重任。书本上的图 3-25正是 MP 分片的数据帧结构。当一个巨大的 IP 数据包到达发送方时MP 会将它切割成无数个小的“分片Fragment”。B 位开始分片标记这是大包的“第一个小碎块”。E 位结束分片标记这是大包的“最后一个小碎块”。序列号Sequence Number这是最关键的魔法因为 4 条物理线路的延迟可能不一样先发出去的包可能后到。因此每一个分片都被打上了一个唯一的序列号。无论线路如何乱序接收方收到后都会严格根据序列号把一个个小碎块重新拼成完整的巨大数据包然后才交给上层网络层处理。这保证了数据的绝对完整与顺序。第二部分多链路协议的“圆桌会议”——MRRU 与端点鉴别器2.1 MRRU突破“小包裹”的物理限制我们在上一章讲过PPP 默认会协商一个MRU最大接收单元通常是 1500 字节。然而当 MP 把多条链路捆绑在一起时它往往希望发一个远超 1500 字节的超大包裹。为了应对这种需求MP 引入了一个特殊的 LCP 选项MRRU多链路最大接收重组单元类型 18。作用它协商的是重组后的最大上限。这意味着MP 可以在发送端把 3000 字节的包切碎通过 4 条线路传过去在接收端重新拼起来。只要接收端的重组能力MRRU允许这个巨大的包裹就能安全通过。2.2 端点鉴别器认准“我是跟谁在连”在一个大型网络中可能会有很多条 PPP 链路同时存在。为了确保这 4 条绑定的 ISDN 线路是准确连接到“同一台”对端路由器上MP 引入了端点鉴别器LCP 选项 19。身份证机制这是一个协商选项双方会交换一种“鉴别信息”比如通话的电话号码、IP 地址、或者 MAC 地址。只有拥有相同鉴别信息的若干条链路才能被归入同一个 MP 捆绑组。这就好比大家必须出示“同一个工牌”才能加入同一个“打包联盟”。第三部分按需分配精打细算——BACP 与 BAP 的动态魔法在当年的拨号网络时代通电话是按分钟计费的非常昂贵如果你 4 条 ISDN 线路一直开着月底的账单可能会吓死人。BACP带宽分配控制协议和BAP带宽分配协议就是为了解决这个“烧钱”痛点而生的。核心逻辑“按需分配”。如果你平时只是发个微信那就只开 1 条线如果你突然要下载大文件BACP 就会在后台协商添加第 2、3、4 条线文件下载完了数据量小了它又会协商把多余的线直接挂断。操作细节BAP 分组类型BAP 内部包含了“请求”、“响应”、“指示”、“确认”等不同的控制报文。比如“我想加一条线请求”、“好的给你加一条响应”。BACP 的管控BACP 用于在多链路捆绑中指定到底由哪一方有权限来控制“增删线路”。这需要双方在后台进行一场“谁当老大”的协商指定首选对端。这个设计非常经典直到今天很多 ADSL 拨号宽带依然会利用这种“按需连接”的思路来节约系统资源降低运营商的成本。第四部分让“瘦子”变得更“苗条”——压缩控制协议CCP即便有了 MP 多链路捆绑当时的拨号网络带宽依然极其昂贵且缓慢。为了压榨每一滴带宽PPP 协议栈里加入了一个重要成员CCP压缩控制协议。压缩的作用类似 ZIP 压缩在发送前把数据包里的重复信息删减掉到了接收端再解压还原。在慢速串行链路上这能极大地提升有效传输速度。CCP 的地位它虽然和 NCP 很像也负责协商参数但它并没有在 NCP 建立连接之后才谈而是在LCP 链路建立完毕之后就开始协商压缩。故障排查机制压缩算法有时候会搞砸解压失败导致数据乱码。为了应对这种情况CCP 规定了“复位请求0x0E”和“复位确认0x0F”的状态码。如果接收方发现解压错误就会发送复位请求双方需要把内部的压缩状态“归零”回到初始状态重新开始以此来保障数据的正确性。常见的压缩算法书中提到业界有很多种压缩算法如 RFC1977 定义的BSD 压缩以及微软自家推出的MPPC微软点对点压缩。第五部分PPP 致命的“裸奔”缺陷——密码认证协议PAP在上一章我们讲到过PPP 可以通过认证来保证连接安全。最后这几段文字极其尖锐地指出了早期最简单的一种认证机制PAP密码认证协议的致命漏洞。PAP 的运作逻辑极度简单粗暴客户端发送一个请求给服务器“我要连线这是我的用户名比如 admin和我密码比如 123456。”服务器一看“没错密码是对的允许连接。”于是网络通了。它的安全致命伤PAP 是明文传输的网络里的任何一个人或者黑客只要在这个网络上安装了抓包软件比如我们之前玩过的 Wireshark就能像看没有密码的短信一样直接读出你的明文账号和密码这不仅是防君子不防小人简直是把人家的保险柜钥匙直接挂在门口。现实中的结论正因为 PAP 存在这种“裸奔”级别的漏洞现在任何正规的 PPPoE 拨号网络和现代设备都绝对禁止使用 PAP。取而代之的是更安全的CHAP质询握手认证协议或者结合复杂的 EAP扩展认证协议来保障安全。书本在这里特意挑出 PAP 来说正是为了敲响早期网络安全的警钟。结语从“多条线路的协同”到“安全底线的警钟”今天这两页书我们看到了 PPP 协议在面临现实物理限制和安全威胁时做出的极其丰富的工程进化MP 多链路技术解决了物理带宽不足的痛点通过分片和序列号把多条低速线缆搓成了一条坚固的“麻花绳”。BACP/BAP 按需分配机制彻底解决了“带宽用得多浪费钱”的现实问题。CCP 压缩技术让软件层面的算法去弥补硬件的速率局限。PAP 明文认证的暴露则给所有网络工程师敲响了一记极其响亮的警钟在互联网上任何不使用加密的认证都是敞开的门户。当你看到家里的宽带光猫拨号上网时你可以深刻地意识到这背后不仅仅是简单的“点对点传输”它还包含了多链路性能优化的因子以及足以阻断明文密码传输的现代安全认证机制。这就是 PPP 协议的博大精深从历史延续至今依然默默地支撑着我们每天的网络连接。
亲密的网络旅程(十八):PPP 的多链路“合体术”、动态带宽调节与安全隐患
引言当一条“电话线”不够用时我们怎么办在上一章的旅程中我们亲眼见证了一条 PPP 链路是如何通过 LCP 和 NCP 建立起来的。但现实中对于网络带宽的需求往往是无止境的。在百兆光纤普及之前人们在上世纪 90 年代利用的是ISDN综合业务数字网。一条 ISDN 线路只有 64kbps想要跑流畅的视频或者下载稍大一点的文件简直是痴人说梦。那当时的工程师是怎么解决的他们想出了一个极其朴素但又非常实用的办法一条不够我用两条、三条甚至四条捆绑起来而今天这两页书讲的正是 PPP 协议中解决这个核心问题的MP多链路 PPP技术以及如何动态管理这些链路BACP/BAP、如何在低速链路上压缩数据CCP以及早期 PPP 踩过的“认证巨坑”PAP。这是 PPP 协议家族中极具实战价值的一段精彩历史。第一部分把“电话线”搓成“麻花绳”——多链路 PPPMP的底层封装1.1 为什么要“搓麻花”现实困境如果你需要 256kbps 的带宽你是装一条 256k 的专线昂贵还是开通 4 条 64k 的 ISDN 线路捆绑使用便宜在当年的拨号时代答案是显而易见的。但是网络层比如 IP 数据包并不知道底层的物理线缆有 4 条。它只能看到上层有一条网络通道。1.2 巧妙的分片与重组深入 MP 帧头部为了让网络层以为只有一条链路MP多链路 PPP在底层承担了“分发与拼装”的重任。书本上的图 3-25正是 MP 分片的数据帧结构。当一个巨大的 IP 数据包到达发送方时MP 会将它切割成无数个小的“分片Fragment”。B 位开始分片标记这是大包的“第一个小碎块”。E 位结束分片标记这是大包的“最后一个小碎块”。序列号Sequence Number这是最关键的魔法因为 4 条物理线路的延迟可能不一样先发出去的包可能后到。因此每一个分片都被打上了一个唯一的序列号。无论线路如何乱序接收方收到后都会严格根据序列号把一个个小碎块重新拼成完整的巨大数据包然后才交给上层网络层处理。这保证了数据的绝对完整与顺序。第二部分多链路协议的“圆桌会议”——MRRU 与端点鉴别器2.1 MRRU突破“小包裹”的物理限制我们在上一章讲过PPP 默认会协商一个MRU最大接收单元通常是 1500 字节。然而当 MP 把多条链路捆绑在一起时它往往希望发一个远超 1500 字节的超大包裹。为了应对这种需求MP 引入了一个特殊的 LCP 选项MRRU多链路最大接收重组单元类型 18。作用它协商的是重组后的最大上限。这意味着MP 可以在发送端把 3000 字节的包切碎通过 4 条线路传过去在接收端重新拼起来。只要接收端的重组能力MRRU允许这个巨大的包裹就能安全通过。2.2 端点鉴别器认准“我是跟谁在连”在一个大型网络中可能会有很多条 PPP 链路同时存在。为了确保这 4 条绑定的 ISDN 线路是准确连接到“同一台”对端路由器上MP 引入了端点鉴别器LCP 选项 19。身份证机制这是一个协商选项双方会交换一种“鉴别信息”比如通话的电话号码、IP 地址、或者 MAC 地址。只有拥有相同鉴别信息的若干条链路才能被归入同一个 MP 捆绑组。这就好比大家必须出示“同一个工牌”才能加入同一个“打包联盟”。第三部分按需分配精打细算——BACP 与 BAP 的动态魔法在当年的拨号网络时代通电话是按分钟计费的非常昂贵如果你 4 条 ISDN 线路一直开着月底的账单可能会吓死人。BACP带宽分配控制协议和BAP带宽分配协议就是为了解决这个“烧钱”痛点而生的。核心逻辑“按需分配”。如果你平时只是发个微信那就只开 1 条线如果你突然要下载大文件BACP 就会在后台协商添加第 2、3、4 条线文件下载完了数据量小了它又会协商把多余的线直接挂断。操作细节BAP 分组类型BAP 内部包含了“请求”、“响应”、“指示”、“确认”等不同的控制报文。比如“我想加一条线请求”、“好的给你加一条响应”。BACP 的管控BACP 用于在多链路捆绑中指定到底由哪一方有权限来控制“增删线路”。这需要双方在后台进行一场“谁当老大”的协商指定首选对端。这个设计非常经典直到今天很多 ADSL 拨号宽带依然会利用这种“按需连接”的思路来节约系统资源降低运营商的成本。第四部分让“瘦子”变得更“苗条”——压缩控制协议CCP即便有了 MP 多链路捆绑当时的拨号网络带宽依然极其昂贵且缓慢。为了压榨每一滴带宽PPP 协议栈里加入了一个重要成员CCP压缩控制协议。压缩的作用类似 ZIP 压缩在发送前把数据包里的重复信息删减掉到了接收端再解压还原。在慢速串行链路上这能极大地提升有效传输速度。CCP 的地位它虽然和 NCP 很像也负责协商参数但它并没有在 NCP 建立连接之后才谈而是在LCP 链路建立完毕之后就开始协商压缩。故障排查机制压缩算法有时候会搞砸解压失败导致数据乱码。为了应对这种情况CCP 规定了“复位请求0x0E”和“复位确认0x0F”的状态码。如果接收方发现解压错误就会发送复位请求双方需要把内部的压缩状态“归零”回到初始状态重新开始以此来保障数据的正确性。常见的压缩算法书中提到业界有很多种压缩算法如 RFC1977 定义的BSD 压缩以及微软自家推出的MPPC微软点对点压缩。第五部分PPP 致命的“裸奔”缺陷——密码认证协议PAP在上一章我们讲到过PPP 可以通过认证来保证连接安全。最后这几段文字极其尖锐地指出了早期最简单的一种认证机制PAP密码认证协议的致命漏洞。PAP 的运作逻辑极度简单粗暴客户端发送一个请求给服务器“我要连线这是我的用户名比如 admin和我密码比如 123456。”服务器一看“没错密码是对的允许连接。”于是网络通了。它的安全致命伤PAP 是明文传输的网络里的任何一个人或者黑客只要在这个网络上安装了抓包软件比如我们之前玩过的 Wireshark就能像看没有密码的短信一样直接读出你的明文账号和密码这不仅是防君子不防小人简直是把人家的保险柜钥匙直接挂在门口。现实中的结论正因为 PAP 存在这种“裸奔”级别的漏洞现在任何正规的 PPPoE 拨号网络和现代设备都绝对禁止使用 PAP。取而代之的是更安全的CHAP质询握手认证协议或者结合复杂的 EAP扩展认证协议来保障安全。书本在这里特意挑出 PAP 来说正是为了敲响早期网络安全的警钟。结语从“多条线路的协同”到“安全底线的警钟”今天这两页书我们看到了 PPP 协议在面临现实物理限制和安全威胁时做出的极其丰富的工程进化MP 多链路技术解决了物理带宽不足的痛点通过分片和序列号把多条低速线缆搓成了一条坚固的“麻花绳”。BACP/BAP 按需分配机制彻底解决了“带宽用得多浪费钱”的现实问题。CCP 压缩技术让软件层面的算法去弥补硬件的速率局限。PAP 明文认证的暴露则给所有网络工程师敲响了一记极其响亮的警钟在互联网上任何不使用加密的认证都是敞开的门户。当你看到家里的宽带光猫拨号上网时你可以深刻地意识到这背后不仅仅是简单的“点对点传输”它还包含了多链路性能优化的因子以及足以阻断明文密码传输的现代安全认证机制。这就是 PPP 协议的博大精深从历史延续至今依然默默地支撑着我们每天的网络连接。