76672182_p0.jpg

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,定义了基本的组成员查询和报告过程

image.png
IGMPv1 Message 格式解析

  • version:IGMP 版本(只有 IGMPv1 有该字段)
  • Type:IGMP 报文类型
    • 0x11(Query):普遍组查询
    • 0x12(Report):成员报告,可以主动或被动发送
  • Checksum:校验值
  • Group Address:组播组地址

    • 普遍组查询消息中:地址是 0.0.0.0
    • 成员报告消息中:地址是主机想加入的组播组地址

      1)Query(查询)

      查询主要是为了确认有哪些组播成员和主机是否还需要组播流(谁需要组播流)

  • 查询器周期性地每「60s(默认)」向目标 IP 地址为「224.0.0.1」发送一次普遍组查询消息

    2)Report(报告)

    报告主要是为了向查询器告知自身需要的组播流(赶紧拿到组播流量)

  • 工作方式

    • 主动发送:主机有明确期望加入某个组播组,主动向查询器发送 Report 消息
    • 被动发送:主机没有明确期望加入哪个组播组,在收到查询器发送的 Query 消息后,如果对该组播组感兴趣并想加入时,才发送 Report 消息

      3)查询器的选举

      查询器是为了在共享网络上进行避免发送重复 Query 消息

  • IGMPv1 自身不支持选举查询器

  • IGMPv1 的查询器由组播路由协议决定,比如 PIM DR 就是 IGMPv1 的查询器

    4)查询和响应的工作流程

  • 主机抑制定时器(几乎无效):1~10s

  • 普遍组查询目标地址:224.0.0.1
  • 查询器普遍组查询周期时间:60s
  • 因为只支持 ASM 模型,所以转发表项为(*,G)

image.png

  1. 查询器周期性向目标 IP 地址「224.0.0.1」发送普遍组查询消息
  2. 所有主机收到消息后,都启动「1~10s」的随机定时器,当某个主机定时器超时后,向查询器发送加入某个组播组地址的报告消息。如果其他主机收到该报告消息时发现自身也是加入改组,就会抑制掉自身的定时器(谁先超时谁发,后超时的不发,但 IGMPv1 中抑制机制几乎无效)
  3. 查询器收到报告消息后,就知道该网络中存在组播成员,并生成组播转发表项(*,G)
  4. 当有组播流量到达查询器时,将转发到组播成员的链路

    5)成员离组(Leave)机制

    悄悄离组(默默离开),没有组成员离开机制

  • 成员离组后不会再响应普遍组查询
  • 当共享网络中只有一台主机,并且已经离组。查询器就不会再收到 “报告消息”,此时查询器需要[2个查询周期 + 1个最大报告消息时间(默认 130s)]才能感知到组内已经没有了成员,才不再向该组转发组播报文

    3. IGMPv2 Message


支持 ASM,不支持 SSM,增加了组成员快速离开的机制

image.png
IGMPv2 Message 格式解析

  • Type:IGMP 报文类型
    • 0x11:普遍组查询、特定组查询
    • 0x12:IGMPv1 成员报告,用于兼容 IGMPv1
    • 0x16:IGMPv2 成员报告
    • 0x17:成员离开
  • Max Response Time:最大响应时间(只在 IGMP 查询消息中有效)
    • 以 0.1s 为单位,默认为 10s
    • 主机收到查询器发送的普遍查询后,需要再最大响应时间内做出回应
  • Checksum:校验值
  • Group Address:组播组地址
    • 普遍组查询消息中:地址是 0.0.0.0
    • 特定组查询报文中:是查询器向查询的组播组地址(一般用于成员离开)
    • 成员报告/离开消息(Leave)中:地址是主机想加入或离开的组播组地址

      1)查询器的选举

      查询器是为了在共享网络上进行避免发送重复 Query 消息

image.png

  1. 所有运行 IGMPv2 的组播路由器都认为自身是查询器,都向共享网络中发送普遍查询消息。组播路由器收到对端的普遍查询消息后,将消息中的 “源 IP 地址与自身的出接口 IP 地址” 做比较,IP 地址小的作为组播路由器的查询器[只有成为查询器的设备才会发送 Query 消息]
  2. 没有成为查询器的组播路由器,会启动一个定时器(125s),如果定时器超时前收到了 Query 消息,就重置该定时器;如果定时器超时没有收到 Query 消息,则发起新的选举[喧宾夺主]

    2)查询和响应与 IGMPv1 的区别

  • 主机抑制定时器:1~10s(最大响应时间)
    • 当某个主机定时器超时后,向查询器发送加入某个组播组地址的报告消息,查询器会记录下第一个发送报告消息的组播成员(last reporter)。如果其他主机收到该报告消息时发现自身也是加入该组,就会抑制掉自身的定时器(谁先超时谁发,后超时的不发)
  • 特定组查询目标地址(一般用于成员离开):组播组地址

    • 只有加入了该特定组的成员,才会回复特定组查询,避免了属于其他组成员的主机发送响应报文

      3)成员离组(Leave)机制

      last reporter 成员离开,才会告知查询器,并触发特定组查询;其他组成员只需要静默离开。如果 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
    • 通过 Message Version
    • 通过 Message Max Response Time

      4. IGMPv3 Message


增加了对 SSM 的支持。指定接收或指定不接受默写组播源的报文

  • IGMPv3 中成员报告的目的地址是「224.0.0.22」
  • 查询消息中增加了特定源组查询,用来询问特定源组成员是否接收一个或多个特定源发送的组播流
  • IGMPv3 没有离组报文,都通过组成员报告实现
  • 成员报告消息中可以携带多个组播组信息,并且增加了组播流过滤(能够明确要求接收或不接受某个特定源的组播流)

    1)工作机制

    image.png
  1. 叶路由器向主机发送特定源查询(包含多个组)
  2. 主机通过报告消息回复需要哪个组的组播流
  3. 叶路由器向主机发送所需组播源的组播流

    5. IGMP SSM Mapping


通过组播地址和 IP 地址映射,让 IGMPv1/v2 能够接收特定源组播流

  • IGMP SSM Mapping 不处理 IGMPv3 消息
  • IGMP 收到主机的 IGMPv1/v2 消息后,通过携带的组播组地址进行不同的映射处理
    • 如果组播组地址是 ASM,则只提供 ASM 服务
    • 如果组播组地址是 SSM,并且有对应的 SSM Mapping,则提供 ASM 服务
    • 如果组播组地址是 ASM,如果没有对应的 SSM Mapping,则丢弃报文

      6. IGMP Snooping


  • 一种二层的组播技术,通过侦听主机和叶路由器的 IGMP 报文,建立二层组播转发表,从而避免了组播报文在二层设备上的泛洪(直接发给指定的接收者)
  • 可以配合 IGMP SSM Mapping、IGMP Proxy 使用
  • IGMP Snooping 的缺点:交换机 CPU 需要处理 IGMP 报文来维护二层组播转发表,如果交换机下面组很多,那么二层组播转发表需要占用相当大的内容,且如果不能识别 IGMP 报文,那么二层交换机会监听所有组播报文,并且把组播报文送上 CPU 处理,会加重设备负载

    1)端口类型

  • 成员端口(动态和静态):转发组播流的接口

  • 路由器端口(动态和静态):接收组播流的接口

    2)工作机制

    image.png
    普遍组查询:

  • 定期向 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 内除接收接口外的其他所有接口转发
    • 如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器
    • 如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器

      7. IGMP Proxy


IGMP Proxy 可以收所有主机的 IGMP 报告/离开消息(统一上报),也可以收 IGMP 查询器的查询消息,在查询器看来 IGMP Proxy 是台主机,在主机看来 IGMP Proxy 是一台查询器

  • 接口类型
    • 上游接口:连接查询器
    • 下游接口:连接主机
  • 通常用在叶路由器和成员主机之间
    • 从上游接口收到查询消息,根据组播路由表的状态进行响应
    • 从下游接口收到报告消息,根据组播路由表查找报告的组播组,有相应的组播组则不转发;没有则进行转发
    • 从下游接口收到离组消息,根据收到的接口发送一个特定组查询,检查是否还存在主机
  • 实现方式
    • 主备模式:故障恢复后可以立即回切或延迟回切
    • 通过 Hash 算法进行负载分担模式