1988年Steve Deering 首次在其博士论文中提出IP多播的概念。多播是IPv6
数据包的3种基本目的地址类型之一,多播是一点对多点的通信,IPv6没有采用IPv4中的
组播术语,而是将广播看成是多播的一个特殊例子。
定义
随着计算机网络的发展和个人计算机的普及,人们能够方便的在网络上畅游,进行网络通信或者获取自己所需的信息资源。此外,人们也越来越依赖于网络计算。大多数企业都建立了先进的网络,连接各个雇员和他们的计算机、工作站。有时,我们工作中的重要的信息只能通过网络得到,这些信息可能在企业的专用网络上,也可能在因特网上。
因特网是个公用的网络,连接全世界的各个大学、公司、非盈利组织、个人和政府机关。随着现在宽带的发展,诸如远程教学、视频会议、网络游戏等新兴的因特网应用越来越受欢迎,而且有时变得很必需。这些应用涉及到点对点或者多点对多点的通信,与传统的单播或者广播有很大的不同。
1988年,Deering提出了IP多播的概念,从此IP多播技术得到了广泛的关注。多播介于单播通信和广播通信之间,它可以将发送者发送的数据包发送给位于分散在不同子网中的一组接收者。
原理
多播的基础概念是“组”。一个多播组(multicast group)就是一组希望接收特定数据流的接收者。这个组没有物理或者地理的边界:组内的主机可以位于互联网或者专用网络的任何地方。多播组中的每~个节点被称为多播组成员(multicastgroupmember)。
应用
在多播的诸多应用中,均可实现单播,但是随着接收者的增多,需要发送的数据包里线性增长,对于多个接收者,需要发送同一个数据包的n份拷贝,这样通信量就会成倍的增加,也会占用网络的许多带宽,有时会引起网络堵塞。但是多播通信IP数据包仅发送一次。路由器会自动的转发到位于不同网段上的每一个接收者,可以使在网络中传输的报文拷贝的数量最小。所以多播是很有必要的。
多播通信模型的一个关键的特性是提供了间接标识的多播组,其中发送方和接收方都不需要知道对方的具体情况。发送方只需要向一个多播地址发送分组而接收方只需要告诉网络自己希望接收发送这个地址的分组。
用户的数据要从一个终端发送到另一个终端,首先要确定传输路由,不同的通信方式,其确定路由的方式也不同。如今网络的通信方式主要有以下几种:
一般要求多播服务的业务对带宽和实时性要求较高,涉及用户较多,占用的资源也多,因此有必要优化多播路由。多播路由算法就是要寻求最优多播树,理想有效的路由算法将设计一棵仅覆盖多播组成员的树,并体现如下特征:树随着组成员变化动态更新;最小化节点需要保存的状态信息量;避免链路和节点的流量集中;根据费用函数优化路由。
网络多播
IP多播(也称多址广播或
组播)技术,是一种允许一台或多台主机(多播源)发送单一
数据包到多台主机(一次的,同时的)的TCP/
IP网络技术。多播作为一点对多点的通信,是节省
网络带宽的有效方法之一。在网络音频/视频广播的应用中,当需要将一个
节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有多播才是最好的选择。多播能使一个或多个多播源只把数据包发送给特定的多播组,而只有加入该多播组的主机才能接收到数据包。目前,IP多播技术被广泛应用在网络音频/视频广播、
AOD/VOD、
网络视频会议、多媒体远程教育、“push”技术(如股票行情等)和
虚拟现实游戏等方面。
有些应用会有这样的要求:一些分布在各处的进程需要以组的方式协同工作,组中的进程通常要给其他所有的成员发送消息。即有这样的一种方法能够给一些明确定义的组发送消息,这些组的成员数量虽然很多,但是与整个网络规模相比却很小。给这样一个组发送消息称为多点点播送,简称多播。
IP多播通信必须依赖于IP多播地址,在IPv4中它是一个
D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。其中,局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为
路由协议和其它用途保留的地址,
路由器并不转发属于此范围的IP包;预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或
网络协议;管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。
使用同一个IP
多播地址接收多播
数据包的所有
主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。
2.IP多播技术的硬件支持
要实现IP多播通信,要求介于多播源和接收者之间的
路由器、
集线器、
交换机以及主机均需支持IP多播。目前,IP多播技术已得到硬件、软件厂商的广泛支持。
支持IP多播通信的平台包括Windows CE 2.1、Windows 95、Windows 98、Windows NT 4和Windows 2000等,运行这些操作系统的主机都可以进行IP多播通信。此外,新生产的网卡也几乎都提供了对IP多播的支持。
目前大多数集线器、
交换机只是简单地把多播数据当成广播来发送接收,但一些中、高档交换机提供了对IP多播的支持。例如,在3COM SuperStack 3 Swith 3300交换机上可启用802.1p或IGMP多播过滤功能,只为已侦测到IGMP
数据包的
端口转发多播数据包。
多播通信要求多播源
节点和目的节点之间的所有路由器必须提供对
Internet组管理协议(IGMP)、多播
路由协议(如PIM、DVMRP等)的支持。
当一台主机欲加入某个多播组时,会发出“主机成员报告”的IGMP消息通知多播路由器。当多播路由器接收到发给那个多播组的数据时,便会将其转发给所有的多播主机。多播路由器还会周期性地发出“主机成员查询”的IGMP消息,向
子网查询多播主机,若发现某个多播组已没有任何成员,则停止转发该多播组的数据。此外,当支持IGMP v2的主机(如Windows 98/2000计算机)退出某个多播组时,还会向
路由器发送一条“离开组”的IGMP消息,以通知路由器停止转发该多播组的数据。但只有当子网上所有主机都退出某个多播组时,路由器才会停止向该子网转发该多播组的数据。
使用多播
路由协议,路由器可建立起从多播源
节点到所有目的节点的多播
路由表,从而实现在子网间转发多播数据包。例如,PIM(协议独立多播)就是一种多播路由协议,它有两种类型:稀疏模式(sparse-mode)和密集模式(dense-mode)。以Cisco 2621路由器为例,启用IP多播转发功能的基本设置如下:
c2621(config)# ip multicast-routing 启动IP多播,使
路由器成为一个多播路由器
c2621(config)# int f0/0 配置
快速以太网端口0
c2621(config-if)# ip pim dense-mode(或sparse-mode)启动PIM,同时激活
IGMP协议c2621(config-if)# int f0/1 配置快速以太网端口1
c2621(config-if)# ip pim dense-mode(或sparse-mode)
编程方法
在实际应用中,编程人员通常需要自己编制底层网络应用程序来实现网上的底层通信,如具体实现IP多播通信的功能。编制底层网络应用程序通常要借助于网络数据通信
编程接口,而在不同的操作系统中所提供的
网络编程接口是有所不同的,如在Microsoft Windows环境下的网络编程接口就是Windows
套接字(Windows Socket,简称Winsock)。
Winsock提供了包括TCP/IP、IPX等多种
通信协议下的编程接口。不同的Windows版本支持不同的Winsock版本,其中Windows 95等早期版本本身只支持Winsock1.1(16位)下的编程(可以通过安装相关的软件包使其支持Winsock2.0),而Windows98、Windows NT4.0、Windows 2000则直接支持Winsock2.0(32位)。Winsock2.0是Winsock1.1的扩展,除兼容Winsock1.1 API外,还定义了一套可支持IP多播的与协议无关的API。
使用Winsock 2.0实现IP多播的一般步骤如下:
1.初始化Winsock资源
在使用Winsock之前,必须调用WSAStartup()函数初始化Windows Sockets DLL。它允许应用程序或DLL指定Windows Sockets API要求的版本。
调用WSASocket()函数可以创建一个使用UDP协议的套接字,它是加入多播组的初始化套接字,并且以后数据的发送和接收都在该套接字上进行。针对IP多播通信,可将参数dwFlags设置为WSA_FLAG_MULTIPOINT_C_LEAF、WSA_FLAG_MULTIPOINT_D_LEAF和WSA_FLAG_OVERLAPPED的位和,指明IP多播通信在控制层面和数据层面都是“无根的”,只存在叶节点,它们可以任意加入一个多播组,而且从一个叶节点发送的数据会传送到每一个叶节点(包括它自己);创建的
套接字具有重叠属性。
3.设置套接字的选项
调用setsockopt()函数为套接字设置SO_REUSEADDR选项,以允许套接字绑扎到一个已在使用的地址上。
4.绑定套接字
调用bind()函数绑定套接字,从而将创建好的套接字与本地地址和本地端口联系起来。对于多播通信来说,发送和接收数据通常采用同一个端口。
WSAIoctl()函数的命令码SIO_MULTICAST_LOOP用来允许或禁止多播通信时发送出去的通信流量是否也能够在同一个套接字上被接收(即多播返回)。值得注意的是,在Windows 95/98/NT 4中,默认是允许多播返回,但不能设置禁止,否则会出错;只有在Windows 2000以上版本中,才能设置允许/禁止多播返回。
WSAIoctl()函数的命令码SIO_MULTICAST_SCOPE用来设置多播传播的范围,即生存时间TTL。每当多播
路由器转发多播
数据包时,数据包中的TTL值都会被减1,若数据包的TTL减少到0,则路由器将抛弃该数据包。TTL的值是多少,多播数据便最多能经过多少个多播路由器。例如,TTL值为0,则多播只能在
本地主机的多个套接字间传播,而不能传播到“网线”上;TTL值为1(默认值),则多播数据遇到第一个路由器,便会被它“无情”地丢弃,不允许传出本地网络之外,即只有同一个网络内的多播组成员才能收到多播数据。
在c#中一般的代理实例(指一个代理仅可以调用一个方法)被默认为Delegate类的对象,所以通常使用delegate
关键字来定义代理,利用new运算符来创建代理实例,然后使用Delegate类的方法和属性管理代理实例。而MulticastDelegate类是用来支持多重代理的,其调用列表中可以拥有多个方法的代理。
多重代理是指将一组代理组成一个集合,由MuticastDelegate类的一个对象来管理这个代理集合,利用这个代理集合执行多个方法,这个功能叫多播。