凡是有树的地方,就有上游与下游的区分。
如果树根(源头)是最上游,那么树干就是次上游,叶子是下游。
水从树根(源头)开始流动,流动到树干,最后到达叶子,一路畅通无阻,叶子获得源源不断水流的滋润,茁壮生长。
这里隐患的逻辑是,下游只从自己的上游接收流量。
如果颠覆这个逻辑,世界就会乱成一锅粥。
树干接到自己的上游(树根)的流量,突然脑子一抽,不小心又流回树根,树根自然很恼火:shit,怎么又发过来了?
于是继续将流量发给树干,树干脑子继续抽,又将流量流回了树根…
这种现象就是环路(Loop)!
造成的后果是,最下游的叶子永远也无法得到水源而枯萎。
组播的流量如同水一样,需要从树根(组播服务器),沿着树干(网络),源源不断输送给叶子(组播订阅用户电脑)。
如果想让组播流量不发生环路,必须遵从大自然规律—“流量从上游接收,向下游发送”!
如果不小心接到下游返回的流量,必须丢弃,以防环路的流量打垮网络!
路由器那么多接口,谁是上游接口,谁又是下游接口呢?
假设组播服务器IP=1.1.1.1,那么它就是树根,这个没有什么反对意见吧?
谁距离树根(1.1.1.1)近,谁是上游接口,这个也没有反对意见吧?
那“近”用什么指标来衡量呢?
通俗地说,路由器如何比较谁离1.1.1.1更近(上游),谁更远(下游)呢?
回忆一下,在单播路由里,是如何比较近的呢?
不同的路由协议,有不同的比较算法。
RIP协议,比跳数(hop),谁小谁近。
OSPF协议,比cost值,谁小谁近。
BGP协议,比AS_Path,谁的AS列表少,谁更近。
无论底层路由协议是什么,都有办法比较谁更近,对吗?
于是就有了PIM协议,Protocol Independent Multicast,意思是和底层路由协议无关的组播协议,PIM依赖底层路由协议,选定了一个上游接口,那么其它的接口都为下游接口。
所以组播会使用单播路由表的度量值(metric),来比较谁近谁远。
同学们可能会问,那万一两个接口的metric相同呢?
那就选择接口IP小的胜出!
当路由器接口确定好自己的角色定位,谁是自己的上游(只能有一个),谁是自己的下游(可以没有,也可以有一个,可以有多个),那么一棵组播树就诞生了。
那么组播流量就从树根(1.1.1.1)出发,沿着组播树干开始流动,一直流动到叶子(订阅用户)。
由于严格遵从大自然规律,组播流量单向流动,不会发生环路。
领取专属 10元无门槛券
私享最新 技术干货