前言:
路由器在转发单播数据的时候依靠单播路由表。当单播路由表出现环路之后,那么被转发的单播数据也会出现环路现象,所以单播数据依靠单播路由协议,来形成准确没有环路的路由表,以此来保证数据的转发不会出现环路。
那么组播是如何防止环路的呢?组播针对环路的问题使用RPF校验来防止环路的产生。
一、单播路由和组播路由的主要区别
>单播路由关心数据包要去哪里(Destination)---查看目的ip转发数据
>组播路由关心数据包从哪里来(Source)---用来检测环路,和重复报文
>单播路由依靠路由协议对目的地址的检测来防止环路
>组播路由无法对目的地址检测,因为很可能在任何一个节点,因此组播路由需要依靠对源地址的检测来防止环路。
针对源地址的检测方法称之:RPF(Reverse Path Forwarding)
RPF针对的是所有组播路由协议,所以RPF是组播数据转发的依赖。
RPF工作原理:当一台路由器收到一个组播包,会查看自己单播路由表中去往这个组播源的出接口是否跟自己的收包接口一致。一致就转发,不一致就丢弃。
也从侧面说明组播数据的转发,需要单播路由的基础,因为RPF检测要用到。
二、RPF校验的应用场景,如何去预防环路的产生?
上面这张图。我们说RPF的检测需要单播的基础,才能完成RPF校验,所以在组播路径树中运行了eigrp。
Server作为一个组播源,R4下面的主机作为一台接受者,当R1收到Server发来的组播包后,首先会看到这个组播包的源单播ip地址,然后查找自己的路由表,看一下去往这个ip地址的出接口,是不是和收到这个组播包的出接口一致。如果一致就转发,不一致就丢弃。假设一致,R1会将组播包从自己的2 3端口发出,这时候R2 R3收到,R2又会执行RPF校验,然后发给R3,这时候R3从R1和R2同时收到了相同的组播包,那么应该去转发谁的呢?
R3也执行RPF校验,查找路由表发现自己去往Server的出接口是5号口,那么此时就只接受R1发来的组播流量,这时候R3的5号口就是RPF接口,R1的3号口就是R3的RPF邻居。对于第一跳路由器只有RPF接口,没有RPF邻居。
那么RPF是如何防止环路的呢?
还是上面这张图,如果没有RPF校验的话,R3收到R1的会发给R2,R2又会发给R1就导致了环路。退一万步想即使R3发给了R2,那R2也只接受自己RPF邻居发来的流量,就不转发R3的。
问题一、
1.1.1.1作为组播源的ip地址,那么对于R3来说去往组播源的出接口只有一个,这时候R1 R3都会给它发送组播流量,应该接受谁的呢?
首先R3的3号端口肯定是RPF接口,因为自己去往1.1.1.1的出接口只有一个,但是一台路由器只会接受RPF邻居发送给我的RPF接口的组播流量。R1和R2谁会成为RPF邻居呢?
这时候会比较R1和R2的ip地址,越大越优先。很明显1.2大于1.1,所以R2的2号口是RPF邻居
问题二、
上面这个环境,R2从两个接口收到R1的发来的组播流量,这时候会选择哪一个接口为RPF接口呢?
也是一样的,R2比较两个接口的ip地址大小,谁的ip地址大,谁成为RPF接口。
问:一个路由器只接受RPF邻居发来的流量,其他接口收到的流量并不接受,那么其他路由器在转发组播包的时候,一定会占用很大的带宽资源,该如何去解决?
答:确实存在这种问题,并且存在这种问题的解决办法。本章只针对RPF接口做介绍,之后会说到这个问题。
三、总结:
要成为RPF 接口必须满足的条件: 离组播源最近的, 并且运行 了组播路由协议的接口.
针对每一个组播源而言, RPF 接口有且只有一个
针对每一个组播源而言, RPF 邻居有且只有一个
组播路由器只能转发来自RPF接口, 并且由RPF邻居发过来的组播数据
RPF接口与RPF 邻居的选择方法:
当有多个接口都能成为该组播源的RPF 接口时, 选择IP地址最 大的接口成为针对该组播源的RPF接口.
当有多个邻居都能成为该组播源的RPF邻居时, 选择IP地址最大的邻居成为针对该组播源的RPF邻居
当一个路由器收到组播流量,发现去往源的出接口与收包接口不一致则RPF检测失败,无法转发此组播流量。
RPF检测一共有三种方法,默认情况下是查找单播路由表,之后的文章中会分别介绍三种检测方法、