📚 第五章 IP协议相关技术
📄 一句话概括

多播省的是「同一段链路上重复的包」:一份数据在分叉处才复制,不是一开始就发 N 份。 它要两个协议配合:IGMP 管「这段链路上有没有人订阅」,PIM 管「多播包往哪走」。

📝 本节和前面几节的关系

4.3.5 讲了多播地址长什么样,这一节讲「地址怎么变成一棵传递树」。 5.8.2 的任播是它的邻居,一个送给「一组里的全部」,一个送给「一组里最近的一台」。

一、多播到底省了什么

先摆三种发法,看骨干网上要跑几份:

方式 骨干上跑几份 谁能收到
单播 100 份 指定的那一个
广播 1 份 同网段全部,不想收也收
多播 1 份,分叉处复制 只发给订阅了的

第一行是「有多少人就要发多少份」:100 个接收者、1 Mbps 的直播,出口就要 100 Mbps。 第二行看着省,但它出不了路由器——4.3.4 讲的广播地址只在本地网段有效,跨网段就没意义了。 第三行才是正解:一条链路只跑一份,到了真正需要分叉的路由器才复制。 注意「省」是有条件的:如果 100 个接收者分散在 100 条不同链路上,那还是 100 份。 多播省的是「同一段链路上的重复」,不是「所有重复」。 这也是「多播适合直播、不适合点播」的原因——点播的每个人进度不同,没法共用同一条流。

二、组管理:IGMP

IGMP 干的是一件很小的事:问一句「这条链路上还有人要这个组吗」。 它只在「主机和直连路由器之间」跑,不管跨网段。

版本 能力 差别
IGMPv1 加入、离开都不说 靠超时退出
IGMPv2 支持主动离开 退出更快
IGMPv3 可以指定「只收谁的」 支持源过滤

第一行那个「靠超时退出」很笨:主机走了不说话,路由器只能等查询没回应,才认为没人要了。 所以第一个包往往会「多送一会儿」——这也是早期多播「关不掉」的抱怨来源。 第三行的「源过滤」是 SSM 的基础:「我只收 1.1.1.1 发的这一组」, 而不是「这一组谁发我都收」。 这对直播很有用——可以挡住伪造源的注入。 还有两个地址要记住:224.0.0.1 是「本链路所有主机」,224.0.0.2 是「本链路所有路由器」。 它们永远不转发,属于「协议自己用的地址」。

三、多播路由:PIM

跨网段怎么走,是 PIM 的事。它有两种思路,方向正好相反:

模式 做法 适合
PIM-DM(密集) 先往所有方向撒,没人要就剪 接收者很密
PIM-SM(稀疏) 先建一棵共享树,有人要才拉 接收者很散

第一行是「先撒后剪」:默认认为到处都有人要,收到「不要」的回报才停止转发。 它简单,但浪费——所以只在「一个网段里几乎人人都看」的场景划算。 第二行是「先登记再送」:所有流量先到一台汇聚点(RP),接收者向 RP 报到,树建好了才发。 互联网上的多播基本都用这一种。 和单播路由最大的不同在这里:单播查表只看「目的前缀」,多播要同时看「源」和「组」。 而且要防环——多播树一旦成环,一个包会绕着环永远转下去。 所以 PIM 用「反向路径检查」(RPF): 只有从「回源的最短路径接口」进来的包才转发,别的一律丢。

四、地址范围与 MAC 映射

多播地址不是「随便挑一个」,范围决定了它能走多远:

范围 用途 备注
224.0.0.0/24 本地链路 不转发
224.0.1.0/24 互联网可用 需申请
239.0.0.0/8 组织内部 类似私网,自己划

第一行那个「不转发」是硬规定:224.0.0.1 的意思是「本链路所有主机」,出了路由器就没意义。 所以「挑错了范围,包根本出不了门」,这是多播调试里最常见的第一个坑。 第三个坑在二层:多播 IP 要映射成多播 MAC,规则是「01:00:5e 加上组地址的低 23 位」。 而组地址有 28 位可用,只用 23 位,就意味着 32 个组共用一个 MAC。 所以主机收到帧之后,还要再看一眼 IP 头才能确定是不是自己要的—— 光凭 MAC 判断会收到别人的数据。

五、动手 Demo:多播要两个协议配合

把「组管理」和「多播路由」拆开看,再把地址范围摆出来。 先看 IGMP 那三行,再看地址那三行。

ver = ('IGMPv1', 'IGMPv2', 'IGMPv3')
feat = ('加入离开都不说', '支持主动离开', '可以指定只收谁的')
for i in range(3):
    print('%-8s %s' % (ver[i], feat[i]))

实跑输出:

--------------------------------------------------------------------
多播要两个协议配合
--------------------------------------------------------------------
**多播能工作,靠的是「组管理」和「路由」两件事分开做**:
**IGMP 管「这条链路上有没有人订阅」,PIM 管「多播包怎么走」。**

  版本           能力                         差别
  -----------------------------------------------------------
  **IGMPv1**     **加入、离开都不说**         **靠超时退出**
  **IGMPv2**     **支持主动离开**             **退出更快**
  **IGMPv3**     **可以指定「只收谁的」**     **支持源过滤**

**第三行那个「源过滤」是 SSM 的基础**:**「我只收 1.1.1.1 发的这一组」**,
**而不是「这一组谁发我都收」。**
**这对视频直播很有用**——**可以挡住伪造源的攻击。**

**多播地址的范围也有讲究**:
  范围                 用途               备注
  -------------------------------------------------------------------
  **224.0.0.0/24**     **本地链路**       **不转发(如 224.0.0.1)**
  **224.0.1.0/24**     **互联网可用**     **需申请**
  **239.0.0.0/8**      **组织内部**       **类似私网,自己划**

**第一行那个「不转发」是硬规定**:**224.0.0.1 是「本链路所有主机」,出了路由器就没意义。**
**所以「多播地址」不是「随便挑一个」**——**挑错了范围,包根本出不了门。**

三行 IGMP 的差别,本质是「退出」越来越干脆: v1 只能等超时,v2 会说「我走了」,v3 还能说「我只要谁的」。 所以多播的体验提升,一大半来自「退得更快」。 地址那三行要按「能不能出路由器」来记:224.0.0.0/24 是最内圈,压根不转发; 224.0.1.0/24 是公网可用,但要申请;239.0.0.0/8 是「多播里的私有地址」,企业自己划。 做内网直播,用 239 段最省事。 最后一个提醒:多播能不能通,取决于「路径上每一跳都支持」: 只要中间有一个路由器不认,树就断了。 这也是「多播在公网上一直没普及」的现实原因——它需要端到端的配合,而互联网是「各自为政」的。

30 秒实验

  1. 算一下:100 个接收者收 1 Mbps 直播,单播出口要多少带宽?
  2. 想一下:为什么 224.0.0.1 的包永远不出路由器?
  3. 想一下:32 个多播组共用一个 MAC,主机怎么区分?

常见误区

  1. 以为「多播一定省带宽」。 只在同一链路有多人订阅时才省,分散在 100 条链路上照样 100 份。
  2. 以为「IGMP 负责跨网段转发」。 它只管主机和直连路由器之间,跨网段是 PIM 的事。
  3. 以为「多播地址随便挑一个就行」。 范围决定能不能出网,挑到 224.0.0.0/24 就出不了门。
自测三问(点开对答案) 1. 多播和广播的区别? —— **广播发给同网段所有主机,不管人家要不要**;**多播只发给订阅了的,而且能跨网段。** 2. IGMPv3 多了什么能力? —— **源过滤**:可以指定「只收某个源发的这一组」,这是 SSM 的基础。 3. 为什么 32 个多播组会共用一个 MAC? —— **因为映射只用了组地址的低 23 位**,剩下 5 位丢了,所以主机收到帧还要再看 IP 头。

下一节讲它的邻居:任播,一个地址配在很多台机器上。

相关笔记