三种通信方式——为什么需要组播通信?
- 单播Unicast:点到点的通信,单播应用对每个单播地址包都发出一份拷贝,非常简单。骨干网压力大,同样的包可能会复制很多份,资源浪费。
- 广播Boardcast:一对多的通信,一个范围内所有的终端。小范围容易实现,但选择性差,每个主机都会收到自己不需要的包,增加处理开销以及无效数据流的传递。且对于大范围网络代价太高。
- 组播Multicast:介于二者之间,也称多播。指定特定组进行通信。吸取二者的优势,既能缓解主干流量压力,又能提高传播的选择性。
- 挑战:地域范围大、组成员数量可调、组员位置可密可疏、动态的组内关系调整、路由转发效率、安全性...(IP网络结构本身是为点到点通信而设计的)
- 目标:高效的、一对多、多对多的相同数据传输。
组播的基本概念
下图是一个典型的网络结构,组播主要包含以下几个概念:
应用程序/组播地址:组播服务器使用组播地址IP进行通信,而非终端IP地址(单播)。对终端而言,要加入某一组播地址来获得某一公享资源。
主机-路由器协议(IGMP/MLD):管理组成员,组管理协议。
域内组播协议(PIM;DVMRP):网络如何中转
域间组播协议(MSDP):域间的转发协议
组播四要素
源发现:只往组播地址内发数据,但也不知道组内有谁
接受者发现:终端和服务器二者之间可以互相不认识,只负责加入某个组,但不知道是谁在发消息
拓扑发现:网络之间的拓扑
分发树生成:建立拓扑路径
组播地址(D类)
就是一个IP地址,不代表具体的主机,是一个逻辑上的地址。
地址范围:224.0.0.0——239.255.255.255 MAC地址:01-00-5e-xx-xx-xx(网卡支持组播功能可以对IP进行映射)
保留组播地址:被留下作特殊用途的一些组播地址。
组播转发路径——树的概念
简单来说就是一个由组播包转发路径形成的树状结构。根据树根的不同,组播分布树可以分为有源树和共享树。
有源树(最短路径树):树根是组播信息流的来源,以最短路径穿过整个树。这样以来对于每一个服务器都要以自己为根建立组播树。
![](https://i-blog.csdnimg.cn/blog_migrate/3801b907fd6b2229e3aea1115d0501a0.png)
共享树:在网络中找一个公共点RP作为根来建立数。源先把数据发给RP点,终端再以RP点建立树。所有设备都围绕RP建立,可以减少转发表项。只对RP一个源维护转发表项就行了,而不需要对多个服务器多个源维护。
![](https://i-blog.csdnimg.cn/blog_migrate/7645e43b8535e458ac5f1efe3bad6132.png)
组播转发项:(S、G、Upstream、Downstream list)源地址、组地址、入接口、出接口列表。在传统IP中,只有一个出接口,但在组播中可能有多个出接口
优劣比较:有源树占用内存多但路径最优,延迟最小。共享树,占用内存较小,但路径不是最优的,引入额外的延迟。最优的不一定是最好的,要综合考虑多方面。因此目前主流的是共享数方案。
组播转发原理
组播路由和单播路由关注点是相反的:单播路由关心数据到哪里去,组播路由更关心数据从哪里来。
单播模型中,数据沿着单一的路径由源主机到达目标主机,沿途查找单播路由表,做出具体向哪一个接口转发的决定。组播模型中,组播路由器必须将组播数据包转发到多个接口上,以便同一组的成员都能收到数据包。如果组播路由器在其输出接口上接收到组播数据包,就会产生组播路由循环的现象。
组播一进多出要进行无环的处理。
![](https://i-blog.csdnimg.cn/blog_migrate/20312ef8ba14bfe31d9e8a5293321fe9.png)
逆向路径转发RPF:
基于RPF检查决定是否转发或丢弃。路由器检查到达组播包的源地址,如果信息包是在可返回源 站点的接口上到达,则RPF检查成功,信息包被转发。否则错误,被丢弃。
检查失败的过程:组播路由器R收到一个数据时。首先检查源地址,为192.18.0.32,进行单播路由表进行查询,发现下一跳接口是S1。信息待会组播处理进程,发现与到达接口矛盾。因此检查失败,将数据包丢弃。以此类推,从S1到达的数据包检查吻合转发表的转发项,进行对这个组播数据包进行转发。
组管理协议
确定本地链路上是否有接收主机加入某个组。为此,组播路由器和接收主机必须进行组成员关系的交互。转发第一条路由器管理组内成员。
IPv4:IGMP,因特网组管理协议。IGMPv3
IPv6:MLD,组播监听发现协议MLDv2
IGMP的动作:
主动报告加入
普遍查询
响应报告
离开组消息
指定组查询
具体的实现过程:
组加入:主机发送IGMP报告,加入组。
定期查询:路由器定期查询还有没有人(不关心有几个人,结果是一样的)在组里。如果还有主机在则会有响应报告,一台主机回复就够了。
组离开:当一个成员离开组时,IGMPv1主机安静的离开组,路由器发送3个总体查询后向上汇编,带来资源浪费。v2中引入离开组消息,路由器收到后专门向这个组发查询消息,若3s没有响应向上汇报。
组播路由协议
协议无关PIM(Protocol-Independent Multicast)
组播协议的运行对单播协议没有要求。使用单播路由协议实现RPF校验,不必保持自己的路由表,降低了不必要的大量开销
密集模式PIM-DM:用户很多,使用“Push”模型,正张网络泛洪,随后不想接收进行剪枝。进行泛洪、剪枝、泛洪、剪枝的循环。
稀疏模式PIM-SM:用户稀疏,使用“Pull”模型,请求才给,需要加入请求。
PIM的建立基础
建立邻居关系(hello)后,指定路由器DR(多个路由与主机相连的时候,选一个DR进行组管理,代表这个组进行包的获取并进行分配)。若没有DR,则会造成资源的浪费。这里只对PIM-DM进行简单的介绍。
密集模式PIM-DM:
协议号:103
PIM的组播地址:224.0.0.13
先广播到全域,如果确定有本地不需要的路由,则向上层发布剪枝消息,周而复始进行循环。如果有新的接受者,则可以进行嫁接消息发布。PIM-DM适合于高速网络或者是组播接收点分布密集的网络。
稀疏模式PIM-SM
支持共享树和源树,默认共享树
使用汇聚点RP
发送者的第一跳路由器DR把发送者注册到RP上。
接受者的DR为接受者加入RP。
整张网络是以RP为核心的两棵树
PIM-SM的两段式树结构:有源树+共享树
为清晰的体现协议的运行结构,举例进行说明:
假设有一个主机为接受者1,即将订阅源S的组播数据。
首先接受者要先发送一个IGMP请求加入所在组播,根据前面描述,开头格式应该是(*,G)。当沿途路由器接收到这个加入消息后,创建一个(*,G)转发项,可以理解为是为了后续接收源S数据包给接受者转发而服务的。这样就构建了一个从RP到接收者的共享树。
源发布数据流默认就是组播地址,第一跳路由会建立一个(S,G),出接口为空,因为它不知道确切的目的地在哪里。第一条的路由会通过隧道技术封装好数据包传递给RP。RP收到后会解封装,提取出组播地址,再将数据包传递给下游用户。
隧道技术有较大的开销,因此RP在转发给接受者的同时,会建立一个(S;G)的表项,同时向源S发布一个(S;G)的加入消息。就可以建立一个由源S到RP的有源树。
这样就形成了一个由源到RP的有源树,从RP到接受者的共享树。(控制平面)数据流沿源树流向RP,从RP开始沿着共享树流向接受者。
由于网络是动态的,也就是说接受者有可能会随时退订该组播的资源。当DR发现本地没有接收者了,将会发起剪枝消息,沿途的路由器都会接收到并删除(*;G)转发项。但源并不知道这个事情,因此此时RP会向源的DR发起(S;G)的剪枝消息。源DR收到消息后便暂时不再转发给RP消息了。
但不巧的是,退订的接受者突然又要加入源S的组播,本地DR重复刚刚的操作,建立与RP的共享树。但RP由于(S;G)的老化删除,找不到源S了。为了避免数据流因老化而丢失的问题,源DR每隔60s再次发送注册消息(S;G),防止被老化删除。
共享树向有源树的切换
当组播数据流达到一定阈值后,为了适应大数据量的业务效率,接受者的DR可以直接向源DR发起加入申请,建立一个源S到接受者的有源树。完成共享树向有源树的切换,实现路径的优化。