第13章 IGMP:Internet组管理协议
所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议
本章介绍IGMP协议,包括IGMP的作用、报文格式、组成员状态和版本等。
13.1 引言
IGMP的作用
IGMP(Internet Group Management Protocol):
- 互联网组管理协议
- 管理多播组成员
- 主机和路由器之间用
- 主机告诉路由器自己加入了哪个组
- 路由器知道哪些组有成员
IGMP管理多播组成员。
为什么需要IGMP
为什么需要IGMP:
- 多播需要知道哪些组有成员
- 路由器要知道往哪转发多播包
- 主机要告诉路由器自己的成员关系
- 需要一个协议来做这个
没有IGMP会怎样:
- 路由器不知道哪些组有成员
- 要么都转发,浪费带宽
- 要么都不转发,多播用不了
IGMP是多播的基础。
IGMP的位置
IGMP的位置:
- 网络层协议
- 封装在IP数据报里
- IP协议号是2
- 在主机和本地路由器之间
+--------+----------+
| IP首部 | IGMP报文 |
+--------+----------+
IGMP是网络层协议,协议号2。
本章讨论的内容
本章讨论的内容:
- IGMP的作用
- IGMP报文格式
- IGMP的工作过程
- IGMPv1, v2, v3
- 组成员状态
本章介绍IGMP协议。
13.2 IGMP报文格式
IGMPv1报文格式
IGMPv1报文格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 版本 | 类型 | 未使用 | 校验和 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 组地址 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
- 版本:4位,版本1
- 类型:4位,1=查询,2=报告
- 未使用:8位,没用
- 校验和:16位
- 组地址:32位,多播组地址
IGMPv1格式比较简单。
IGMPv2报文格式
IGMPv2报文格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 类型 | 最大响应时间 | 校验和 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 组地址 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
- 类型:8位
- 0x11:成员关系查询
- 0x16:版本2成员关系报告
- 0x17:离开组
- 0x12:版本1成员关系报告(兼容v1)
- 最大响应时间:8位,查询的响应时间
- 校验和:16位
- 组地址:32位
IGMPv2增加了离开消息和最大响应时间。
IGMPv3报文格式
IGMPv3更复杂:
- 支持特定源多播(SSM)
- 可以指定源地址
- 报文格式更复杂
- 有更多类型
主要增加的:
- 可以指定源地址
- 可以过滤源
- 更灵活
IGMPv3更强大,支持源过滤。
13.3 IGMP的工作过程
基本过程
IGMP的基本过程:
-
主机加入组
- 主机发送成员关系报告
- 告诉路由器我加入了这个组
-
路由器定期查询
- 路由器定期发查询
- 问还有哪些组有成员
-
主机响应查询
- 主机收到查询
- 如果还在组里,发报告
- 有延迟,避免同时发
-
主机离开组
- 主机发送离开消息(v2/v3)
- 路由器发特定查询
- 确认还有没有其他成员
加入、查询、响应、离开。
加入组
加入组的过程:
-
主机想加入一个组
- 发送成员关系报告
- 目的地址是那个多播组地址
- 内容是那个组地址
-
路由器收到报告
- 知道这个接口有这个组的成员
- 开始转发这个组的多播包到这个接口
-
为什么发给组地址
- 其他主机也能收到
- 如果其他主机也在这个组
- 就不用再发了
- 减少报告数量
加入时发报告。
查询和响应
查询和响应的过程:
-
路由器定期发查询
- 目的地址:224.0.0.1(所有主机)
- 组地址:0(所有组)
- 问:还有谁在组里?
-
主机收到查询
- 每个组设置一个定时器
- 随机延迟
- 时间到了就发报告
-
主机发报告
- 目的地址是组地址
- 其他主机收到
- 如果自己也在这个组
- 看到别人发了,自己就不发了
- 取消定时器
-
路由器收到报告
- 知道这个组还有成员
- 继续转发
查询响应机制,避免重复报告。
离开组
离开组的过程(v2/v3):
-
主机想离开组
- 发送离开组消息
- 目的地址:224.0.0.2(所有路由器)
- 告诉路由器我要离开这个组
-
路由器收到离开消息
- 发特定组查询
- 问这个组还有没有成员
-
如果还有其他主机在组里
- 会发报告
- 路由器继续转发
-
如果没有响应
- 路由器认为没有成员了
- 停止转发这个组的包
离开时发离开消息,路由器确认。
IGMPv1的离开
IGMPv1的离开:
- 没有离开消息
- 主机直接离开,不通知
- 路由器靠超时判断
- 几次查询都没有报告
- 就认为没有成员了
缺点:
- 离开延迟大
- 要等超时才知道
- 浪费带宽
v1没有离开消息,靠超时。
13.4 IGMP的版本
IGMPv1
IGMPv1:
- 最早的版本
- 功能简单
- 只有查询和报告
- 没有离开消息
- 靠超时判断成员离开
特点:
- 简单
- 离开延迟大
- 没有特定组查询
v1是最早的版本。
IGMPv2
IGMPv2:
- 增加了离开消息
- 增加了最大响应时间
- 增加了特定组查询
- 离开延迟小
改进:
- 离开更快
- 更高效
- 兼容v1
v2增加了离开消息。
IGMPv3
IGMPv3:
- 增加了源过滤
- 支持特定源多播(SSM)
- 可以指定只接收某些源的多播
- 更灵活
- 更安全
改进:
- 源过滤
- SSM支持
- 更复杂
v3增加了源过滤。
版本比较
IGMP版本比较:
| 对比项 | IGMPv1 | IGMPv2 | IGMPv3 |
|---|---|---|---|
| 离开消息 | 无 | 有 | 有 |
| 特定组查询 | 无 | 有 | 有 |
| 最大响应时间 | 无 | 有 | 有 |
| 源过滤 | 无 | 无 | 有 |
| SSM支持 | 不支持 | 不支持 | 支持 |
| 复杂度 | 简单 | 中等 | 复杂 |
| 离开延迟 | 大 | 小 | 小 |
版本越高功能越强。
13.5 组成员状态
主机的状态
主机的组成员状态:
- 每个接口,每个组
- 有一个状态
- 非成员 / 成员
状态转换:
- 加入 → 成员状态
- 离开 → 非成员状态
- 收到查询 → 设置定时器
- 定时器到 → 发报告
主机维护组成员状态。
路由器的状态
路由器的状态:
- 每个接口,每个组
- 有成员 / 没有成员
状态转换:
- 收到报告 → 有成员
- 几次查询没报告 → 没有成员
- 收到离开 → 发特定查询
- 特定查询没响应 → 没有成员
路由器也维护成员状态。
13.6 小结
IGMP概述
-
作用
- 互联网组管理协议
- 管理多播组成员
- 主机和路由器之间
-
为什么需要
- 路由器要知道哪些组有成员
- 决定要不要转发多播
-
位置
- 网络层
- IP协议号2
报文格式
-
IGMPv1
- 版本+类型
- 组地址
- 查询和报告
-
IGMPv2
- 类型
- 最大响应时间
- 组地址
- 增加离开消息
-
IGMPv3
- 更复杂
- 源过滤
- SSM支持
工作过程
-
加入组
- 发成员关系报告
- 路由器知道有成员
-
查询和响应
- 路由器定期查询
- 主机响应报告
- 延迟避免重复
-
离开组
- v2/v3发离开消息
- 路由器特定查询确认
- v1靠超时
版本比较
-
IGMPv1
- 简单
- 没有离开消息
- 离开延迟大
-
IGMPv2
- 有离开消息
- 特定组查询
- 离开延迟小
-
IGMPv3
- 源过滤
- SSM支持
- 最复杂
组成员状态
-
主机状态
- 成员/非成员
- 每个接口每个组
-
路由器状态
- 有成员/没有成员
- 每个接口每个组
关键概念
-
IGMP
- 组管理协议
- 主机-路由器之间
-
加入/离开
- 加入发报告
- 离开发离开消息(v2+)
-
查询/响应
- 路由器定期查询
- 主机响应
- 延迟避免重复
-
版本
- v1, v2, v3
- 功能越来越强