组播的相关概念

D类地址是用于组播,也就是以1110开头,剩下28位用于鉴别组播地址(剩下的这28是个无结构的地址), 以01005e开头的MAC地址用于表示MAC的组播地址,剩下的23位用于标识组播,IP组播地址对于MAC地址有一个映射关系,也就是IP组播的后23对应Mac组播的后23位,这样就有可能出现多个IP对应一个MAC的现象,它们之间用Arp来解析。

如果一个局域网使用组播,那么所有的主机必须加入一个all-host组(组播地址为224.0.0.1),但是Host可以决定是否去接受组播。当一个组播交通决定传输之前,router需要知道那个Host想接收组播,IGMPv1, IGMPv2用于发现是否有这个组播组的成员在它直连的子网里,IGMP用一个querying device去请求和报告Host加入和离开组播组,它有两种message, 一个是query messages 用于组播路由器去发现Member, 还有一个是report message,它是由主机发送,报告那个主机想加入组播组,IGMP间断的发送query message到224.0.0.1(用于标识所有主机), 直连网段中的其中一台Host发送report message来报告谁想接收组播,但是如果Host 想加入组播组,它可不必等待query message, Host 可以主动的发送一个report message到224.0.0.2(标识组播组中的所有组播路由器)

IGMPv2 提供了leave meassage,主机主动发送这个离开信息到224.0.0.2,表明这台主机想离开这个组播组,query router发送一个query message ( specific-group)的信息从那个接收离开组的端口,如有其它的主机还想加入这个组播组,则向这个query device发送一个specific-group 的report message, 如果在一定时间内没有主机反应这个group-specific query message, 则表明没有本地成员在这个组里面

在交换机转发组播中,由于IP组播映射到一个Layer 2 multicast address, 所以组播必须发送到所有的交换机端口,当一台主机向组播路由器报告成员信息,组播由路由器发送到交换机,由于组播使用组播地址传送流量,所以它不知道实际的目的mac地址,因而它将它发送到所有的交换机端口,可以使用划分VLAN来解决这个问题,但是使用VLAN不能动态的添加和删除成员,这样,交换机必须处理每一个组播包,加大了处理延时,降低了交换机的性能,这样就出现了一个router to switch的解决方法---CGMP, CGM允许交换机向组播路由器学习有关组成员的信息,在这个环境里,rotuer是一个CGMP服务器,switch是一个Client, 当router 接收一个组播包,它立即创建一个CGMP包,这个包发送到一个well-know地址,所交换机都能收到这个包,然后交换机解释这个包,创建一个forwarding table。

在每个物理段中,一个指明路由器被选择,指明路由器构造一个分布树,连接一个组播组有所有的成员,以保证高效的传输。这个router可copy所有进入的包,然后把它发送到它的分支树,因为组播组是动态的所以分布树也必须是动态的升级,一个分支加入一个分布树就像一个新的成员加入组播组,相反的说,如果这个分支没有接收者,刚这个分支被删除。

有两种分布树可以在组播路由中使用:1.源指定(source specific) 2.共享(shared),   指定源的方式针对于每个组播组的源 处理Spanning tree,例如,如果10个成员在10个分离的子网,创建基于10个组播组的10个不同的路由树被, 源指定使用从源到目的的最短路径最小化了延时,source-based 的分布树使用一个叫相反路径转发的机制(Reverse Path Forwarding RPF), 当一个router接收一个带源的组播包,它在它所有的端口转发这个包,除了接收这个包的端口,然而,转发只发生在提供最短路径返回发送者的链路,如果这个包到达了一个不是最短的路径上,则这个包被discard。

提供一个到组播指明路由器和源之间的链路叫作父链路,router的处出端口叫子链路。

在共享树(shared-tree)的方式, 所有的包沿着分布树发送到组播组,不考虑发送的源,这种方式削减了处理时间,但是导致了较大的端到端的延时

然而,不同于spanning-tree机制,不同的组播组定义了不同的分布树,如果一个设备想接收数据,它必须加入这个组的共享树,组播路由协议通过检测一个点播的路由可达来建交分布树。

组播包使用IP Header的TTL域来限制它的可达范围,每经过一个路由器,TTL的值减1,如果TTL过期,则这个包被抛弃,Packet的TTL大于接口的TTL门限,则被转发,如果等于小于接口的门限则抛弃。

0 限制在同一个主机,从来不被发送到任何接口

1 限制在相同的子网,从来不被router转发

15限制在相同的site, 组织,或部门

63限制在相同的区域

127worldwide

191workwide, limited bandwidth

255unrestricted in scope ; global

IP组播路由协议用于发现组播组和建立每个组播组的分布树

client to router   :  IGMP

Router to Switch: CGMP

Router to Router : DVMRP, PIM, MOSPF, CBT

组播路由协议有以下两种方式: 密集方式路由(dense-mode routing)和稀疏方式路由(sparse-mode routing)

怎样选用这两种方式,取决于组播组的成员在整个网络中的分布,如果网络中几乎所有的路由器都为每个组播组分发组播信息则使用Dense-mode, 为了维护分布树,Dense-mode组播路由协议间歇的flood网络组播信息,Dense-mode适用于组成员密集的分布在整个网络,而且有足够的带宽来容忍flood。

sparse-mode路由协议用于每个组播只有很少的几个路由器(并不意味着每个组播组只有很少的成员),它意味着组播组成员被广泛的分散,例如Internet Muticast, sparse-mode也假设网络带宽很有限,sparse-mode不使用flood, 开始时它先建立一个空的分布树,只有当成员请求加入组播组时,它才向分布树添加一个分支。

dense-mode路由协议包括: Distance Vector Multicast Routing Protocol (DVMRP), Multicast Open Shortest Path First (MOSPF), Protocol Independent Multicast Dense Mode(PIMDM)

DVMRP大多数用于组播主干(MBONE)路由器, 它使用反路径flood(reverse path flooding), 当DVMRP接收一个包时,它在它连接的所有路径上flood这个包,除了接收路径,这样,这个包可以到达所有的LAN, 如果某个网段没有任何组播组的成员,则路由器发送一个削减信息返回分布树,这人削减信息防止后来的包发送到这个没有成员的区域,DVMRP使用它自己集成的路由协议去决定包返回源的路径, 这个点播路由协议很像RIP,它基于hop counts, 为了可以让新的主机加入组播组,DVMRP间断的flood, DVMRP很少在大的网络中使用。DVMRP的扩展性不好,因为它依靠Flood.

MOSPF(Cisco不支持)依赖于它集成的OSPF, MOSPF适用于单独的路由域,例如一个网络被一个单独的组织控制, OSPF是一个链路状态路由协议, MOSPF把组播信息加入OSPF链路状态广告, 在一个OSPF/MOSPF网络中,每个路由器基于链路状态信息维护一个详细的网络拓补, 一个MOSPF路由器使用链路状态广告去学习在连接LAN中有那个组播组被激活,它通过这个信息构造分布树,MOSPF基于包的源和目的地址来转发包,一个基于每source-group 的分离最短路径分布树被建立,分布树当网络拓补发生变化以及cache过期时被重新计算,MOSPF适用于在同一时间只有少量的soure-group被激活,不推荐MOSPF使用于不稳定的环境中。

PIM DM和DVMRP相似,都使用相反路径flooding(reverse path flooding), 当PIM DM接收一个包时,它在它连接的所有路径上flood这个包,除了接收路径,如果某个网段没有任何组播组的成员,则路由器发送一个削减信息返回分布树, 协议独立意味着它不依赖任何一个指定的点播路由协议,这个原则适用于dense-mode和sparse-mode,PIM可以使用所有的点播路由协议,PIM适用于发送者和接收者的距离很近,也适用于很少的发送者和很多的接收者,以及流量很高的情况.

Sparse-mode的两种组播路由协议:

Protocol Independent Multicast Sparse Mode (PIM SM) 和 Core-Based Trees (CBT)

PIM SM适用于只有较少的接收者,以及流量不频繁,这个协议可以同时处理几个组播数据流,非常适合应用于WAN 或者是Internet, 它定义一个集合点(rendezvous point), 一个发送者必须发送数据到这个集合点,接收者在接收数据之前要先在集合点登记, 路由器自动的优化路径, PIM可以在某些组播组中使用dense-mode的同时,在另外一些组中使用sparse-mode.

在CBT环境中,所有的组成员共享一个单独的树,组播流在相同的分布树上传输,不考虑源, CBT和Spanning-tree相似,除了为每个组播组创建一个分离的树,一个基于Core的树可以使用一个单独的路由器,或是一组路由器做为核心,路由器通过发送一个加入信息加入核心,核心发送一个确认返回路由器,一个加入信息不需要必须被核心确认,这台路由器成为分布树的一个分支

例子:

一个client发送一个IGMP 加入信息,下一跳的router接收这个信息,记录IGMP的源MAC地址, 然后产生一个CGMP包发送到switch, 交换机使用这个CGMP信息动态的在switch talbe中建立一个表项,这个表项是实际组播Host地址到交换机端口映射

文章录入:csh    责任编辑:admin

(0)

相关推荐

  • 组播的相关概念

    D类地址是用于组播,也就是以1110开头,剩下28位用于鉴别组播地址(剩下的这28是个无结构的地址), 以01005e开头的MAC地址用于表示MAC的组播地址,剩下的23位用于标识组播,IP组播地址对于MAC地址有一个映射关系,也就是IP组播的后23对应Mac组播的后23位,这样就有可能出现多个IP对应一个MAC的现象,它们之间用Arp来解析. 如果一个局域网使用组播,那么所有的主机必须加入一个all-host组(组播地址为224.0.0.1),但是Host可以决定是否去接受组播.当一个组播交通

  • java 单播、广播、组播详解及实例代码

    java 单播.广播.组播详解及实例代码 在当前网络通信中(TCP/IP也不例外)有三种通信模式:单播.广播.组播(又叫多播, 个人感觉叫多播描述的有点不恰当),其中多播出现的时间最晚,但同时具备单播和广播的优点,最具有发展前景. 一.通信方式分类: 1.单播:单台主机与单台主机之间的通信: 2.广播:单台主机与网络中所有主机的通信: 3.组播:单台主机与选定的一组主机的通信: 二.单播:    单播是网络通信中最常见的,网络节点之间的通信 就好像是人们之间的对话一样.如果一个人对另外一个人说话

  • java使用MulticastSocket实现组播

    组播是一种允许源进程将数据包发送到多个目标进程的网络技术.组播源将数据包发送到特定组播组,只有属于该组播组的进程才能接收到数据包.这些进程可以是在同一个物理网络,也可以来自不同的物理网络(只要有组播路由器支持). 组播分为无连接和面向连接组播,但是基本的组播机制是无连接的,我们这里所讲的也是无连接组播. 我们说过使用MulticastSocket类,这个类叫组播数据报套接字类,主要用来发送和接收IP组播报文.MulticastSocket是DatagramSocket的子类,它增加了加入和离开组

  • nodejs dgram模块广播+组播的实现示例

    本机IP地址是10.8.93.80, 具体信息如上图所示 根据计算得知我的广播地址应该是10.8.93.255,不是10.8.93.254哦. 其它内容就直接上代码 server.js const dgram = require('dgram'); const server = dgram.createSocket('udp4'); const multicastAddr = '224.100.100.100'; server.on('close', () => { console.log('s

  • nodejs实现UDP组播示例方法

    众所周知,UDP数据传输方式有 单播,组播,广播. 其中单播模式是最常用,这里就不再啰嗦了,网上随便都能搜到. 下面的示例主要实现简单的UDP组播方式.可以正常收发UDP数据. Server端代码 const dgram = require('dgram'); const server = dgram.createSocket('udp4'); // const local_ip = "192.168.0.xx"; const multicast_ip = "225.0.0.

  • python3通过udp实现组播数据的发送和接收操作

    本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简单.由于摄像头内置了udp协议的server端程序,本文主要使用python模拟客户端发送udp数据包. 客户端代码 import socket import re ANY = "0.0.0.0" DES_IP = "239.255.255.250" PORT = 37

  • Python使用socket实现组播与发送二进制数据

    什么是组播 点对点连接可以处理很多通信需求,不过随着直接连接数的增加,在多对通信方之间传递相同的消息会变得越来越困难. 单独地向各个接收方发送消息会耗费额外的处理时间和带宽,这对于诸如完成流视频或音频操作的应用来说,代码会出现显著的性能问题. 而使用组播(multicast)向多个端点同时发送消息可以得到更好的效率,因为网络基础设施可以确保数据包会被传送到所有接收方. 组播消息总是使用UDP发送,因为TCP需要提供一对通信系统.组播的地址被称为组播组,这是常规的IPv4地址范围的一个子集(224

  • C#网络编程之Socket编程

    目录 一:什么是SOCKET 套接字分类 二:SOCKET相关概念 1.端口 2.协议 2.1 TCP: 2.2 UDP 三:socket一般应用模式: 四:SOCKET通信基本流程图: 服务器端: 客户端: 五:示例程序 一:什么是SOCKET socket的英文原义是“孔”或“插座”.作为进程通信机制,取后一种意思.通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的).socket非常类似于电话插座.以一个电话网为例:电话的通话双方相当于相互通信的2个

  • Oracle和MySQL的高可用方案对比分析

    关于Oracle和MySQL的高可用方案,其实一直想要总结了,就会分为几个系列来简单说说.通过这样的对比,会对两种数据库架构设计上的细节差异有一个基本的认识.Oracle有一套很成熟的解决方案.用我在OOW上的ppt来看,是MAA的方案,今年是这个方案的16周年了. 而MySQL因为开源的特点,社区里推出了更多的解决方案,个人的见解,InnoDB Cluster会是MySQL以后的高可用方案标配. 而目前来看,MGR固然不错,MySQL Cluster方案也有,PXC,Galera等方案,个人还

  • DDNS 的工作原理及其在 Linux 上的实现

    DDNS 工作原理的分析 DDNS 的实现最根本的一点是当主机的 IP 地址发生变化的时候,实现 DNS 映射信息的及时更新,应用程序需要及时地获得这一信息,主要的方法可分为两大类: 一类是轮询机制,即:应用程序每隔一定的时间,去从查询主机当前的 IP 地址,并与之前的进行比较,从而判断网络地址是否发生了变化.显然,这种方法不仅效率低下,而且对每次查询 IP 地址的时间间隔很难得到一个折中的数值. 第二类方法是异步实现方式,即:每当主机的 IP 地址发生变化的时候,应用程序能够被及时地通知到.这

随机推荐