多播省的是「同一段链路上重复的包」:一份数据在分叉处才复制,不是一开始就发 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 秒实验
- 算一下:100 个接收者收 1 Mbps 直播,单播出口要多少带宽?
- 想一下:为什么 224.0.0.1 的包永远不出路由器?
- 想一下:32 个多播组共用一个 MAC,主机怎么区分?
常见误区
- 以为「多播一定省带宽」。 只在同一链路有多人订阅时才省,分散在 100 条链路上照样 100 份。
- 以为「IGMP 负责跨网段转发」。 它只管主机和直连路由器之间,跨网段是 PIM 的事。
- 以为「多播地址随便挑一个就行」。 范围决定能不能出网,挑到 224.0.0.0/24 就出不了门。
自测三问(点开对答案)
1. 多播和广播的区别? —— **广播发给同网段所有主机,不管人家要不要**;**多播只发给订阅了的,而且能跨网段。** 2. IGMPv3 多了什么能力? —— **源过滤**:可以指定「只收某个源发的这一组」,这是 SSM 的基础。 3. 为什么 32 个多播组会共用一个 MAC? —— **因为映射只用了组地址的低 23 位**,剩下 5 位丢了,所以主机收到帧还要再看 IP 头。下一节讲它的邻居:任播,一个地址配在很多台机器上。
- ☐ (本节完,下一节 5.8.2 IP任播)