在组播实现中,组播路由和转发分为三种表:
l 每个组播路由协议都有一个协议自身的路由表,如PIM路由表(PIM Routing-Table);
l 各组播路由协议的组播路由信息经过综合形成一个总的组播路由表(Multicast Routing-Table);
l 组播转发表(Multicast Forwarding-Table)直接用于控制组播数据包的转发。
组播路由表由一组(S,G)表项组成,其中(S,G)表示由源S向组播组G发送组播数据的路由信息。如果路由器支持多种组播路由协议,则其组播路由表中将包括由多种协议生成的组播路由。路由器根据组播路由和转发策略,从组播路由表中选出最优的组播路由,并下发到组播转发表中。
组播路由协议依赖于现有的单播路由信息、MBGP路由或组播静态路由来创建组播路由表项。组播路由协议在创建组播路由表项时,运用了RPF(Reverse Path Forwarding,逆向路径转发)检查机制,以确保组播数据能够沿正确的路径传输,同时还能避免由于各种原因而造成的环路。
执行RPF检查的依据是单播路由、MBGP路由或组播静态路由:
l 单播路由表中汇集了到达各个目的网段的最短路径;
l MBGP路由表直接提供组播路由信息;
l 组播静态路由表中列出了用户通过手工静态配置指定的RPF路由信息。
在执行RPF检查时,路由器同时查找单播路由表、MBGP路由表和组播静态路由表,具体过程如下:
(1) 首先,分别从单播路由表、MBGP路由表和组播静态路由表中各选出一条最优路由:
l 以“报文源”的IP地址为目的地址查找单播路由表,自动选取一条最优单播路由。对应表项中的出接口为RPF接口,下一跳为RPF邻居。路由器认为来自RPF邻居且由该RPF接口收到的组播报文所经历的路径是从源S到本地的最短路径。
l 以“报文源”的IP地址为目的地址查找MBGP路由表,自动选取一条最优MBGP路由。对应表项中的出接口为RPF接口,下一跳为RPF邻居。
l 以“报文源”的IP地址为指定源地址查找组播静态路由表,自动选取一条最优组播静态路由。对应表项明确指定了RPF接口和RPF邻居。
(2) 然后,从这三条最优路由中选择一条作为RPF路由:
l 如果配置了按照最长匹配选择路由,则从这三条路由中选出最长匹配的那条路由;如果这三条路由的掩码一样,则选择其中优先级最高的那条路由;如果它们的优先级也相同,则按照组播静态路由、MBGP路由、单播路由的顺序进行选择。
l 如果没有配置按照最长匹配选择路由,则从这三条路由中选出优先级最高的那条路由;如果它们的优先级相同,则按照组播静态路由、MBGP路由、单播路由的顺序进行选择。
& 说明:
根据组播报文传输的具体情况不同,“报文源”所代表的具体含义也不同:
l 如果当前报文沿从组播源到接收者或RP(Rendezvous Point,汇集点)的SPT(Shortest Path Tree,最短路径树)进行传输,则以组播源为“报文源”进行RPF检查;
l 如果当前报文沿从RP到接收者的RPT(Rendezvous Point Tree,共享树)进行传输,则以RP为“报文源”进行RPF检查;
l 如果当前报文为BSR(BootStrap Router,自举路由器)报文,沿从BSR到各路由器的路径进行传输,则以BSR为“报文源”进行RPF检查。
对每一个收到的组播数据报文都进行RPF检查会给路由器带来较大负担,而利用组播转发表可以解决这个问题。在建立组播路由和转发表时,会把组播数据报文(S,G)的RPF接口记录为(S,G)表项的入接口。当路由器收到组播数据报文(S,G)后,查找组播转发表:
(1) 如果组播转发表中不存在(S,G)表项,则对该报文执行RPF检查,将其RPF接口作为入接口,结合相关路由信息创建相应的表项,并下发到组播转发表中:
l 若该报文实际到达的接口正是其RPF接口,则RPF检查通过,向所有的出接口转发该报文;
l 若该报文实际到达的接口不是其RPF接口,则RPF检查失败,丢弃该报文。
(2) 如果组播转发表中已存在(S,G)表项,且该报文实际到达的接口与入接口相匹配,则向所有的出接口转发该报文。
(3) 如果组播转发表中已存在(S,G)表项,但该报文实际到达的接口与入接口不匹配,则对此报文执行RPF检查:
l 若其RPF接口与入接口一致,则说明(S,G)表项正确,丢弃这个来自错误路径的报文;
l 若其RPF接口与入接口不符,则说明(S,G)表项已过时,于是把入接口更新为RPF接口。如果该报文实际到达的接口正是其RPF接口,则向所有的出接口转发该报文,否则将其丢弃。
如图1所示,假设网络中单播路由畅通,未配置MBGP,Router C上也未配置组播静态路由。组播报文(S,G)沿从组播源(Source)到接收者(Receiver)的SPT进行传输。假定Router C上的组播转发表中已存在(S,G)表项,其记录的入接口为POS5/1。
图1 RPF检查过程
l 如果该组播报文从接口POS5/1到达Router C,与(S,G)表项的入接口相匹配,则向所有的出接口转发该报文。
l 如果该组播报文从接口POS5/0到达Router C,与(S,G)表项的入接口不匹配,则对其执行RPF检查:通过查找单播路由表发现到达Source的出接口(即RPF接口)是POS5/1,与(S,G)表项的入接口一致。这说明(S,G)表项是正确的,该报文来自错误的路径,RPF检查失败,于是丢弃该报文。
组播静态路由是RPF检查的重要依据之一。根据具体应用环境的不同,组播静态路由有以下两种主要用途:
通常,组播的网络拓扑结构与单播相同,组播数据的传输路径也与单播相同。可以通过配置组播静态路由以改变RPF路由,从而为组播数据创建一条与单播不同的传输路径。
图2 改变RPF路由示意图
如图2所示,当网络中没有配置组播静态路由时,Router C到组播源(Source)的RPF邻居为Router A,从Source发出的组播信息沿Router A—Router C的路径传输,与单播路径一致;当在Router C上配置了组播静态路由,指定从Router C到Source的RPF邻居为Router B之后,从Source发出的组播信息将改变传输路径,沿Router A—Router B—Router C的新路径传输。
当网络中的单播路由被阻断时,由于没有RPF路由而无法进行包括组播数据在内的数据转发。可以通过配置组播静态路由以生成RPF路由,从而创建组播路由表项以指导组播数据的转发。
图3 衔接RPF路由示意图
如图3所示,RIP域与OSPF域之间实行单播路由隔离。当网络中没有配置组播静态路由时,OSPF域内的接收者(Receiver)不能收到RIP域内的组播源(Source)所发出的组播信息;当在Router C和Router D上均配置了组播静态路由,分别指定从Router C到Source的RPF邻居为Router B、从Router D到Source的RPF邻居为Router C之后,Receiver便能收到Source发出的组播信息了。
& 说明:
l 组播静态路由的作用只在于影响RPF检查,而不能用于指导组播数据转发,故又称为RPF静态路由;
l 组播静态路由仅在所配置的组播路由器上生效,不会以任何方式被广播或者引入给其它路由器。
网络中可能存在不支持组播协议的路由器。从组播源(Source)发出的组播数据沿组播路由器逐跳转发,当下一跳路由器不支持组播协议时,组播转发路径将被阻断。此时,通过在处于单播网段两端的组播路由器之间建立GRE(Generic Routing Encapsulation,通用路由封装)隧道,可以实现跨越单播网段的组播数据交换。
如图4所示,在Router A和Router B之间建立起GRE隧道。Router A将组播数据包封装在单播IP报文中,经由单播路由器转发,传送到隧道另一端的Router B。然后,Router B将单播IP报文头剥掉,继续进行组播传输。
如果在隧道的两端配置了单播静态路由,则任意单播数据包都可以通过该隧道传输。为了将该隧道专用于组播数据包的传输,可以在隧道两端只配置组播静态路由,从而使单播数据包的传输不能再使用此隧道。
Multicast traceroute(组播路径跟踪)用来跟踪组播数据从第一跳到最后一跳路由器所经过的路径。
(1) 最后一跳路由器(Last-hop Router):如果某路由器有一个接口的IP地址与指定地址在同一个网段内,具备组播功能,且能够向该网段转发特定组播源发来的组播流,则称该路由器为最后一跳路由器。
(2) 第一跳路由器(First-hop Router):与组播源直连的路由器。
(3) 查询器(Querier):触发组播路径跟踪的路由器。
Multicast traceroute报文是一种特殊的IGMP报文,与普通IGMP报文的区别在于其类型字段为0x1F/0x1E,且其目的IP地址为单播地址。Multicast traceroute报文分为以下三种类型:
l Query报文:类型字段为0x1F
l Request报文:类型字段为0x1F
l Response报文:类型字段为0x1E
(1) 查询器向最后一跳路由器发送Query报文;
(2) 最后一跳路由器在收到的Query报文后加上本地响应数据块转换成Request报文,查找到上游邻居后向其单播发送该Request报文;
(3) 最后一跳路由器到组播源之间的每一跳都在Request报文之后附加一个响应数据块,并向其上游邻居单播转发;
(4) 第一跳路由器在收到Request报文后,将其报文类型改为Response报文,向查询器单播发送完整的报文。