跳转至

多播、IPv6、VPN 与 NAT — IP 的四个扩展

这一章是网络层章节的「补丁集」: 四个各自独立的小机制,补的都是 IPv4 原始设计 没料到的需求——一份数据要给一群人(多播)、32 位地址不够用(IPv6)、 公网上要跑私有的数据(VPN)、私有地址要上公网(NAT)。 它们每一个都是你今天上网体验的一部分:视频会议走多播思想,手机热点是 NAT, 公司内网接进来用 VPN,而 IPv6 正在你的手机流量里悄悄替代 IPv4。

1. IP 多播:一份数据,一群收件人

三种投递方式(IPv4 定义)1:

方式 送到哪 类比
单播 单个目的地 一对一打电话
广播 同一广播域的所有设备 全村大喇叭
多播(组播) 一组订阅了的主机 只对报名的人广播

多播省在哪:服务器要发视频给 1000 个观众,单播要复制 1000 份、占 1000 份带宽; 多播全网只传一份,在分叉的路由器处才复制2。直播、网络会议、行情推送都是它的场景。

D 类地址与多播组:多播地址 = 224.0.0.0 ~ 239.255.255.255,一个 D 类地址标志一个 多播组——使用同一个地址接收的所有主机构成这个组。组是动态的:主机随时加入或退出, 一台主机可属于多个组,非组员也能往组里发3。几个保留地址值得记住: 224.0.0.1 = 子网内所有多播主机,224.0.0.2 = 所有多播路由器, 224.0.0.5/6 = OSPF 路由器/指定路由器(第 07 章的 Hello 和 LSA 就用它们), 224.0.0.12 = DHCP 服务器4。

局域网内的最后一步:以太网给多播预留了 MAC 地址段 01-00-5E-00-00-00 ~ 01-00-5E-7F-FF-FF, D 类地址的低 23 位直接映射进去。麻烦在于 D 类有 28 位可用而 MAC 只有 23 位—— 映射不是一一对应:224.128.64.32 和 224.0.64.32 映成同一个 MAC。 所以网卡收到后还要在 IP 层再滤一遍5。又是一次「介质层粗筛 + 网络层精筛」的接力。

IGMP(互联网组管理协议):多播路由器怎么知道「我这个网段里还有没有某个组的成员」? 靠 IGMP——只运行在主机与它直连的多播路由器之间,管组员的加入与退出, 不管路由器之间的事(那是多播路由协议的活)6。两个版本:

  • IGMPv1:主机想收某组流量,主动发「成员报告」;路由器周期发「成员询问」到 224.0.0.1, 没人应答就停止转发该组;
  • IGMPv2:加了主动退出报文(不必等询问超时),询问可针对指定组发7。

主线例子走一遍多播: 机房服务器向 239.1.2.3(一个机构范围的组)推一路视频。 服务器不知道也不关心组里有谁;第一跳路由器收到后查多播转发表,往所有「有组员」的下游 端口各复制一份;末端局域网里,多播帧以 01-00-5E-… 的 MAC 送达,只有运行了 IGMP 加入过该组的主机的网卡才收下来(其余主机网卡或 IP 层丢弃)。

多播路由的难点与单播相反:单播找一条路,多播要找一棵树——从源到所有组员的 分配树,让复制只发生在分叉处,全网流量最省8。算法名目繁多(泛洪、SPT、Steiner 树、 CBT 核心树……),实际出名的是 DVMRP、MOSPF、PIM、CBT 几个;Mbone(多播骨干网)则是 在路由器还不支持多播的年代,用隧道把多播分组套在单播 IP 里穿越不支持的地段9—— 隧道这个工具,马上在 IPv6 和 VPN 两节再各见一次。

2. IPv6:不只是地址变长

IPv6 的动机书里列了两条:IPv4 的 32 位地址即将耗尽;IPv4 在端到端连接、QoS、 安全性、多播、移动性、即插即用上的不足10。五大变化:

  1. 地址 128 位(IPv4 的 4 倍不是 4 倍数量,是 10³⁸ 个——给地球上每粒沙子分一个都够);
  2. 为高速化动手术:头部定长(不验头部校验和)、传输错误检查下放链路层、 路由器不再分片(改由源主机用「路径 MTU 发现」探测);
  3. 任意通信(anycast):一组地址共享一个地址,分组只送给其中最近的一个—— 「连最近的服务器,不必知道是哪台」11;
  4. 内建安全扩展(IPSec 级别的认证与加密头);
  5. 流标记(flow label):一组五元组一致的包打上同样的流标记,沿途路由器可以给它 特别的 QoS 待遇——给实时流(音视频)开的快车道12。

基本头 40B,八个字段13:版本(=6)、优先级(4 位:0~7 给可拥塞控制的业务, 8~15 给实时业务——丢包不重传的那种)、流标号(24 位)、净负荷长度(16 位—— 注意不含头自身,与 IPv4 的「总长度」口径不同)、下一个头部(相当于 IPv4 的协议字段, 还兼指扩展头的链)、跳数限制(=TTL)、源地址、目的地址(各 128 位)。

地址写法与压缩规则:8 组十六进制,组间冒号。连续的全 0 组可以用 :: 压缩一次 (只能用一次,否则还原不唯一),每组前导 0 可省14:

  FE80:0000:0000:0000:AAAA:0000:00C2:0002
  = FE80::AAAA:0000:00C2:0002      (:: 代表中间连续的全 0 段)
  2001:0DB8:0000:0000:0000:0000:1428:0000 = 2001:DB8::1428:0

IPv4 向 IPv6 的过渡(全世界不可能一夜升级,IETF 的三个方案)15:

  • 双协议栈:主机/路由器同时装 IPv4 与 IPv6 两套协议栈,按对端能力选择; 最简单,但两种栈都要维护;
  • 隧道:把 IPv6 分组整体装进 IPv4 分组的数据区,穿过只懂 IPv4 的地段, 出口处取出来继续走——对两端透明,但不能让纯 IPv4 主机和纯 IPv6 主机直接对话;
  • NAT-PT / SIIT 等技术:在边界上做协议翻译,让两个世界的主机互相通信。

3. VPN:在公网上挖一条「专线」

VPN(虚拟专用网):基于公用网络(通常就是 Internet)建起来的企业网络, 拥有与专用网相同的安全、管理与功能,却省下长途专线的建设和租用费16。 它的具体实现就是隧道技术:把企业内网的数据包整个封装(加密)进隧道协议里, 穿过公网,到对端出口解封装。

隧道协议分两代:

层 协议 说明
第 2 层隧道 PPTP、L2F、L2TP 把「链路帧」级的东西搬进隧道,适合接远程用户/站点
第 3 层隧道 GRE、IPSec 把 IP 分组整个封进 IP/加密头,适合站点到站点

主线例子: 公司西安分部与成都分部各有一台出口路由器——之间没有专线, 而是各自连 Internet。西安员工访问成都内网服务器时,数据包到出口路由器被 IPSec 加密并套上公网 IP 头,作为普通 Internet 流量到达成都出口, 解密还原、递入内网。对两台主机而言,中间那段公网被「隧道」抹平, 等效于一根私有专线——而成本只是两条普通宽带17。 这也是「虚拟」二字的准确含义:专线的体验,共享网的价钱。

4. NAT:一个公网 IP 带一整个内网

NAT(网络地址转换,1994 年提出)解决的是第 06 章埋的问题:内网主机用私有地址 (10/172.16/192.168),怎么和 Internet 通信?答案是:在专用网接公网的路由器上 装 NAT 软件——NAT 路由器至少有一个合法的全球 IP;内网主机出外网时, NAT 把分组里的私有源地址改写成全球地址再发出去18。

主线例子(书里的图 6-44 原例)走一遍 PAT 全程——客户机 A(10.0.0.1:3345) 访问公网 Web 服务器(128.119.40.186:80),NAT 路由器全球地址 138.76.29.7:

  ① A 发出:  源 10.0.0.1:3345 → 目的 128.119.40.186:80
  ② NAT 改写:源换成 138.76.29.7:5001,并在 NAT 转换表写入
                WAN 侧 138.76.29.7:5001 ←→ LAN 侧 10.0.0.1:3345
  ③ 服务器响应:源 128.119.40.186:80 → 目的 138.76.29.7:5001
  ④ NAT 查表: 把目的换回 10.0.0.1:3345,转发给 A

注意改写的不只是 IP 地址,还有端口号——这就是 PAT(端口地址转换,也叫 端口多路复用 OverLoad):内网所有主机共享同一个公网 IP, 靠「公网 IP + 不同的端口」区分会话。理论上一条公网 IP 可以支撑 6 万多个并发会话, 一个小区宽带动辄几百户,靠的就是它。

三种实现方式19:

  1. 静态转换:一个私有 IP 固定映射一个公网 IP——用于让外部访问内网服务器;
  2. 动态转换:从公网 IP 池里随机分配——IP 池略小于内网机器数时用;
  3. 端口多路复用(PAT):改写端口、全员共享一个 IP——今天网络的绝对主流, 顺带把内网主机藏在 NAT 后面,外部扫描扫不到,安全性白赚一份。

NAT 的麻烦:应用层里的地址。 NAT 只改 IP 头和 TCP/UDP 头,但很多老协议 把地址/端口写进了数据部分(FTP 的 PORT 命令、DNS 的部分查询、某些 ICMP)。 不处理的话,改写后的头与数据里的地址对不上,应用就死。ALG(应用层网关)就是补丁: 对特定应用(FTP、DNS、ICMP……)连数据里的地址一起改20。 HTTP、Telnet 这类数据里不带地址的应用则天然穿越无碍——协议设计的一条现代军规 「别把地址写进载荷」,就是从 NAT 时代血淋淋的兼容问题里总结出来的。

一个判断要当场说清:NAT 是补丁,不是设计。 它缓解了 IPv4 地址枯竭(书里写明 「有助于减缓可用的 IP 地址空间的枯竭」21),却破坏了端到端原则—— 内网主机不能被外部主动连接,P2P 应用被迫打洞(STUN/ICE 这些打洞技术不在本书范围)。 IPv6 的回归端到端,部分就是对 NAT 的反动。

5. 作者的判断与证据

  • 「多播 = 复制只在分叉处」被明确列为树形路由的两条优点(并行到达、复制最少)8—— 用网络流量账为「树」这个数据结构背书。
  • IPv6 的取舍清单(定长头、不验校验和、路由器不分片)每一条都对着 「路由器处理速度是高速化的瓶颈」这个病开方10,这是典型的「先诊断后开药」结构。
  • NAT 的利弊同陈:宽带分享与安全防护两条优点之后,紧接着就是应用层网关的 补丁成本19——补丁的身份作者没有回避。

6. 边界与局限

  • IGMP 只到 v2:v3(按源过滤)未提;多播路由协议全部名录级,没有一个展开。
  • IPv6 一节是「名片级」:地址写法、头格式、过渡技术名词,没有邻居发现(ND)、无状态自动配置(不依赖服务器记账、主机自己生成地址的机制)这些日常机制——生产环境排查 IPv6 问题,这一章不够用。
  • VPN 一节只有一页的体量:IPSec 的 AH/ESP、IKE 握手这些真正决定安全性的内容 在第 11 章才有轮廓。
  • NAT 穿透(STUN/TURN/ICE)未提——今天任何 P2P/WebRTC 开发者都绕不开的话题, 本章的 NAT 模型会让「内网机为什么不能直连」显得无解(其实有解)。

判断(我们的,不是书里的): 这四个补丁里有三个的共同本质是复用: 多播复用的是「一份数据的投递」,VPN 复用的是「公网的线路」,NAT 复用的是「公网 IP」。 IPv6 则是唯一「正面解决」而不是「绕开问题」的方案,也因此部署最慢—— 互联网的历史规律:补丁永远比正解跑得快。读本章时值得记住这个规律, 它对评估任何「过渡技术 vs 革命方案」都有用。 如果错,会错在: IPv6 的实际普及速度已超预期(运营商网络与移动互联网 IPv6 流量占比在近年超过 IPv4),「正解跑不过补丁」可能只适用于地址枯竭之前的窗口期; 而且 IPv6 世界里 NAT 并未消亡(NPTv6、运营商级 NAT),「补丁的顽固性」依然成立。

7. 可带走的

  1. 单播/广播/多播:多播对一组收件人只发一份,分叉处复制,省带宽;
  2. D 类地址 = 多播组;224.0.0.1/2/5/6/12 是常见保留组;
  3. IGMP 只管主机—本地多播路由器之间的组员关系;v2 加了主动退出;
  4. 多播路由 = 造一棵源到组员的树;Mbone 用隧道穿越不支持多播的地段;
  5. IPv6:128 位地址、定长 40B 头、不验校验和、路由器不分片、anycast、流标记;
  6. IPv6 地址 :: 只能压缩一次;前导 0 可省;
  7. IPv4→IPv6 三件套:双栈、隧道、协议翻译(NAT-PT);
  8. VPN = 公网上挖隧道;二层隧道(PPTP/L2TP)与三层隧道(GRE/IPSec);
  9. NAT/PAT:改源地址+端口、查表回转;ALG 处理应用层数据里的地址;
  10. 「别把地址写进载荷」是现代协议的军规——NAT 时代的血泪教训。

8. 原文地图

主题 原书章 原文位置
三种 IP 传输、多播应用 6.7IP多播与IGMP text/12-ch06-07-6-7ip-igmp.txt:5(搜「3 种」) · text/12-ch06-07-6-7ip-igmp.txt:11(搜「网络视频会议」)
多播组与 D 类保留地址 6.7IP多播与IGMP text/12-ch06-07-6-7ip-igmp.txt:33(搜「224.0.0.1」) · text/12-ch06-07-6-7ip-igmp.txt:37(搜「动态分配和恢复」)
以太网多播地址映射与 23 位 6.7IP多播与IGMP text/12-ch06-07-6-7ip-igmp.txt:51(搜「01-00-5E」) · text/12-ch06-07-6-7ip-igmp.txt:58(搜「224.128.64.32」)
IGMP 两版本与不对称 6.7IP多播与IGMP text/12-ch06-07-6-7ip-igmp.txt:63(搜「互联网组管理协议」) · text/12-ch06-07-6-7ip-igmp.txt:85(搜「IGMPv1 的报文格式」) · text/12-ch06-07-6-7ip-igmp.txt:103(搜「向前兼容」)
IGMP 两阶段过程 6.7IP多播与IGMP text/12-ch06-07-6-7ip-igmp.txt:110(搜「两个阶段」)
多播分配树与算法名录 6.7IP多播与IGMP text/12-ch06-07-6-7ip-igmp.txt:127(搜「分配树」) · text/12-ch06-07-6-7ip-igmp.txt:132(搜「泛洪」)
Mbone 与隧道 6.7IP多播与IGMP text/12-ch06-07-6-7ip-igmp.txt:154(搜「Mbone」) · text/13-ch06-08-6-8ipv6.txt:2(搜「把多播分组封装在 IP 分组」)
IPv6 五大变化 6.8IPv6 text/13-ch06-08-6-8ipv6.txt:9(搜「下一代互联网的协议」)
IPv6 基本头字段 6.8IPv6 text/13-ch06-08-6-8ipv6.txt:39(搜「基本头部」)
IPv6 地址写法与零压缩 6.8IPv6 text/13-ch06-08-6-8ipv6.txt:75(搜「8 组」) · text/13-ch06-08-6-8ipv6.txt:83(搜「2001:0DB8」)
过渡三技术 6.8IPv6 text/13-ch06-08-6-8ipv6.txt:93(搜「双协议栈」) · text/14-ch06-09-6-9vpn.txt:2(搜「隧道技术」) · text/14-ch06-09-6-9vpn.txt:15(搜「NAT 技术」)
VPN 定义与隧道协议 6.9VPN text/14-ch06-09-6-9vpn.txt:27(搜「虚拟专用网络」) · text/14-ch06-09-6-9vpn.txt:35(搜「隧道协议」)
NAT 定义与减缓枯竭 6.10NAT text/15-ch06-10-6-10nat.txt:7(搜「1994 年」) · text/15-ch06-10-6-10nat.txt:14(搜「少量的公有 IP 地址」)
NAT 三种实现与 PAT 6.10NAT text/15-ch06-10-6-10nat.txt:28(搜「静态转换」) · text/15-ch06-10-6-10nat.txt:38(搜「端口多路复用」)
ALG 与应用兼容 6.10NAT text/15-ch06-10-6-10nat.txt:43(搜「ALG」)
NAT 四步工作例 6.10NAT text/15-ch06-10-6-10nat.txt:63(搜「图 6-44」) · text/16-fm.txt:2(搜「138.76.29.7」)

  1. 出处:「6.7IP多播与IGMP」第 5–7 段(text/12-ch06-07-6-7ip-igmp.txt:6,搜「单播」)。 ↩

  2. 出处:「6.7IP多播与IGMP」第 21–24 段(text/12-ch06-07-6-7ip-igmp.txt:22,搜「只需要发送一份数据的拷贝」)。 ↩

  3. 出处:「6.7IP多播与IGMP」第 26–47 段(text/12-ch06-07-6-7ip-igmp.txt:28,搜「主机组」;text/12-ch06-07-6-7ip-igmp.txt:45,搜「随时加入或离开」)。 ↩

  4. 出处:「6.7IP多播与IGMP」第 33–36 段(text/12-ch06-07-6-7ip-igmp.txt:34,搜「224.0.0.5」)。 ↩

  5. 出处:「6.7IP多播与IGMP」第 51–61 段(text/12-ch06-07-6-7ip-igmp.txt:51,搜「01-00-5E」;text/12-ch06-07-6-7ip-igmp.txt:60,搜「不是唯一的」)。 ↩

  6. 出处:「6.7IP多播与IGMP」第 63–75 段(text/12-ch06-07-6-7ip-igmp.txt:65,搜「IGMP」;text/12-ch06-07-6-7ip-igmp.txt:74,搜「不包括多播路由器之间」)。 ↩

  7. 出处:「6.7IP多播与IGMP」第 91–95 段(text/12-ch06-07-6-7ip-igmp.txt:92,搜「最大响应时间」)。 ↩

  8. 出处:「6.7IP多播与IGMP」第 127–131 段(text/12-ch06-07-6-7ip-igmp.txt:128,搜「构造树形路由」)。 ↩↩

  9. 出处:「6.7IP多播与IGMP」第 150–158 段(text/12-ch06-07-6-7ip-igmp.txt:158,搜「隧道」)。 ↩

  10. 出处:「6.8IPv6」第 9–24 段(text/13-ch06-08-6-8ipv6.txt:10,搜「地址空间将被耗尽」;text/13-ch06-08-6-8ipv6.txt:17,搜「高速化」)。 ↩↩

  11. 出处:「6.8IPv6」第 25–29 段(text/13-ch06-08-6-8ipv6.txt:26,搜「任意通信」)。 ↩

  12. 出处:「6.8IPv6」第 32–35 段(text/13-ch06-08-6-8ipv6.txt:33,搜「流标记」)。 ↩

  13. 出处:「6.8IPv6」第 37–51 段(text/13-ch06-08-6-8ipv6.txt:42,搜「版本」)。 ↩

  14. 出处:「6.8IPv6」第 75–87 段(text/13-ch06-08-6-8ipv6.txt:77,搜「零压缩」;text/13-ch06-08-6-8ipv6.txt:85,搜「非法的」)。 ↩

  15. 出处:「6.8IPv6」第 89–95 段(text/13-ch06-08-6-8ipv6.txt:93,搜「双协议栈」)。 ↩

  16. 出处:「6.9VPN」第 25–34 段(text/14-ch06-09-6-9vpn.txt:28,搜「拥有与专用网络相同的安全」)。 ↩

  17. 出处:「6.9VPN」第 35–38 段(text/14-ch06-09-6-9vpn.txt:35,搜「隧道技术」)。 ↩

  18. 出处:「6.10NAT」第 7–13 段(text/15-ch06-10-6-10nat.txt:11,搜「NAT 路由器」)。 ↩

  19. 出处:「6.10NAT」第 17–42 段(text/15-ch06-10-6-10nat.txt:31,搜「一对一」;text/15-ch06-10-6-10nat.txt:38,搜「端口多路复用」;text/15-ch06-10-6-10nat.txt:41,搜「应用最多」)。 ↩↩

  20. 出处:「6.10NAT」第 43–52 段(text/15-ch06-10-6-10nat.txt:43,搜「ALG」;text/15-ch06-10-6-10nat.txt:49,搜「HTTP」)。 ↩

  21. 出处:「6.10NAT」第 14 段(text/15-ch06-10-6-10nat.txt:14,搜「少量的公有 IP 地址」)。 ↩