1.5 在IP子网上的组管理协议
要参加在一个本地网络上的IP多播,主机必须具有允许它发送和接收多播数据报的软件。要参加跨越多个网络的多播,该主机必须通知本地的多播路由器。本地路由器跟其他的多播路由器联系,传递成员信息,并建立路由。其思想非常类似于在传统的互联网路由器之间的传统的路由传播。
在一个多播路由器可以传播多播成员信息之前,它必须确定在本地网络上已经有一个或多个主机决定加入一个多播组。为此,实现多播机制的路由器和主机必须使用因特网组管理协议(The Internet Group Management Protocol,IGMP)交换组成员信息。
IGMP是因特网协议族系中的一个多播协议,运行在一个IP子网上的主机和它们直接相邻的多播路由器之间,允许主机向本地路由器报告它的组成员关系。路由器也定期查询子网,通常就是一个LAN,确定已知的组成员是否仍然处于活动状态。如果在LAN上有多个路由器执行IP多播,那么其中的一个路由器被选为“查询者”,并只由该路由器负责LAN上的组成员查询。
IGMP类似于ICMP(因特网控制报文协议),它也使用IP数据报封装报文,其协议号是2。虽然IGMP使用IP数据报运载报文,但可以把它看成是IP整体上所需要的一个部分,而不是一个孤立的协议。而且,IGMP是TCP/IP的一个标准,参加IP多播的所有机器都需要它。
参与IP多播的主机可以在任意位置、任意时间且成员总数不受限制地加入或退出多播组。多播路由器不需要也不可能保存所有主机的成员关系,它只是通过IGMP协议了解在每个接口连接的网段上是否存在某个多播组的接收者,即组成员。而主机方只需要保存自己加入了哪些多播组的信息。
在概念上,IGMP有两个阶段。
第一阶段:当一台主机加入一个新的多播组时,它给“所有主机组”发送一个IGMP报文,宣告它的成员关系。本地多播路由器接收该报文,并通过在互联网上把该组成员信息传播给其他的多播路由器以建立必要的路由。
第二阶段:因为成员关系是动态的,所以本地多播路由器要动态地轮询在本地网络上的主机,以确定哪台主机仍然是哪个组的成员。如果在几次轮询之后,没有主机报告是一个组的成员,多播路由器就假定在该网络上没有一个主机是那个组的成员,从而停止向其他的多播路由器广播有关的组成员信息。
IGMP被仔细设计以避免在本地网络上形成拥挤。第一,在主机和多播路由器之间的所有通信都使用IP多播。也就是说,当IGMP报文被封装后准备在IP数据报中传输时,IP目的地址是“所有主机组”多播地址。因此运载IGMP报文的数据报使用硬件多播机制(如果可提供的话)发送。结果在支持硬件多播的网络上,不参加IP多播的主机永远不会收到IGMP报文。第二,多播路由器不必为每个多播组都发送一个单独的请求报文。取而代之的是,它可以发送单个轮询报文请求关于所有组的成员关系的信息,轮询频度限制在最多每分钟一个请求。第三,属于多个组的成员的主机不是同时发送多个响应,而是在来自一个多播路由器的IGMP请求到达之后,主机为它是其成员的每个组分配0~10秒的随机延迟,在每一个组的指定延迟之后再为那个组发送一个响应。因此主机在10秒范围随机地把它的响应间隔开来。第四,主机倾听来自其他主机的响应,并抑制任何不必要的响应。
为理解为什么一个响应可能是必要的,可回忆一下为什么多播路由器要发送一个轮询报文。因为向多播组发送的所有信息都将使用硬件多播机制发送,所以路由器不需要保持关于组成员的精确记录。实际上,多播路由器仅需知道在网络上是否至少有一台主机仍然是该组的成员。在多播路由器发送轮询报文之后,所有的主机都对它们的响应分配一个随机的延迟,当具有最小延迟的主机发送它的响应(使用多播机制)时,其他参加主机也接收一个拷贝。每个主机都假定,多播路由器也会接收第一个响应的一个拷贝,并取消它的响应。因此在实践中,每个组中仅一台主机响应来自多播路由器的请求报文。
如图1-5所示,IGMP报文有一个简单的格式。
图1-5 IGMP报文格式
版本号段给出了协议版本。类型段标识多播路由器发送的是一个询问报文(1)还是一个响应报文(2)。未使用的段必须包含零值。检验和段包含该8字节IGMP报文的检验和。IGMP检验和的计算方法跟TCP和IP检验和的计算方法相同。最后,主机使用组地址段报告它们在一个特别的多播组中的成员关系。
在IGMP中,主机与路由器之间的关系是不对称的。主机需要用组成员关系报告报文响应多播路由器的组成员关系查询报文。路由器周期性地发送组成员关系查询报文,然后根据收到的响应报文确定某个特定组在对应的子网上是否有主机加入;当收到主机退出一个组的报告时,需要发出针对该组的查询报文,以确定该组在该子网上是否还有成员存在。
基于从IGMP获得的组成员关系信息,路由器就能够确定,需要把哪些(如果有的话)多播流量转发给它的“叶”子网。“叶”子网是这样的一种子网,它们没有下游路由器;它们可能包含某些组的接收方,也可能不包含。多播路由器使用从IGMP获得的信息,连同多播路由协议一起,在IP网络上支持多播传输。IGMP具有三种版本,即IGMP v1、v2和v3。
第1版IGMP在RFC-1112中描述。根据该规范,多播路由器定期发送主机成员关系查询报文(Host Membership Query messages,参见图1-6),以便确定哪些主机组在它们直接附接的网络上有成员。IGMP查询报文的地址指向所有系统组(224.0.0.1),并且把IP的TTL设置成1。这就意味着,源自一个路由器的查询报文被发送到直接附接的子网,但不会被任何其他的多播路由器转发。
图1-6 因特网组管理协议中的查询报文
当一个主机接收到一个IGMP查询报文时,需要为所属的每个组都用一个主机成员关系报告响应,分别发往它属于的那些组中的一个不同的组。注意,IGMP查询是发给“这个子网上所有的系统”组的D类地址(224.0.0.1),而IGMP报告则是发给该主机所属的组。接收到一个主机对一个查询的成员关系响应报文后,加入该组的其他主机就不用再发送它们自己的响应。类似于查询,IGMP报告使用IP的TTL=1发送,因此不会被转发到本地子网之外。
为了避免并发报告所造成的混乱,每个主机为它所属的每个组启动一个随机选择的报告延迟定时器。如果在该延迟期间接收到对于同一个组的另一个报告,那么在该组中的每个其他的主机必须把它的定时器重置成一个新的随机值。这个过程把报告时间散布在一个周期上,并最小化在给定的子网上至少有一个成员的每个组的报告流量。
值得注意的是,多播路由器不必被直接寻址,因为它们的接口被要求混杂地接收所有的多播IP流量。而且,路由器不必维持一个关于哪些主机属于每个多播组的详细列表;路由器只需知道在一个给定的网络接口上是否至少有一个组成员。
多播路由器定期地发送IGMP查询,更新它们关于在每个接口上存在的组成员信息。如果一个路由器在多次查询之后没有收到一个组的任何成员的报告,那么它就认为在该接口上不再有该组的成员。如果这是一个叶子网,即没有多播路由器往下游更远处连接该组的其他成员,那么就把这个接口从这个组的投递树中删除。如果这不是一个叶子网,那么仅在该路由器通过多播路由协议获悉通过该接口往下游可达的更远处还有该组的成员的情况下,才会把多播在这个接口上继续发送。
当一个主机开始加入一个组时,它立即发送一个对于该组的IGMP报告,而不必等待路由器的查询。这样就减少了在子网上第一个主机加入一个给定组的“加入延迟”。加入延迟的计量从主机发送第一个IGMP报告开始,直到那个组的第一个分组到达主机的子网为止。当然,如果该组已经是在活动状态,加入延迟可以被忽略。
第2版IGMP对第1版做了扩展,但保持跟第1版主机兼容。首先,它定义了为每个LAN选举多播查询者的规程。在第1版中,查询者的选举是借助多播路由协议确定的。而在第2版IGMP中,在LAN上具有最低IP地址的多播路由器被选举为多播查询者。其次,第2版IGMP定义了一个新类型查询报文:组特有的查询(Group-Specific Query)。组特有的查询报文允许路由器对一个特定的多播组而不是对驻留在直接附接的子网上的所有组进行查询。最后,第2版IGMP定义了一个“离开组(Leave Group)”报文,降低了IGMP的离开延迟。当一个主机要离开一个组时,它给所有路由器组(224.0.0.2)发送一个IGMPv2 “离开组”报文,把其中的组域设置成要离开的组。在收到一个离开组报文之后,当选为查询者的路由器必须确定这个主机是否是在这个子网上这个组的最后一个成员。为此,该路由器开始在收到离开组报文的接口上发送组特有的查询报文。如果收不到对于组特有的查询报文的响应,那么,如果这是一个叶子网,就把这个接口从这个组的投递树中删除。然而,即使在这个子网上没有组成员,如果路由器知道通过附接到该子网的其他路由器往下游可达的离开该源的更远处还有组成员,那么就必须把多播继续在这个子网上发送。
离开延迟是从路由器的角度进行测量的。在第1版IGMP中,离开延迟是从路由器听到一个给定组的最后一次报告到路由器因那个接口超时而将其从该组的投递树上删除所经历的时间(假定这是一个叶子网)。注意,路由器认定这是最后一个组成员的唯一的方法是在若干倍的查询间隔(几分钟的数量级)内没有接收到报告。在第2版IGMP中,有了离开组报文,允许一个组成员更快地通知路由器,它已经结束了对一个组的流量的接收。然后,路由器必须确定,此主机是否是在该子网上这个组的最后一个成员。为此,路由器很快通过组特有的查询报文询问该组的其他成员。如果在几次组特有的查询之后没有成员发送报告,路由器就可以推断,那个组的最后一个成员确实已经离开子网。
降低离开延迟的优点是路由器能够很快使用它的多播路由协议通知上游邻居(上游指的是路由器认为通向一个源的方向),允许对于这个组的投递树很快适配该组新的分布状况(例如,树中没有该子网及连接到它的下游分支)。替代的方法是必须等待好几轮得不到应答的查询(几分钟的数量级)过程。如果一个组的流量很大,尽可能快地停止传输这个组的数据可能是非常有益的。
第3版IGMP引入一个组源报告(Group-Source Report)报文和一个排除组源报告(Exclusion Group-Source Report)报文。前者允许主机指定它想接收的特定源的IP地址,后者允许主机明确要求阻止来自某些源的流量。在第1版和第2版IGMP中,如果一个主机想接收一个组的任何流量,那么发往该组的来自所有源的流量都会被转发进该主机的子网。
允许主机仅选择它想要接收其流量的具体的源有助于节约带宽。而且,多播路由协议在构建它们的多播投递树的分支的时候,能够使用这个信息帮助节约带宽。最后,还可以通过引入“组源离开(Group-Source Leave)”报文来增强在第2版IGMP中采用的离开组报文。这个功能将允许一个主机可以离开整个组,也可以指定它想要离开的(源,组)对的具体的IP地址。