IP组播
1 IP组播基础
IP组播技术有效地解决了单点发送、多点接收的问题。组播源只发送一份数据,被传递的信息在距组播源尽可能远的网络节点才开始被复制和分发,并且只发送给需要该信息的接收者。
说明:
本章所涉及的交换机和交换机图标,是指使能了二层组播功能的路由器。
- 1.1 IP组播简介
介绍IP组播的定义、目的和受益。 - 1.2 原理描述
介绍IP组播的基本概念、组播服务模型、组播地址和组播协议。 - 1.3 应用场景
介绍IP组播的应用场景。
1.1 IP组播简介
介绍IP组播的定义、目的和受益。
定义
作为IP传输三种方式之一,IP组播通信指的是IP报文从一个源发出,被转发到一组特定的接收者。相较于传统的单播和广播,IP组播可以有效地节约网络带宽、降低网络负载,所以被广泛应用于IPTV、实时数据传送和多媒体会议等网络业务中。
目的
传统的IP通信有两种方式:单播(Unicast)和广播(Broadcast)。
- 对于单播通信,信息源为每个需要信息的主机都发送一份独立的报文。
- 对于广播通信,信息源将信息发送给该网段中的所有主机,而不管其是否需要该信息。
如果要将数据从一台主机发送给多个主机而非所有主机,可以采用广播方式,也可以由源主机采用单播方式向网络中的多台目标主机发送多份数据,如图1-1所示。
- 采用单播方式时,网络中传输的信息量与需要该信息的用户量成正比。当需要该信息的用户数量较大时,信息源需要将多份内容相同的信息发送给不同的用户,这对信息源以及网络带宽都将造成巨大的压力。因此,该传输方式不利于信息的批量发送,只适用于用户稀少的网络。
- 采用广播方式时,不需要接收信息的主机也将收到该信息,这样不仅信息的安全性得不到保障,而且会造成同一网段中信息泛滥。因此,该传输方式不利于与特定对象进行数据交互,同时会浪费大量的带宽。
由上述可见,传统的单播和广播通信方式不能有效地解决单点发送、多点接收的问题。
组播(Multicast)可以很好的解决点到多点的数据传输,如图1-2所示,源只发送一份数据,网络中只有需要该数据的主机(目标主机HostA和HostC)可以接收该数据,其他主机(HostB)不能收到该数据。
- 相比单播,由于被传递的信息在距信息源尽可能远的网络节点才开始被复制和分发,所以用户的增加不会导致信息源负载的加重以及网络资源消耗的显著增加。
- 相比广播,由于被传递的信息只会发送给需要该信息的接收者,所以不会造成网络资源的浪费,并能提高信息传输的安全性。
受益
组播适用于任何“点到多点”的数据发布,主要包含以下几方面:
- 多媒体、流媒体的应用。
- 培训、联合作业场合的通信。
- 数据仓库、金融应用(股票)。
IP组播技术在ISP提供的互联网信息服务中已经得到了应用。例如:在线直播、网络电视、远程教育、远程医疗、网络电台和实时视/音频会议等。
1.2 原理描述
介绍IP组播的基本概念、组播服务模型、组播地址和组播协议。
1.2.1 组播基本概念
组播传输的特点是单点发送,多点接收。如图1-3所示为组播的传输模型示意图,网络中存在信息发送源Source,感兴趣的用户HostA和HostC提出信息需求,Source发出的数据只有HostA和HostC会接收到。
- 组播组:用IP组播地址进行标识的一个集合。任何用户主机(或其他接收设备),加入一个组播组,就成为了该组成员,可以识别并接收发往该组播组的组播数据。
- 组播源:信息的发送者称为“组播源”,如图1-3中的Source。一个组播源可以同时向多个组播组发送数据,多个组播源也可以同时向一个组播组发送报文。组播源通常不需要加入组播组。
- 组播组成员:所有加入某组播组的主机便成为该组播组的成员,如图1-3中的HostA和HostC。组播组中的成员是动态的,主机可以在任何时刻加入或离开组播组。组播组成员可以广泛地分布在网络中的任何地方。
- 组播路由器:支持三层组播功能的路由器或交换机,如图1-3中的各个Router。组播路由器不仅能够提供组播路由功能,也能够在与用户连接的末梢网段上提供组播组成员的管理功能。
表1-1以收看某电视频道的节目为例来类比IP组播中的概念。
顺序 |
电视节目传输过程 |
组播方式传输过程 |
---|---|---|
1 |
电视台向频道内发送数据 |
组播源向组播组发送数据 |
2 |
观众打开电视机选择到这个频道 |
接收者主机加入该组播组 |
3 |
电视机播放该频道电视节目 |
主机接收到发送给这个组的数据 |
4 |
观众可以随时控制电视机的开关和频道间的切换 |
主机可以动态加入或退出组播组 |
1.2.2 组播服务模型
组播服务模型的分类是针对接收者主机的,对组播源没有区别。组播源发出的组播数据中总是以组播源自己的IP地址为报文的源地址,组播组地址为目的地址。而接收者主机接收数据时可以对源进行选择,因此产生了ASM(Any-Source Multicast)和SSM(Source-Specific Multicast)两种服务模型。这两种服务模型使用不同的组播组地址范围。
ASM模型
ASM模型仅针对组地址提供组播分发。一个组播组地址作为一个网络服务的集合,任何源发布到该组地址的数据得到同样的服务。接收者主机加入组播组以后可以接收到任意源发送到该组的数据。
为了提高安全性,可以在路由器上配置针对组播源的过滤策略,允许或禁止来自某些组播源的报文通过。最终从接收者角度看,数据是经过筛选的。
ASM模型要求组地址必须整个组播网络中唯一。“唯一”指的是同一时刻一个ASM地址只能被一种组播应用使用。如果有两种不同的应用程序使用了同一个ASM组地址发送数据,他们的接收者会同时收到来自两个源的数据。这样一方面会导致网络流量拥塞,另一方面也会给接收者主机造成困扰。
SSM模型
SSM模型针对特定源和组的绑定数据流提供服务,接收者主机在加入组播组时,可以指定只接收哪些源的数据。加入组播组以后,主机只会收到指定源发送到该组的数据。
SSM模型对组地址不再要求全网唯一,只需要每个组播源保持唯一。这里的“唯一”指的是同一个源上不同的组播应用必须使用不同的SSM地址来区分。不同的源之间可以使用相同的组地址,因为SSM模型中针对每一个(源,组)信息都会生成表项。这样一方面节省了组播组地址,另一方面也不会造成网络拥塞。
1.2.3 组播地址
为了使组播源和组播组成员进行通信,需要提供网络层组播,使用IP组播地址。同时,为了在本地物理网络上实现组播信息的正确传输,需要提供链路层组播,使用组播MAC地址。组播数据传输时,其目的地不是一个具体的接收者,而是一个成员不确定的组,所以需要一种技术将IP组播地址映射为组播MAC地址。
IPv4组播地址
IANA(Internet Assigned Numbers Authority,互联网编号分配委员会)将D类地址空间分配给IPv4组播使用。IPv4地址一共32位,D类地址最高4位为1110,因此地址范围从224.0.0.0到239.255.255.255,具体分类及含义见表1-2。
地址范围 |
含义 |
---|---|
224.0.0.0~224.0.0.255 |
永久组地址。IANA为路由协议预留的IP地址(也称为保留组地址),用于标识一组特定的网络设备,供路由协议、拓扑查找等使用,不用于组播转发。常见的永久组地址如表1-3所示。 |
224.0.1.0~231.255.255.255 233.0.0.0~238.255.255.255 |
ASM组播地址,全网范围内有效。 说明:
其中,224.0.1.39和224.0.1.40是保留地址,不建议使用。 |
232.0.0.0~232.255.255.255 |
缺省情况下的SSM组播地址,全网范围内有效。 |
239.0.0.0~239.255.255.255 |
本地管理组地址,仅在本地管理域内有效。在不同的管理域内重复使用相同的本地管理组地址不会导致冲突。 |
永久组地址 |
含义 |
---|---|
224.0.0.0 |
不分配 |
224.0.0.1 |
网段内所有主机和路由器(等效于广播地址) |
224.0.0.2 |
所有组播路由器 |
224.0.0.3 |
不分配 |
224.0.0.4 |
DVMRP(Distance Vector Multicast Routing Protocol,距离矢量组播路由协议)路由器 |
224.0.0.5 |
OSPF(Open Shortest Path First,开放最短路径优先)路由器 |
224.0.0.6 |
OSPF DR(Designated Router,指定路由器) |
224.0.0.7 |
ST(Shared Tree,共享树)路由器 |
224.0.0.8 |
ST主机 |
224.0.0.9 |
RIP-2(Routing Information Protocol version 2,路由信息协议版本2)路由器 |
224.0.0.11 |
移动代理(Mobile-Agents) |
224.0.0.12 |
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)服务器/中继代理 |
224.0.0.13 |
所有PIM(Protocol Independent Multicast,协议无关组播)路由器 |
224.0.0.14 |
RSVP(Resource Reservation Protocol,资源预留协议)封装 |
224.0.0.15 |
所有CBT(Core-Based Tree,有核树)路由器 |
224.0.0.16 |
指定SBM(Subnetwork Bandwidth Management,子网带宽管理) |
224.0.0.17 |
所有SBM |
224.0.0.18 |
VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议) |
224.0.0.22 |
所有使能IGMPv3(Internet Group Management Protocol, Version 3,因特网组管理协议)的路由器 |
224.0.0.19 ~ 224.0.0.21 224.0.0.23 ~ 224.0.0.255 |
未指定 |
IPv6组播地址
IPv6地址长度是128位,在RFC4291中对组播地址的定义如图1-4所示。
和IPv4组播地址相比,IPv6组播地址有了明确的Group ID字段用于标识组播组。
FF:最高8位为11111111,标识此地址为组播地址。即IPv6组播地址总是以FF开头。
Flags字段(4位),用来标识组播地址的状态。其含义如下:
表1-4 Flags取值及含义取值
含义
0
表示是IANA指定的常用组播地址,也叫保留组地址
1
表示是ASM范围的组播地址
2
表示是ASM范围的组播地址
3
表示是SSM范围的组播地址
其他
未分配
- Scope字段(4位):用来标识组播组的应用范围,例如是只包含同一本地网络、同一站点、同一机构中的节点,还是包含全球地址空间内的任何节点。其含义如下:表1-5 Scope字段的取值及含义
取值
含义
0、3、F
保留
1
节点(或接口)本地范围(node/interface-local scope)
2
链路本地范围(link-local scope)
4
管理本地范围(admin-local scope)
5
站点本地范围(site-local scope)
8
机构本地范围(organization-local scope)
E
全球范围(global scope)
其他
未分配
- Group ID(112位):组播组标识号。用来在由Scope字段所指定的范围内唯一标识组播组,该标识可能是永久分配的或临时的,这由Flags字段的T位决定。
固定的IPv6组播地址的范围及含义如表1-6。
范围 |
含义 |
---|---|
FF0x::/32 |
保留组地址,具体请参见表1-7。 |
FF1x::/32(x不能是1或者2) FF2x::/32(x不能是1或者2) |
ASM组播地址,全网范围内有效。 |
FF3x::/32(x不能是1或者2) |
缺省的SSM组地址范围,全网范围内有效。 |
范围 |
IPv6组播地址 |
含义 |
---|---|---|
节点(或接口)本地范围 |
FF01::1 |
所有节点(接口)地址 |
FF01::2 |
所有路由器地址 |
|
链路本地范围 |
FF02::1 |
所有节点地址 |
FF02::2 |
所有路由器地址 |
|
FF02::3 |
未定义的地址 |
|
FF02::4 |
DVMRP路由器 |
|
FF02::5 |
OSPF IGP Routers |
|
FF02::6 |
OSPF IGP DR |
|
FF02::7 |
ST路由器 |
|
FF02::8 |
ST主机 |
|
FF02::9 |
RIP路由器 |
|
FF02::A |
EIGRP路由器 |
|
FF02::B |
移动代理 |
|
FF02::D |
所有PIM路由器 |
|
FF02::E |
RSVP封装 |
|
FF02::1:1 |
Link Name |
|
FF02::1:2 |
所有DHCP代理 |
|
FF02::1:FFXX:XXXX |
Solicited-Node地址,XX:XXXX表示节点IPv6地址的后24位 |
|
站点本地范围 |
FF05::2 |
所有路由器地址 |
FF05::1:3 |
所有DHCP服务器 |
|
FF05::1:4 |
所有DHCP中继 |
|
FF05::1:1000~FF05::1:13FF |
服务位置 |
IPv4组播MAC地址
以太网传输IPv4单播报文的时候,目的MAC地址使用的是接收者的MAC地址。但是在传输组播数据时,其目的地不再是一个具体的接收者,而是一个成员不确定的组,所以要使用IPv4组播MAC地址,即IPv4组播地址映射到链路层中的地址。
IANA规定,IPv4组播MAC地址的高24位为0x01005e,第25位为0,低23位为IPv4组播地址的低23位,映射关系如图1-5所示。例如组播组地址224.0.1.1对应的组播MAC地址为01-00-5e-00-01-01。
IPv4组播地址的前4位是固定的1110,对应组播MAC地址的高25位,后28位中只有23位被映射到MAC地址,因此丢失了5位的地址信息,直接结果是有32个IPv4组播地址映射到同一MAC地址上。例如IP地址为224.0.1.1、224.128.1.1、225.0.1.1、239.128.1.1等组播组的组播MAC地址都为01-00-5e-00-01-01。网络管理员在分配地址时必须考虑这种情况。
IPv6组播MAC地址
IPv6组播MAC地址的高16位为0x3333,低32位为IPv6组播地址的低32位。如图1-6所示,是IPv6组播地址FF01::1111:1的MAC地址映射举例。
可见IPv6中会有更多的组地址使用同一个MAC地址。
1.2.4 IPv4组播协议
在IP组播传输模型中,发送者不关心接收者所处的位置,只要将数据发送到约定的目的地址,剩下的工作就交给网络去完成。网络中的组播设备必须收集接收者的信息,并按照正确的路径实现组播报文的转发和复制。在组播的发展过程中,形成了一套完整的协议来完成此任务。
IPv4网络中使用的组播协议如表1-8所示。
协议 |
功能 |
备注 |
---|---|---|
组播组管理协议IGMP(Internet Group Management Protocol) |
IGMP是负责IPv4组播成员管理的协议,运行在组播网络中的最后一段,即三层网络设备与用户主机相连的网段内。IGMP协议在主机端实现组播组成员加入与离开,在上游的三层设备中实现组成员关系的维护与管理,同时支持与上层组播路由协议的信息交互。 |
到目前为止,IGMP有三个版本:IGMPv1、IGMPv2和IGMPv3。 所有IGMP版本都支持ASM模型。IGMPv3可以直接应用于SSM模型,而IGMPv1和IGMPv2则需要SSM Mapping技术的支持。 |
协议无关组播PIM(Protocol Independent Multicast) |
PIM作为一种IPv4网络中的组播路由协议,主要用于将网络中的组播数据流发送到有组播数据请求的组成员所连接的组播设备上,从而实现组播数据的路由查找与转发。 PIM协议包括PIM-SM(Protocol Independent Multicast Sparse Mode)协议无关组播-稀疏模式和PIM-DM(Protocol Independent Multicast Dense Mode)协议无关组播-密集模式。PIM-SM适合规模较大、组成员相对比较分散的网络;PIM-DM适合规模较小、组播组成员相对比较集中的网络。 |
在PIM-DM模式下不需要区分ASM模型和SSM模型。 在PIM-SM模式下根据数据和协议报文中的组播地址区分ASM模型和SSM模型:
|
组播源发现协议MSDP(Multicast Source Discovery Protocol) |
MSDP是为了解决多个PIM-SM域之间的互连的一种域间组播协议,用来发现其他PIM-SM域内的组播源信息,将远端域内的活动信源信息传递给本地域内的接收者,从而实现组播报文的跨域转发。 |
只有PIM-SM使用ASM模型时,才需要使用MSDP。 |
组播边界网关协议MBGP(MultiProtocol Border Gateway Protocol) |
MBGP实现了跨AS域的组播转发。适用于组播源与组播接收者在不同AS域的场景。 |
- |
IGMP Snooping |
IGMP Snooping功能可以使路由器工作在二层时,通过侦听上游的三层设备和用户主机之间发送的IGMP报文来建立组播数据报文的二层转发表,管理和控制组播数据报文的转发,进而有效抑制组播数据在二层网络中扩散。 |
与IGMP对应,IGMP Snooping就是IGMP协议在二层设备中的延伸协议,可以通过配置IGMP Snooping的版本使路由器可以处理不同IGMP版本的报文。 |
1.2.5 IPv6组播协议
IPv6网络中使用的组播协议如表1-9所示。
协议 |
功能 |
备注 |
---|---|---|
组播侦听者发现协议MLD(Multicast Listener Discovery) |
MLD是负责IPv6组播成员管理的协议,运行在组播网络中的最后一段,即三层组播设备与用户主机相连的网段内。MLD协议在主机端实现组播组成员加入与离开,在三层设备上实现组成员关系的维护与管理,同时支持与组播路由协议的信息交互。 |
到目前为止,MLD有两个版本:MLDv1和MLDv2。 MLDv2版本可以直接应用于SSM模型,而MLDv1则需要通过使用SSM Mapping机制来支持SSM模型。 MLD可以理解为IGMP的IPv6版本。两者的实现方式具有类比性,如MLDv1可以类比IGMPv2,MLDv2可以类比IGMPv3。 |
PIM(IPv6) |
PIM(IPv6)作为一种IPv6网络中的组播路由协议,主要用于将网络中的组播数据流引入到有组播数据请求的组成员所连接的路由器上,从而实现组播数据流的路由查找与转发。 PIM(IPv6)协议包括PIM-SM(IPv6)和PIM-DM(IPv6)两种模式。PIM-SM(IPv6)适合规模较大、组成员相对比较分散的网络;PIM-DM(IPv6)适合规模较小、组播组成员相对比较集中的网络。 |
在PIM-DM(IPv6)模式下不需要区分ASM模型和SSM模型。 在PIM-SM(IPv6)模式下根据数据和协议报文中的组播地址区分ASM模型和SSM模型:
|
MLD Snooping |
MLD Snooping功能可以使路由器工作在二层时,通过侦听上游的三层设备和用户主机之间发送的MLD报文来建立组播数据报文的IPv6二层转发表,管理和控制组播数据报文的转发,进而有效抑制组播数据在二层网络中扩散。 |
MLD Snooping可以理解为IGMP Snooping的IPv6版本。 |
1.3 应用场景
介绍IP组播的应用场景。
1.3.1 在IPv4网络中部署组播
本节介绍IPv4网络中几个典型的组播业务场景以及组播协议和特性在这些场景中的应用位置。
注意:
请务必根据网络实际情况和具体的业务需求,有针对性的定制配置方案。本节仅介绍基本业务功能的部署。
说明:
部署IPv4组播业务前,首先确保网络中IPv4单播路由正常。
单PIM域内组播
在一个小型网络中,所有的设备和主机都在一个PIM组播域内,此时的组播业务基本部署如图1-7所示。
部署协议 |
应用位置 |
目的 |
---|---|---|
PIM (必选) |
组播域内三层组播设备的所有接口,包括RouterA、RouterB、RouterC的所有接口。 具体配置请参见4 PIM(IPv4)配置。 |
将组播数据流从组播源Source发送到与有组播需求的用户相连的RouterB和RouterC上。 |
IGMP (必选) |
三层组播设备与用户连接侧接口,包括RouterB、RouterC的用户侧接口。 具体配置请参见2 IGMP配置。 |
实现组播组成员加入与离开组播组,RouterB和RouterC维护与管理组成员。 |
IGMP Snooping (可选) |
三层组播设备与用户主机之间的SwitchA的VLAN内。 具体配置请参见9 IGMP Snooping配置。 |
IGMP Snooping通过侦听RouterB和HostA之间发送的IGMP报文建立组播数据报文的二层转发表,从而管理和控制组播数据报文在二层网络中的转发。 |
跨PIM-SM域组播
为了便于控制和管理组播资源(组播组、组播源和组播成员),需要对组播资源在域间进行隔离,从而形成一个个隔离的PIM-SM域。如果不同的PIM-SM域之间需要组播数据互通,就要部署MSDP协议,如图1-8所示。
说明:
PIM-SM模式在使用SSM模型的情况下不需要使用MSDP协议。
部署协议 |
应用位置 |
目的 |
---|---|---|
PIM-SM (必选) |
各PIM-SM域内三层组播设备的所有接口,包括RouterA~RouterF的所有接口。 具体配置请参见4.7.2 配置PIM-SM(IPv4)。 |
将组播数据流从组播源Source1和Source2发送到与有组播需求的用户相连的RouterF上。PIM-SM采用接收者Host主动加入组播组、然后组播数据通过汇聚点RP发送信息到接收者的方式完成组播传输。 |
IGMP (必选) |
各PIM-SM域内三层组播设备与用户连接侧接口,即RouterF的用户侧接口。 具体配置请参见2 IGMP配置。 |
实现组播组成员加入与离开组播组,RouterF维护与管理组成员。 |
MSDP (必选) |
需要互连的各个PIM-SM域中的汇聚点RP,包括RouterC和RouterD。 具体配置请参见6 MSDP配置。 |
实现组播源信息在PIM-SM1和PIM-SM2域间传递,PIM-SM2中的Host可以接收到Source1的数据。 |
IGMP Snooping (可选) |
三层组播设备与用户主机之间的SwitchA的VLAN内。 具体配置请参见9 IGMP Snooping配置。 |
IGMP Snooping通过侦听RouterF和Host之间发送的IGMP报文建立组播数据报文的二层转发表,从而管理和控制组播数据报文在二层网络中的转发。 |
跨AS域组播
说明:
跨AS域部署MBGP协议前,首先部署AS域间的BGP功能。
部署协议 |
应用位置 |
目的 |
---|---|---|
PIM-SM (必选) |
各PIM-SM域内三层组播设备的所有接口,包括RouterA~RouterH的所有接口。 具体配置请参见4.7.2 配置PIM-SM(IPv4)。 |
将组播数据流从组播源Source1和Source2发送到与有组播需求的用户相连的RouterB和RouterH上。PIM-SM采用接收者Host主动加入组播组、然后组播数据通过汇聚点RP发送信息到接收者的方式完成组播传输。 |
IGMP (必选) |
各PIM-SM域内三层组播设备与用户连接侧接口,包括RouterB和RouterH的用户侧接口。 具体配置请参见2 IGMP配置。 |
实现组播组成员加入与离开组播组,RouterB和RouterH维护与管理组成员。 |
MBGP (必选) |
需要互联的各个AS域中的边缘组播设备,包括RouterA和RouterF。 具体配置请参见配置MP-BGP。 |
实现组播源Source1和Source2与组播接收者跨AS域通过独立于单播路由表的组播路由表进行数据传输。 |
MSDP (必选) |
需要互连的各个PIM-SM域中的RP,包括RouterA、RouterD、RouterF。 具体配置请参见6 MSDP配置。 |
实现组播源信息在PIM-SM1、PIM-SM2和PIM-SM3域间传递。 |
1.3.2 在IPv6网络中部署组播
本节介绍IPv6网络中典型的组播业务场景以及组播协议的应用位置。
注意:
请务必根据网络实际情况和具体的业务需求,有针对性的定制配置方案。本节仅介绍基本业务功能的部署。
说明:
部署IPv6组播业务前,首先确保网络中IPv6单播路由正常。
部署协议 |
应用位置 |
目的 |
---|---|---|
PIM(IPv6) (必选) |
在组播域内三层组播设备的所有接口,包括RouterA、RouterB、RouterC的所有接口。 具体配置请参见5 PIM(IPv6)配置。 |
将组播数据流从组播源Source发送到与有组播需求的用户相连的RouterB和RouterC上。 |
MLD (必选) |
在三层组播设备与用户连接侧的接口,包括RouterB和RouterC的用户侧接口。 具体配置请参见3 MLD配置。 |
实现组播组成员加入与离开组播组,RouterB和RouterC维护与管理组成员。 |
MLD Snooping (可选) |
在三层组播设备和用户主机之间的二层设备SwitchA上。 具体配置请参见10 MLD Snooping配置。 |
MLD Snooping通过侦听RouterB和HostA之间发送的MLD报文建立组播数据报文的二层转发表,从而管理和控制组播数据报文在二层网络中的转发。 |
1 IGMP 协议
IGMP用来动态的将各个主机注册到特定局域网中的一个组播组中。主机向本地的组播路由器发送IGMP消息来表明自己所属的组播组。在IGMP协议中,路由器侦听IGMP消息并周期的发出查询,以发现某个子网上哪些组是活动的,哪些是不活动的。
IGMP消息在IP数据报内发送,用IP协议号2来标识。同时,将IP存活时间(TTL)字段值设定为1,因此IGMP信息处于本地范围本子网内传送并且不会被路由器转发。
1989年,IGMP版本1(RFClll2)第一次详细定义了IGMP规范。后来施乐公司对最早的IGMP版本1进行了大幅更新,产生了IGMP版本2(RFC2236)。到目前为止IGMP版本3规范己经称为IETF正式标准(RFC3376),通用的是IGMPv2。IGMPvl实现简单,但是有离开延迟过大和选择查询路由器需要依赖组播路由协议的缺点,IGMPv2对此进行了改进。IGMPv3协议的主要目的是支持源特定组播,并进一步对IGMPv2进行完善。
1.1 IGMPv1协议
1.1.1 IGMPv1的工作原理
在IGMPvl中定义了基本规则、组成员查询机制和报告机制。当某接收主机希望接收到某个组播组的数据时,它会向本地链路上的查询路由器发送加入消息,通知查询路由器本机希望申请加入的组播组;查询路由器收到加入消息之后,把这条消息加入到查询路由器所维护的状态列表,同时向源发起建立组播分发树的请求;查询路由器在设定的周期内发起组成员查询消息;接收主机收到查询消息之后,会向查询路由器发送报告消息来应答查询,否则查询路由器会认为不存在接受主机;主机如果想离开某个组播组,就对路由器的查询保持沉默,经过一定时间,路由器便知道子网内没有组成员了。
1.1.2 IGMPv1报文格式
IGMPvl报文格式如图2-4所示,
图2-4 IGMPv1报文格式
其主要内容包括:
(1) 版本字段表示IGMP协议的版本号,在IGMP中置为1.
(2) 类型字段,在IGMPv1中,只有两个值:
取值为0x11,表示该报文为成员关系查询(Membership Query),主要是由路由器使用。
取值为0x12,表示该报文为成员关系报告(Membership Report),主要是主机使用。
(3) 校验和字段用于数据报文的校验。
(4) 组地址字段。当用于成员关系查询时,本字段置为0,并被主机忽略;当用于成员关系报告时,本字段包含组播组地址。
IGMPv1报文在网络中传输完整的报文格式如图2-5:
图2-5 在网络中传输的IGMPv1报文
1.1.3 IGMPv1工作过程
在IGMPv1中,路由器利用查询一响应过程来确定在本地子网中是否有加入某个组播组的主机存在,如果有,则这台路由器就要完成向本子网组播数据包的功能;如果没有,则这台路由器就不必向此子网转发组播包。路由器周期性地向子网上的所有主机发送组播成员关系查询报文,希望加入某个组播组的主机就响应该查询,发送一个组播成员关系报告报文到子网上,在IGMP报文的组地址地段中加入想要加入的组播组的地址。路由器接收到来自主机的成员关系报告报文后,就知道了在该子网上有主机要加入组播组,组播组地址在报文中可以获得,接下来,路由器就会根据所使用的路由协议建立起相应的转发状态。
当一个子网上有多台主机想加入同一个组播组时,就可以利用报告响应抑制功能,来减少子网中的重复信息传递。处理流程如下:
主机接收到IGMP成员关系查询报文后,对加入的每个组播组启动一个倒数计时器。当计时器的值为0时,主机发送IGMP成员关系报告报文,通知路由器子网内仍有处于活动状态的组播接收者。当计时器到达0之前,若主机接收到来自其他主机发送的同一组成员关系报告报文,那么它就停止与该计时器得到的数,重新计时,这样,就避免了发送同一个成员关系报告报文给路由器。
如果在一个子网中有多个组播路由器,那么多个路由器都发送IGMP查询报文是一种浪费,所以应当确定一个路由器作为查询路由器就可以了。但是在IGMPv1中,没有提供选举查询路由器的机制,而是把这一任务留给了组播路由协议。由于不同的协议使用不同的选举机制,会造成在一个子网中出现多个查询路由器,这也是IGMPv1的缺点之一。
但是IGMPv1的另一个缺点是缺乏显式的离开方式。当一台主机想要离开一个组播组时,并不显式地表示出来,而只是不再对路由器的查询报文进行响应。当一个网段内某个组播组的最后一个成员退出后,路由器还会继续组播这个组的数据,直到一段时间内路由器接收不到任何来自该组的成员响应,才会知道该组已经没有接收者了,然后停止转发该组的组播数据报文。因此,路由器中需要为子网中的每一个组维护一个计时器。当路由器接收到某台主机发送的报告报文时,就会将该组的计时器清零;当某个组的计时器超时后,就说明在本网段上已经没有接收者,于是停止转发该组报文。
下面是工作过程图解:
1) 组成员加入
图2-6 IGMPv1组成员加入
2) 查询与响应
图2-7 IGMPv1组成员查询
3) 响应抑制机制
图2-8 IGMPv1响应抑制机制
4) 组成员离开
图2-9 IGMPv1组成员离开
1.2 IGMPv2协议
1.2.1 IGMPv2的工作原理
IGMPv1的主要缺点是离开延迟过大和选择查询路由器需要依赖组播路由协议进行。针对这些缺点,IGMPv2做了相关的改进。在IGMPv2中,增加了离开组的报文格式,当主机想要离开某个组播组时,不必等待路由器发出查询报文,而是可以直接向路由器发送成员关系报告报文,这样可以有效地缩短离开延迟。另外在IGMPv2中,还明确了查询路由器的选举机制。除此之外,IGMPv2的工作原理与IGMPv1基本一致
1.2.2 IGMPv2的报文格式
IGMPv2的报文格式如图2-10所示:
图2-10 IGMPv2报文格式
它在IGMPvl的基础上,进行了两处改动:一个是将v1的版本字段和类型字段进行了合并;另一个是增加了最大响应时间字段 (MaxResponseTime)。其主要内容如下:
(1)类型字段,在兼容IGMPv1的基础上,IGMPv2中新增了两种报文类型。
·0xll:成员关系查询。与IGMPv1不同,IGMPv2的查询分为两种类型:①通用查询 (GeneralQuery),组地址字段置为全0,对所有的组进行组成员查询;②特定组查询 (GrouPpecificQuery),针对特定组进行组成员查询,组地址字段置为特定组的地址。
·0x12:IGMPv1成员关系报告(为了向后兼容IGMPv1)。
·0x16:IGMPv2成员关系报告。
·0xl7:离开组。
(2)最大响应时间字段,只有在成员关系查询报文中有效,主机必须在最大响应时间到达之前发出成员关系报告报文。通过该值,路由器可以调节组成员的离开延迟。
(3)校验和字段,与IGMPv1中的一样。
(4)组地址地段,与IGMPv1中的基本一样,当采用特定组查询时,该字段存放要查询的组播组的地址。
IGMPv2报文在网络中传输完整的报文格式如图2-11:
图2-11 在网络中传输的IGMPv2报文格式
1.2.3 IGMPv2工作过程
查询一响应过程与IGMPv1基本相同,但是有两点改进:①增加了特定组查询,特定组查询的目的是为了让路由器知道一个特定组在子网内是否还有组成员,以便判断是否还需要转发该组的数据报文;②IGMPv2的成员关系报告的类型代码不一样。
IGMPv2的组成员加入与 IGMPv1中的完全一样。IGMPv2离开过程与IGMPv1相比有了较大的改进。主机离开一个组时,需要显式地发送一个离开报文给路由器。其过程如下:
要离开的主机发送一个离开报文给子网上所有路由器(目的地址224.0.0.2),查询路由器接收到离开报文后,会立即发送一个特定组查询到子网上。如果子网上还有该组的成员,则会发回一个响应报文;如果子网上己经没有该组的成员,则没有主机回应,于是路由器就知道己经没有该组成员了,就停止转发该组的数据。
在IGMPv1中,选择查询路由器依赖于组播路由协议;而在IGMPv2中,明确了选择查询路由器的机制。其过程如下:
开始时,子网上的每个路由器都假定自己就是查询路由器,发送一个通用查询报文给所有主机(目的地址224.0.0.1)。每个路由器都可以接收到来自其他路由器的报文,然后进行IP地址的比较,具有最低IP地址的路由器就成为查询路由器;非查询路由器启动一个计时器,无论何时接收到来自当选的查询路由器的通用查询报文,就将计时器复位。如果计时器超时,就认为当选的查询路由器发生故障,转向开始重新选择。计时器的取值一般为查询间隔的2倍
图解工作过程如下:
1)组成员加入
图2-12 IGMPv2组成员加入
2)查询与响应
图2-13 IGMPv2组成员查询与响应
3)查询器选举
图2-14 IGMPv2查询路由器选择
4)成员离开
图2-15 IGMPv2组成员离开
1.3 IGMPv3协议
1.3.1 IGMPv3的工作原理
IGMPv3的提出,主要是为了配合源特定组播的实现,即组播组成员可以指定接收或指定不接收某些组播源的报文。这样主机就可以有选择性接收来自某个特定组播源的数据包,而不是被动接收该组中所有组播源的数据包。IGMPv3的这一特性,可以实现源特定组播SSM技术。源特定组播(Source Specific Multicast,SSM)是一种区别于传统组播的新的业务模型,SSM保留了传统PIM-SM模式中的主机显式加入组播组的高效性,但是跳过了PIM-SM模式中的共享树和RP规程。SSM直接建立由(S,G)标志的一个组播最短路径树。SSM的一个(S,G)对也被称为一个频道(Channel)。PIM-SSM是对传统PIM协议的扩展,使用SSM,用户能直接从组播源接收组播报文,需要汇聚点(RP)的帮助。
IGMPv3在IGMPvl/v2的基础上提供了额外的源过滤组播功能(Source FilteredMulticast,SFM)。在IGMPvl/v2中,主机只根据组地址来决定加入某个组,并从任何一个源接收发给该组地址的报文。具有源过滤组播功能(SFM)的主机使用IGMPv3来表示主机所希望加入的组播组,同时还表示该主机所希望接收的组播源的地址。主机可以使用一个包括列表(Inclusion List)或一个排除列表 (Exclusion List)来表示对源地址的限制。即组播组成员可以指定接收或指定不接收某些组播源的报文。这样主机就可以有选择性接收来自某个特定组播源的数据包,而不是被动接收该组中所有组播源的数据包。
1.3.2 IGMPv3的报文格式
IGMPv3的报文类型有以下几种:
0xll:成员关系查询报文 (MembershipQeury)。
0x22:版本3成员关系报告报文(version 3 Membership Report)
0x12:版本1成员关系报告报文(version 1 Membership Report)
0x16:版本2成员关系报告报文 (version 2 Membership Report)
0x17:版本2离开报文 (version 2 LeaveGroup)。
报文类型的值填写在报文中的类型字段。在IGMPv3中,查询报文和报告报文格式有较大差异,需要分别描述。图2-16为查询报文的格式
图2-16 IGMPv3查询信息格式
(1)类型字段,设置为0xll,代表该报文为查询报文。
(2)最大响应时间字段,指明了主机发出响应的最长时间。
(3)组地址字段,功能与IGMPv2一样,可以用于通用查询和组特定查询。
(4)s字段,置为1时,其他路由器不对该报文进行处理。
(5)QRV字段,查询路由器的健壮值(Querier’s RobustnessVariable),该值影响计时器和重试次数的取值。
(6)QQIC字段,查询路由器的查询间隔码(Querier’s QueryIntervalCode),该值影响查询路由器的查询间隔时间,非查询路由器按照此值更新自己的缺省值。
(7)源地址数目字段,该值表在这个报文中包含了多少个源地址。当进行通用查询(GeneraQuery)或者组特定查询 (GroupSpecific Query)时,该值置为0;当进行特定组和源查询 (Group Source pecific Query,用于PIM一SSM)时,该值为源特定地址的数目。虽然该值最大可为65536,但是实际上受限于数据链路层的MTU,例如在以太网上,1P数据报最长为1500字节,除去IP报头的24字节和IGMP报头的12字节,剩余1464字节,所以最多包含366(1464/4)个源地址。
(8)源地址地段。
IGMPv3查询信息报文在网络中传输完整的报文格式如图2-17:
图2-17 在网络中传输的IGMPv3查询报文格式
IGMPv3报告报文的格式较为复杂,如图2-18所示。
图2-18 IGMPv3侦听者报告格式
(1)类型字段,置为0x22,表示该报文为IGMPv3报告报文。
(2)组记录数目字段,表示此报文中包含的组记录数目。
(3)组记录字段。包含若干个组记录,每个组记录长度不固定,其内容如图2-19:
图2-19 IGMPv3组记录格式
①组记录类型字段,表示该组记录中包含的数据的类型,目前定义了六种类
型,分别是:
·MODE IS INCLUDE。表示该主机的过滤模式为INCLUDE.也就是说,后面列出的地址都是主机想要接收的组播源地址。
·MODE IS EXCLUDE。表示该主机的过滤模式为EXCLUDE,也就是说,后面列
出的地址都是主机想要拒绝的组播源地址。
·CHANGE TO INCLUDEMODE。表示该主机的过滤模式从EXCLUDE切换为INCLUDE模式。
·CHANGE TO EXCLUDEMODE。表示该主机的过滤模式从INCLUDE切换为EXCLUDE模式。
·ALLOW NEW SOURCES。表示该主机中新增的想要接收的源地址。
·BLOCK OLD SOURCES。表示从该主机中删除的不想接收的源地址。
②辅助数据长度字段,在组记录的最后,可以增加以4字节为单位的辅助数据,如果没有辅助数据,则置为0。
③源地址数目字段,表示该记录中包含了多少个组播源地址。
④组地址字段,与源地址共同表示特定源组播。
⑤源地址字段,每个长度为32bits。标志源地址,数目由源地址数目字段表示。
⑥辅助数据字段。为将来的应用预留,在IGMPv3中并不需要。一台主机在发送报告报文的时候,应当把自己的源IP地址包含在IP数据报中,当主机还没有获得IP地址的时候,可以使用0.0.0.0作为源IP地址,支持IGMPv3的路由器必须接收来自0.0.0.0的数据报。主机的IGMP报文的目的地址标志为224.0.0.22,代表子网中所有支持IGMPv3的路由器。
1.3.3 IGMPv3的主要改进
IGMPv3除了支持原特定组播外,其工作原理与IGMPv2相比,并没有本质的改变,只是在某些地方做了改进和优化。以下列出了IGMPv3的主要特点和改进:
①支持源特定组播SSM;
②向后兼容IGMPvl和IGMPv2;
③主机可以定义要接收的组播源地址;
④非查询路由器可以与查询路由器保持参数值同步;
⑤最大响应时问从25.5s增加到53min,适合于较大的网络;
⑥辅助数据字段为将来的应用预留了空间;
⑦关系成员报告报文发送给目的地址224.0.0.22,可以帮助二层交换机更有效地实现IGMP监听 (IGMPSnooping)功能;
⑧报告报文中可以包含多个组记录,可以有效地减少网络通信量;
⑨在IGMPv3中,取消了前面版本中的响应抑制功能,主要原因是:
第一,使用响应抑制时,路由器只知道子网上是否有组成员,而不知道有几个组成员,以及成员是哪些主机:取消响应抑制,路由器就可以记录每一个组成员的信息,可以开发一记账等增值服务功能。
第二,许多网桥或者二层/三层交换机在实现IGMP监听功能时,为了避免响应抑制,一般不转发网段问的IGMP报文。取消了响应抑制后,可以简化这些设备的设计。
第三,取消响应抑制后,主机不必处理来自其他主机的报文,简化了主机的实现。在查询报文中,增加S标志位,可以提高系统的健壮性。
IGMPv3报告报文在网络中传输完整的报文格式如图2-20:
图2-20 在网络中传输的IGMPv3报告报文
2 MLD协议
IPv6的组管理协议被称为MLD(组播监听者发现)。1999年,MLD版本l(RFC2710)被IETF发布。2004年,MLD版本2(RFC3810)标准出台,后一个版本可以向前一个兼容。MLD协议是专门针对基于IPv6的组播组管理协议。因为MLD使用全新的ICMPv6的报文格式,所以MLD协议就是ICMPv6协议的一个子集。MLD消息使用链路本地IPv6源地址发送,其跳数被限制为1。MLD消息的封装格式如图2-21所示:
图2-21 MLD消息封装格式
以下分别描述MLD协议的两个版本以及MLDSnooping,其中对于MLDSnooping的详细描述见第三章。
2.1 MLDv1协议
2.1.1 MLDv1的工作原理
MLDvl协议是从IGMPv2协议中派生出来的,其运行机制和IGMPv2协议相同,专门用于IPv6组播群组的管理,其主要是应用于ASM模式组播路由协议的组管理工作。
对于运行MLD协议的路由器,其接口要监听由IPv6组播地址产生的所有链路组播地址。路由器为它所在的每一条链路维护一个列表。表项有此链路中存在的组成员的组播地址,以及该地址相应的定时器。路由器周期性地发送通用请求 (general query),以查询该链路上是否存在某组播地址的组成员。节点收到路由器发送的常规请求后,经过随机时延后发出组播监听报告。这样是为了防止所有的节点都在同一时间发出报告分组,从而造成网络的突发性阻塞。当路由器收到链路上的报告分组时,如果报告地址不在路由器的列表上,则加入该项,否则计时器重新置位。如果某个地址的计时器过期,则从列表中删除。当节点要加入一个组播组时,主动发送组播监听报告,向路由器报告组成员的存在。节点退出组播组时,发送完成分组,删除有关路径。当请求状态的路由器从链路上接收到一个完成消息,如果消息中的组播地址在路由器的列表上,路由器发送一个特定组播地址查询。如果一段时延后没有报告分组,则认为该组播地址在此链路上没有组成员了。
2.1.2 MLDv1报文格式
MLDv1的报文格式如图2-22所示:
图2-22 MLDv1报文格式
(1)类型字段,MLDvl有如下三种报文类型:
·组播侦听查询消息(Type=130),分为两种类型:①通用查询(GeneralQuery),组地址字段置为全0,对所有的组进行组成员查询;②特定组查询(Group Pecific Query),用于判断一个特定的组播地址在本地链路上是否有组播侦听者。
·组播侦听报告消息(Type = 131)
·组播侦听完成消息(Type = 132)
(2)编码字段,初始值为0。
(3)校验和字段。
(4)最大响应时间字段,只有在组播监听者查询报文中有效,主机必须在最大响应时间到达之前发出成员关系报告报文。通过该值,路由器可以调节组成员的离开延迟。
(5)组地址字段,在通用组查询中,置为0;在特定组查询时,该字段存放要查询的组播组的地址。在报告和完成报文中,分别用于存放主机要加入和离开的组地址。
MLDv1报文在网络中传输完整的报文格式如图2-23:
图2-23 在网络中传输的MLDv1报文
以上这些查询消息和应答消息报文有三种不同的报文交互方式:
第一种交互方式是由路由器发起的。路由器作为询问者向与其相连接的所有主机发送一个一般查询消息报文。其目的地址是FF02::1。主机收到此消息后,应答一个包含当前组播地址状态记录的报文消息,此报文告诉路由器此主机希望接收哪个组播组或者哪些源发来的数据。
第二种交互方式是由主机发起的。当一个主机离开一个组播组时,它就要向路由器发送组播侦听者完成消息,该消息包括一个状态改变一记录。路由器收到此消息后,向其相连的链路上发送一个特定组播地址查询,询问是否还有主机加人了此特定的组。
第三种交互方式是由路由器发起的。如果在路由器的组播地址表中某一个组播地址的相关定时器超时后,仍然没有收到主机发来的包含状态变化记录的组播侦听者报告消息,路由器则向所有主机发送一个特定组查询消息,确认该组播组是否还有组播侦听者。
2.1.3 MLDv1工作流程
当一个网段内连接有多台路由器运行MLDvl协议时,必须选举一台路由器作为查询路由器,其余的自然成为非查询路由器。选举的机制是:地址最小的路由器当选。非查询路由器中有一个其他查询路由器存在计时器,当该计时器到期仍没有收到来自查询路由器的报文,则认为该查询路由器失效,重新开始新的选举。
路由器定期向子网内所有的主机广播查询报文(目的地址为FF02::1),目的是获得主机的报告报文。在路由器刚开始工作时,会快速连续地发送查询报文,以便尽快搜集到子网内的组成员信息。
当主机接收到一个查询报文后,就为每一个要接收的组地址启动一个延迟定时器。定时器的值在[0,最大响应时间]之间取一个随机数。如果查询报文中的最大响应时间字段被置为0,则定时器立刻到期。定时器到期后,主机会发送一个报告报文给路由器,通知路由器主机想接收的组播组地址。
如果一台主机在定时器还未到期时,就收到其它主机通告路由器的报告报文,则读取该报文的组地址,如果和自己需要通告的组地址相同,则立刻停止相应的定时器,并不再发送关于该组地址的报告报文,这样就可以避免多台主机发送相同内容的报告报文给路由器,这种机制称为“响应抑制”。路由器收到来自主机的报告报文后,查看其中的组地址,如果该地址未在路由器的组地址列表中,则将其添加到组地址列表中,同时为其启动一个相应的定时器;如果该地址已经在路由器的组地址列表中,则将相应的定时器恢复最大值。如果一个组地址的定时器到期了,则说明该组地址在子网内已经没有接收者了,路由器会将此组地址从列表中删除。
当一台主机想要加入某个组播组时,可以不必等待路由器的查询报文,而是直接向路由器发送报告报文。为了保障该报文的可靠性,一般会进行重传。当一台主机想要离开某个组播组时,必须发送一个离开报文给子网内的路由器。路由器收到离开报文后,会首先查看该组地址是否在组地址列表中,如果在,则发送一个特定组地址查询给子网内的所有主机。在一定的时间内,路由器收不到来自主机的应答,则会认为该组已经没有接收者,于是将该组地址从列表中删除。非查询路由器会忽略所有的离开报文。
2.2 MLDv2协议
MLDv2从IGMPv3中发展过来,和MLDvl相比,增加了IGMPv3所具有的源过滤功能,不仅能够支持ASM模式组播路由协议,而且还能够支持基于IPv6的SSM模式组播路由协议。
MLDv2在MLDv1的基础上添加了源组播 (Source Specific Multieast)的概念,主机可以组播源报告(Group-Source Report)报告感兴趣的源,路由器则只转发该链路上所有组成员感兴趣的源所发送的报文。当主机想退出某组播源时,主机发送离开组播源报告(Group-Source Leave),查询者在接收到该报告后可以发送指定组播源请求,确认是否仍有组成员关心该组播源。MLDv2支持源过滤 (SourceFiltering),因此比MLDvl具备更高的可管理性和安全性。此外MLDv2还可以与MLDvl兼容。
2.2.1 工作原理
MLD协议的目的是使每一个组播路由器知道在本地链路上监听者对哪些组播地址和源地址感兴趣。被MLD收集到的信息提供给在路由器上运行的任何组播路由协议,来保证组播数据包被传递到组播组成员。组播路由器只需要知道在一个链路上,至少有一个节点正在监听从一个特定的源发给一个特定组播地址的数据包,它不需要知道有多少个这样的节点。
MLDv2是一个不对称的协议,它包括分离的两部分:针对组播地址侦听者部分(监听组播数据包的主机或者路由器)和组播路由器部分。它为组播地址侦听者和组播路由器定义了不同的行为。当执行“组播路由器”功能时,收集组播路由协议所需要的组播侦听者信息;当执行“组播地址侦听者”功能时,通知本身和其他邻居组播路由器他的侦听状态。需要注意的是,一个组播路由器可以本身是一个或者多个组播地址的侦听者,执行“组播路由器”和“组播地址侦听者”双重功能。
组播地址监听者在所有的支持组播的接口上执行MLDv2协议的“组播地址监听者”功能。
组播路由器在它的每一个接口上执行MLDv2协议的“组播路由器”功能。如果在同一个子网上具有不止一个组播路由器,组播路由器将运行查询者选举机制来选择一个组播路由器来充当查询路由器。在这个子网上的所有的组播路由器都在监听由组播地址监听者发送的消息,并且维护相同的组播监听信息状态,以便于当目前的查询路由器不能工作时,接替查询路由器的工作,但是只有查询路由器在子网上能够发送周期的消息和被触发的查询消息。
2.2.2 MLDv2报文格式
为了支持以上的功能,MLDv2除了兼容支持MLDvl所有的三种报文:组播侦听查询(MLD消息类型值为130),包括一般查询和特定组播地址查询:组播侦听报告(MLD消息类型值为131);组播侦听完成(MLD消息类型值为 132)外,还增加了MLDv2查询消息(一般的查询、特定组播地址查询,特定组播地址和源查询)和“侦听者报告”报文。“侦听者报告”报文是向邻居路由器报告当前的组播侦听状态,或者声明侦听状态变化情况。
综上,MLDv2消息中的所有消息如下:
n 两种类型的MLDv2消息:
l 组播侦听查询(类型值=130)
l Version 2组播侦听报告(类型值=143)
n 为保证和MLDvl的兼容,MLDv2还要支持以下两种消息:
l Versionl组播侦听报告(类型值=131)[RFC2710]
l versionl组播侦听完成(类型值=132)[RFC2710]
以下详细介绍两种类型的MLDv2消息内容。
a) MLDv2侦听查询消息
组播侦听查询消息是在请求状态的路由器发出来的,它用来查询邻居接口的侦听状态。它的消息格式如图2-24所示:
图2-24 MLDv2侦听查询消息
(1)编码
被发送者初始化为0,接收者被忽略。
(2)校验和
标准的ICMPv6校验和;算它,它需要计算整个消息,包括IPv6的伪造报头。为了计算它,首先把它设置为0。收到包后,要先验证后处理。
(3)最大响应延迟
最大响应延迟编码域指定了在发送响应报告的允许的最大延迟。实际时间叫做最大响应延迟,单位为毫秒。它们之间编码方式如下:
l 如果最大响应延迟编码<32768,则最大响应延迟=最大响应延迟编码。
l 如果最大响应延迟编码>=32768,则最大响应延迟编码构成如图2-25所示:
图2-25 最大响应延迟编码构成图
而且最大响应延迟=(mant| 0x1000) << (exp+3)。
值比较小的最大响应延迟允许MLDv2路由器调整“离开潜伏期”(链路上最后一个节点停止侦听某个特定的组播地址到路由协议认为对于这个地址没有侦听者的时间)。值比较大的最大响应延迟,尤其是编码的那些,是用来调整在链路上的爆炸性的MLD消息的传输。
(4)预留
被发送者初始化为0,被接收者忽略。
(5)组播地址
对于一般的查询消息,组播地址为0。对于特定组地址或者特定组地址和源的查询消息来说,组播地址被设置成需要查询的地址。
(6)S Flag(抑制路由器端的处理)
如果设置成1,则表示对于所有接收在收到查询消息时抑制计时器更新。不过,并不抑制选举查询者和主机端对一类查询消息的处理,这类查询是路由器请求实现组播侦听者的功能。
(7)QRV(查询者活跃变量)
如果非0,那么查询者活跃变量域包含查询者使用的活跃变量值。如果活跃变量大于7(查询者活跃变量域的最大值),查询者活跃变量域被设置为0。
路由器把近期收到的查询消息中的查询者活跃变量值设置为自己的活跃变量值,除非近期收到的查询消息中多数的查询者活跃变量值都为0。在多数的查询者活跃变量值都为0的清况时,就使用缺省值,或者静态配置特定的值。
(8)QQIC(查询者查询间隔编码)
查询者查询间隔编码域指定了查询者使用的查询间隔。实际间隔被叫作查询者查询间隔(QQI),它是以秒为单位的。它们之间的转换如下:
l 如果QQIC<128,那么QQI=QQIC。
l 如果QQIC>=128,则查询者查询间隔编码构成如图2-26所示:
图2-26 查询者查询间隔编码构成图
而且QQI = (mant | 0x10) << (exp+ 3)。
不是当前查询者的组播路由器把最新收到的查询消息中的QQI值作为自己的查询间隔时间,除非近期收到的查询消息中多数的QQI值都为0。在都为0情况时,就使用缺省值
(9)源个数(N)
源个数(N)指出在当前处在查询的源地址的个数。在一般查询消息或者特定组播地址的查询消息中源个数都为0,在特定源和组地址的查询消息中不为0。源个数的大小由链路上可传输的最大报文决定。例如,在Ethernet上,可传输的最大报文是1500字节,携带路由警报选项的8字节的Hop-By-Hop扩展头和40字节的IPv6头一共48字节;源个数域前的MLD头共28字节,这样留给源个数域的有1424字节,所以源个数最大为89(1424/16)。
(10)源地址[i]
源地址[i]域是指向n的单播地址,n既是源个数域中的值。
(11)附加数据区
如果收到的查询消息中的IPv6头的负载长度域指定了需要有附加数据存在时,执行MLDv2时必须包含附加字节,用来确认收到MLD消息的校验和,否则就忽略附加字节。当发送查询消息时,一定不含附加消息。
(12)查询变量
查询消息中有三类查询变量:
l “一般查询消息”是查询路由器发出的,用来查询相连的链路上哪个组播地址有侦听者。组播地址和源个数都为0。
l “特定组地址查询消息”是查询路由器发出的,用来查询相连的链路上某个特定的组播地址是否有侦听者。在特定组地址查询消息中,包括希望查询的组地址,源个数为0。
l “特定组地址和源查询消息”是查询路由器发出的,用来查询相连的链路上某个特定的组播地址并且是来自特定的源的消息是否有侦听者。在特定组地址和源查询消息中,包括希望查询的组地址,源地址列表包含关注的源地址。
(13)查询消息源地址
所有MLDv2的查询消息的源地址为可用的IPv6链路本地地址。如果节点(路由器或主机)收到的来自不明的地址的查询消息,或者不是可用的IPv6链路本地地址时,它就丢弃这个消息,同时记录警报。
(14)查询消息目的地址
在MLDv2协议中,一般查询消息是发给链路内所有节点的地址的(FF02::1)。特定组地址查询消息和特定组地址和源查询消息都发给希望查询的组地址。同时节点必须接收和处理所有的IP目的地址是任意的单播或组播地址的查询消息,这样有利于调试。
MLDv2侦听查询报文在网络中传输完整的报文格式如图2-27:
图2-27 在网络中传输的MLDv2侦听查询报文
b) MLDv2组播侦听报告
MLDv2组播侦听报告是IP节点发送的,它可以用来向邻居报告当前的侦听状态和以身改变接口上的组播侦听状态。消息格式如图2-28所示:
图2-28MLDv2组播侦听报告报文
组地址记录的消息格式如图2-29所示:
图2-29 组地址记录的消息格式
(1) 类型字段,在MLDv2侦听报告置为143。
(2) 预留,被发送者初始化为0,被接收者忽略。
(3) 校验和
标准的ICMPv6校验和;它需要计算整个消息,包括IPv6的伪造报头。为了计算它,首先把它设置为0。收到包后,要先验证后处理。
(4) 组播地址记录个数(M)
组播地址记录个数(M)指出在当前侦听报告中的组播地址一记录的个数。
(5) 组播地址记录
组播地址记录是由来自报告发送的接口的发送者侦听每个组播地址的信息组成。具体记录如下:
① 记录类型
当前状态报告是用来在收到查询消息的接口上节点发出的消息。它报告接口对于每一个组地址的当前的侦听状态。以下两类,如表2-2所示
表2-2 当前状态报告类型
值 |
名字 |
作用 |
1 |
包括模式 |
指明在当前的接口上对于特定的组地址的过滤模式是包括模式的。相应的源地址域是对于特定的组地址的列表必须为非空。 |
2 |
排除模式 |
指明在当前的接口上对于特定的组地址的过滤模式是排除模式的。如果组地址列表为非空,则组地址域包含接口的对于特定组地址的源列表。 |
过滤模式变化报告是接点在本地的接口层对于特殊的组地址状态变化时引起的IPv6 Multicast Listen请求而发出的报告,这种报告无论源地址是否发生变化都要发送。只有状态变化的接口才发送这类的报告。以下两类,如表2-3所示:
表2-3 过滤模式变化报告
值 |
名字 |
作用 |
3 |
变为包括模式 |
指明在当前的接口上对于特定的组地址的过滤模式转变为包括模式的。如果组地址列表为非空,则组地址域包含接口的对于特定组地址的新的源列表。 |
4 |
变为排除模式 |
指明在当前的接口上对于特定的组地址的过滤模式转变为排除模式的。如果组地址列表为非空,则组地址域包含接口的对于特定组地址的新的源列表。 |
源列表改变报告是节点发出的,当源列表改变,过滤模式和组地址不改变时会触发发送此消息。以下两类,如表2-4示
表2-4 源列表改变报告
值 |
名字 |
作用 |
5 |
允许新的源 |
指明在当前组地址记录中的源地址域需要增加新的源。若是在包含模式下,则把这些源加入到列表中。若是在排除模式下,则把这些源从列表中删除。 |
6 |
阻止旧的源 |
指明在当前组地址记录中的源地址域需要删除旧的源。若是在包含模式下,则把这些源删除到列表中。若是在排除模式下,则把这些源从列表中删除加入。 |
② 附加数据长度
附加数据长度域包含在当前在侦听报告中的附加数据长度,单位是字(32bits)。如果为0,则表示没有附加数据。
③ 源个数(N)
源个数(N)指出在当前在侦听报告中的源地址记录的个数。
④ 组播地址
组播地址域包含组播侦听报告中有的组播地址。
⑤ 源地址[i]
源地址[i]域是指向n的单播地址,n既是源个数域中的值。
⑥ 辅助数据区
如果存在辅助数据区,那么它是用来补充说明组播地址报告的。在MLDv2协议中没有定义间接寻址数据,所以不需要包括辅助数据区。因此设置辅助数据区为0,收到时也忽略。留出这样一部分辅助数据区是为了以后能够扩展MLD。
MLDv2组播侦听报告报文在网络中传输完整的报文格式如图2-30:
图2-30 在网络中传输的MLDv2组播侦听报告报文
2.2.3 MLDv2工作过程
MLDv2的工作过程可以分成三部分:一是侦听者端建立“组播侦听状态”;二是侦听者端和路由器端之间交换各种报文;三是路由器端建立侦听者状态列表。
a) 建立侦听状态
侦听者根据自身的需要指定它所感兴趣的组播组和组的源地址,建立自身的侦听状态,即加入列表或排除列表,然后主动或被动通知邻居组播路由器它的侦听状态。
侦听者执行MLDv2协议的“侦听部分”的功能。无论节点上的接口是否在同一链路上.每个接口上都会执行侦听者功能。运行在侦听节点上层的协议或者应用通过“套接字组播状态”函数IPv6 Multicast Listen告知接口启用或禁用组播功能。
IPv6MuhieastListen的格式如下:
IPv6MulticastListen(套接口,接口,IPv6组播地址,过滤模式,源列表)
套接口:用来区分节点内不同的组播请求实体(如进程用程序等)。
接口:表示一个本地网络接口.通过该接口可以启用或禁用组播功能。
IPv6组播地址:表示请求加入的组播地址。如果一个接口接收多于一个组播的分组,IPv6Multicast Listen就会被每个组播单独调用。
过滤模式:过滤模式分为“INCLUDEMODE”(包含模式)和“EXCLUDEMODE”(排除模式)两种。
源列表:一个无序的地址列表,可以为空。
除了“套接字组播状态”之外,节点必须维护或计算出每个接口的组播侦听状态,称为“接口组播状态”,表示为(IPv6组播地址,过滤模式,源列表)。“接口组播状态”从“套接字组播状态”推导出来。从“套接字组播状态”导出“接口组播状态”的一般规律如下:根据具有相同接口(IPv6组播地址)的“套接字组播状态”记录,推导出一个“接口组播状态”。
(1)若有“套接字组播状态”记录处于排除模式,那么“接口组播状态”的过滤模式就是“排除模式”,且“源地址列表”等于所有“排除模式”“套接字组播状态”记录中的源地址列表的交集,减去所有“包含模式”“套接字组播状态”记录中的源地址列表。
(2)若所有“套接字组播状态”记录都是“包含模式”,那么“接口组播状态”就是“包含模式”,且“源地址列表”等于所有“套接字组播状态”记录中源地址列表的并集。
侦听者通过上述算法可以建立起自己的“接口组播状态”。当接口收到组播分组之后,就会根据应用或者进程的“套接字组播状态”判断是否将数据分组传给上层。MLDv2报文不受源地址过滤影响,能够被所有的主机或路由器处理。
b) 交换各种报文
侦听者端和路由器端之间交换各种报文是协议的重要部分,在此过程中计时器会保持各个功能实体的可用性,若计时器到期会重新选举新的侦听者和查询器。
同一子网内的运行MLDv2协议的路由器首先通过1P地址最小的接口为查询接口的“查询器选举机制”选举出一台“查询器”(Querierrouter),其余的路由自然成为非查询路由器(Non-Querier router)。被当选为“查询器”的接口周期性的在子网内发布一般查询报文,触发性地发布特定组播地址查询报文和特定组播地址和源查询报文,查询邻居接口的组播侦听者发出的组播侦听状态路由器周期性地发送一般查询报文,以查询该链路上是否存在某组播地址的组成员。
在接收到收到路由器发送的一般查询报文后,节点经过[0,最大响应时间〕之间的随机时延后发出组播侦听报告,通过“当前状态报告”报告自己的“接口组播状态”。经过随机时延是为了防止所有的节点都在同一时间发出报告分组,从而避免网络的突发性阻塞。当侦听者端改变自己的接口组播状态时,如想要加入某个组播组时或改变对某个源的接收状态,就可以不必等待路由器的查询报文,而是直接向路由器发送报告报文。如果节点状态发生变化,会立刻发送并重传“状态变化报告”。在旧的“状态变化报告”重传过程中.如果又有新的状态变化发生,这个新的状态变化就会和原来的状态变化合并,然后组成新的“状态变化报告”重新发送,同时重置“重传次数”。节点新旧状态的变化引起的状态变化报告算法表如表2-5所示:
表2-5状态变化报告算法表
旧状态 |
新状态 |
状态改变报告 |
包含(A) |
包含(B) |
允许(B-A),阻止(A-B) |
排除(A) |
排除(B) |
允许(A-B),阻止(B-A) |
包含(A) |
排除(B) |
变成排除(B) |
排除(A) |
包含(B) |
变成包含(B) |
在表中A和B为源地址列表,“包含”和“排除”指的是接口过滤模式,“允许”的意思是希望侦听的新增的源地址列表,“阻止”的意思是希望不再侦听的旧的源地址列表。
路由器收到侦听者针对某组播的“状态变化报告”后,查询器会发送“组播地址指定查询”或者“组播地址和源地址指定查询”,以确定链路上是否还有其他侦听者,如果在“查询超时时钟”超时之前,收到其他侦听者的“当前状态报告”,则重置计时器。否则将修改相应的“组播侦听者状态”。
c) 建立侦听状态列表
通过侦听来自侦听者的报告报文,子网内所有路由器维持相同的“组播侦听状态”。当路由器收到链路上的报告分组时,如果报告地址不在路由器的列表上,则加入该项,否则计时器重新置位。路由器为它所在的每一条链路维护一个列表,除了组播地址列表外,还维护着每个组播地址相关的过滤模式、源地址列表、该地址相应的源计时器等信息。如果某个计时器过期,则把相应的表项从列表中删除。
通过收到的侦听者报告,路由器(包括查询器和非查询器)可以在其接口上建立自己的“组播侦听者状态”信息表。与侦听者不同,如果路由器有多个接口处于同一子网内,则只在其中一个接口建立“侦听者状态”信息。“侦听者状态”由过滤模式、过滤时钟和源地址列表三部分组成。如果链路上某一组播的所有侦听者都是“包含模式”。则接口处于该组播的“包含模式”,用INCLUDE(A)表示。其中A表示源地址列表,INCLUDE(A)称为“包含列表”。如果“包含模式”侦听者发送了包含特定源地址的“当前状态报告”或者“状态变化报告”,该源地址就会被加入到“包含列表”中。“包含列表”中每一个源地址都有“源地址时钟”,一旦“包含模式”侦听者发送报告证实自己在侦听着某一特定源地址.“源地址时钟”就会被更新。如果“包含列表”中的“源地址时钟”由于长时间得不到更新而到期,该源地址就会从“包含列表”中删除。这称为“软离开”机制。
除了“软离开”之外,还有一种“快速离开”机制。当“包含模式”侦听者通过“状态变化报告”声明不再侦听特定源地址时,链路上所有的路由器就会降低该源地址的“源地址时钟”。随后查询器会发出“组播地址和源地址指定查询”,用以验证该链路是否还有该源地址的侦听者。如果“源地址时钟”到期,该源地址就会从“包含列表”中删除。
如果链路上存在处于“排除模式”的侦听者,则接口处于该组播的“排除模式”。收到第一个“排除模式”侦听者的报文时起,路由器就设定该组播的“过滤时钟”。每当“排除模式”侦听者通过“当前状态报告”证实自己的侦听状态时,“过滤时钟”被更新。当一个“包含模式”侦听者,通过“状态变化报告”声明自己变为“排除模式”时,该“过滤时钟”也会被更新。如果“过滤时钟”过期,路由器便将侦听者状态切换成“包含模式”。处于“排除模式”的路由器接口。侦听者状态由符号Exclude(X,Y)表示,其中X表示“请求列表”,Y表示“排除列表”。除了“排除列表”之外所有的源地址发出的组播分组,都会被路由器转发。虽然“请求列表”对于转发分组没有任何影响,但是路由器必须保持“请求列表”。原因如下:
(1)为了标明“包含模式”侦听者所侦听的源地址。当链路中没有“排除模式”侦听者时,能及时将路由器转换成“包含模式”。这种转换不应该中断向该组播“包含模式”侦听者传输的数据流。当路由器切换成“包含模式”时。“请求列表”中的源地址被转移到“包含列表”中,“排除列表”被删除。
(2)用来对原来没有“排除”的源地址进行快速的“排除”。如果路由器接收到一个特定源地址请求的报告。源地址就会被加入到“请求列表”,源地址时钟被赋值.随后查询器发出“组播地址和源地址指定查询”。用以检测该链路上是否还有对这些源地址感兴趣的节点。如果源地址的时钟就会到期时。仍没有侦听者响应。这时,这些源地址就会从“请求列表”移到“排除列表”。从这时起,该源地址就会被路由器阻断[15]。