1. Internet Group Management Protocol(互联网组管理协议)特征
- IGMP 基于链路
- 接收者可能位于互联网的任意位置,所以需要 IGMP 确认这些末节网络需要的组播流量
- IGMP 在 TCP/IP 协议簇主要负责管理组成员之间的关系
- 接收者向叶路由器报告自身所需要的组播流
- 叶路由器向接收者查询哪些成员需要组播流量
- IGMP 运行在接收者和叶路由器之间的协议,由接收者和叶路由器共同建立、维护组播成员关系
- IGMP 可以实现接收者自行决定是否需要组播流量或何时需要组播流量(需要组播流才进行转发,否则不转发任何组播流量)
- IGMP 的工作原理
- 接收者向所在的网络报告成员关系「Report」
- 查询器周期性地向接收者所在的网络发送成员查询消息「Report」
- 接收者收到查询消息后,通过报告消息「Report」来响应成员关系
- 网络中的组播路由器依据收到的报告消息来刷新成员的存在信息「oiflist」
- IGMP 查询器是为了在共享网络上进行避免重复 Query 消息(有多台叶路由器时)
- IGMPv1 没有专门定义离开组的报文
- IGMPv1 当有多台查询器时,需要依靠其他组播路由协议完成 “主查询器” 的选举
2. IGMPv1 Message
支持 ASM,不支持 SSM,定义了基本的组成员查询和报告过程
IGMPv1 Message 格式解析
- version:IGMP 版本(只有 IGMPv1 有该字段)
- Type:IGMP 报文类型
- 0x11(Query):普遍组查询
- 0x12(Report):成员报告,可以主动或被动发送
- Checksum:校验值
Group Address:组播组地址
查询器周期性地每「60s(默认)」向目标 IP 地址为「224.0.0.1」发送一次普遍组查询消息
2)Report(报告)
报告主要是为了向查询器告知自身需要的组播流(赶紧拿到组播流量)
工作方式
IGMPv1 自身不支持选举查询器
IGMPv1 的查询器由组播路由协议决定,比如 PIM DR 就是 IGMPv1 的查询器
4)查询和响应的工作流程
主机抑制定时器(几乎无效):1~10s
- 普遍组查询目标地址:224.0.0.1
- 查询器普遍组查询周期时间:60s
- 因为只支持 ASM 模型,所以转发表项为(*,G)
- 查询器周期性向目标 IP 地址「224.0.0.1」发送普遍组查询消息
- 所有主机收到消息后,都启动「1~10s」的随机定时器,当某个主机定时器超时后,向查询器发送加入某个组播组地址的报告消息。如果其他主机收到该报告消息时发现自身也是加入改组,就会抑制掉自身的定时器(谁先超时谁发,后超时的不发,但 IGMPv1 中抑制机制几乎无效)
- 查询器收到报告消息后,就知道该网络中存在组播成员,并生成组播转发表项(*,G)
- 当有组播流量到达查询器时,将转发到组播成员的链路
5)成员离组(Leave)机制
悄悄离组(默默离开),没有组成员离开机制
- 成员离组后不会再响应普遍组查询
- 当共享网络中只有一台主机,并且已经离组。查询器就不会再收到 “报告消息”,此时查询器需要[2个查询周期 + 1个最大报告消息时间(默认 130s)]才能感知到组内已经没有了成员,才不再向该组转发组播报文
3. IGMPv2 Message
支持 ASM,不支持 SSM,增加了组成员快速离开的机制
IGMPv2 Message 格式解析
- Type:IGMP 报文类型
- 0x11:普遍组查询、特定组查询
- 0x12:IGMPv1 成员报告,用于兼容 IGMPv1
- 0x16:IGMPv2 成员报告
- 0x17:成员离开
- Max Response Time:最大响应时间(只在 IGMP 查询消息中有效)
- 以 0.1s 为单位,默认为 10s
- 主机收到查询器发送的普遍查询后,需要再最大响应时间内做出回应
- Checksum:校验值
- Group Address:组播组地址
- 所有运行 IGMPv2 的组播路由器都认为自身是查询器,都向共享网络中发送普遍查询消息。组播路由器收到对端的普遍查询消息后,将消息中的 “源 IP 地址与自身的出接口 IP 地址” 做比较,IP 地址小的作为组播路由器的查询器[只有成为查询器的设备才会发送 Query 消息]
- 没有成为查询器的组播路由器,会启动一个定时器(125s),如果定时器超时前收到了 Query 消息,就重置该定时器;如果定时器超时没有收到 Query 消息,则发起新的选举[喧宾夺主]
2)查询和响应与 IGMPv1 的区别
- 主机抑制定时器:1~10s(最大响应时间)
- 当某个主机定时器超时后,向查询器发送加入某个组播组地址的报告消息,查询器会记录下第一个发送报告消息的组播成员(last reporter)。如果其他主机收到该报告消息时发现自身也是加入该组,就会抑制掉自身的定时器(谁先超时谁发,后超时的不发)
特定组查询目标地址(一般用于成员离开):组播组地址
last reporter 会向目的地址 224.0.0.2 发送成员离开消息(华为设备抓包发现目的地址是向特定组地址)
- 查询器收到后离开消息后,连续发送两个特定组查询,默认间隔时间 1s(目的是为了确定共享网络中还有没有成员)
- 如果共享网络中还有成员,那么成员会以特定组地址作为目标 IP 地址回应查询器报告消息
-
4)IGMPv2 对 IGMPv1 的兼容
如果网络中存在 IGMPv1 的组播路由器,则需要把运行 IGMPv2 的路由器配置为 IGMPv1;或把运行 IGMPv1 的路由器配置为 IGMPv2,整个组播网络才能正常工作(因为 IGMPv1 和 IGMPv2 的查询器选举规则不一样,会导致有多个查询器)
当网络中存在 IGMPv1/v2 的主机时
- IGMPv2 的抑制机制有效,IGMPv1 的抑制几乎无效(与 IGMPv1 相同)
- IGMPv2 主机仍然会发送 Leave 消息,但查询器不会进行特定组查询响应,因为网络中有 IGMPv1 主机导致的离组机制失效
- 如何判断是一个 Query 是 IGMPv1/v2
增加了对 SSM 的支持。指定接收或指定不接受默写组播源的报文
- IGMPv3 中成员报告的目的地址是「224.0.0.22」
- 查询消息中增加了特定源组查询,用来询问特定源组成员是否接收一个或多个特定源发送的组播流
- IGMPv3 没有离组报文,都通过组成员报告实现
- 成员报告消息中可以携带多个组播组信息,并且增加了组播流过滤(能够明确要求接收或不接受某个特定源的组播流)
1)工作机制
通过组播地址和 IP 地址映射,让 IGMPv1/v2 能够接收特定源组播流
- IGMP SSM Mapping 不处理 IGMPv3 消息
- IGMP 收到主机的 IGMPv1/v2 消息后,通过携带的组播组地址进行不同的映射处理
- 一种二层的组播技术,通过侦听主机和叶路由器的 IGMP 报文,建立二层组播转发表,从而避免了组播报文在二层设备上的泛洪(直接发给指定的接收者)
- 可以配合 IGMP SSM Mapping、IGMP Proxy 使用
IGMP Snooping 的缺点:交换机 CPU 需要处理 IGMP 报文来维护二层组播转发表,如果交换机下面组很多,那么二层组播转发表需要占用相当大的内容,且如果不能识别 IGMP 报文,那么二层交换机会监听所有组播报文,并且把组播报文送上 CPU 处理,会加重设备负载
1)端口类型
成员端口(动态和静态):转发组播流的接口
-
2)工作机制
普遍组查询: 定期向 VLAN 内的所有主机与路由器(目的地址为224.0.0.1)发送 IGMP 普遍组查询报文,以查询该网段有哪些组播组的成员
- 如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器
- 如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器
成员报告:
- 成员收到 IGMP 普遍组查询报文后,回应 IGMP 报告报文;成员主动向 IGMP 查询器发送 IGMP 报告报文以声明加入该组播组
- IGMP Snooping 向 VLAN 内所有路由器端口转发。从报文中解析出主机要加入的组播组地址
- 如果不存在该组对应的转发表项,则创建转发表项,将该接口添加到出接口列表中,并启动老化定时器
- 如果已存在该组对应的转发表项,但出接口列表中未包含该接口,则将该接口添加到出接口列表,并启动老化定时器
- 如果已存在该组对应的转发表项,且出接口列表中已包含该端口,则重置其老化定时器
成员离组:
- 运行 IGMPv2 或 IGMPv3 的成员发送 IGMP 离开报文,以通知 IGMP 查询器自己离开了某个组播组
- IGMP 查询器收到离组报文后,从中解析出组播组地址,并通过接收接口向该组播组发送 IGMP 特定组查询报文 / IGMP 特定源组查询报文
- IGMP Snooping 判断离开的组是否存在对应的转发表项,以及转发表项出接口列表是否包含报文的接收接口
- 如果不存在该组对应的转发表项,或者该组对应转发表项的出接口列表中不包含接收接口,则不转发该报文,将其直接丢弃
- 如果存在该组对应的转发表项,且转发表项的出接口列表中包含该接口,会将报文向 VLAN 内所有路由器端口转发
- 如果从该接口收到了主机响应 IGMP 特定组/源组查询的报告报文,表示接口下还有该组的成员,于是重置其老化定时器
- 如果没有从该接口收到主机响应 IGMP 特定组/源组查询的报告报文,则表示接口下已没有该组成员,则在老化时间超时后,将接口从该组的转发表项出接口列表中删除
IGMP Snooping 收到 PIM Hello 报文:
- 向 VLAN 内除接收接口外的其他所有接口转发
IGMP Proxy 可以收所有主机的 IGMP 报告/离开消息(统一上报),也可以收 IGMP 查询器的查询消息,在查询器看来 IGMP Proxy 是台主机,在主机看来 IGMP Proxy 是一台查询器
- 接口类型
- 上游接口:连接查询器
- 下游接口:连接主机
- 通常用在叶路由器和成员主机之间
- 从上游接口收到查询消息,根据组播路由表的状态进行响应
- 从下游接口收到报告消息,根据组播路由表查找报告的组播组,有相应的组播组则不转发;没有则进行转发
- 从下游接口收到离组消息,根据收到的接口发送一个特定组查询,检查是否还存在主机
- 实现方式
- 主备模式:故障恢复后可以立即回切或延迟回切
- 通过 Hash 算法进行负载分担模式