标题：多播
历史
1988年Steve Deering 首次在其博士论文中提出IP多播的概念。1992年3月IETF在因特网范围首次试验IETF会议声音的多播，当时有20多个网点可以同时听到会议的声音。
网络通信中的多播
多播是IPv6数据包的3种基本目的地址类型之一,多播是一点对多点的通信,　IPv6没有采用IPv4中的组播术语,而是将广播看成是多播的一个特殊例子.
IP多播（也称多址广播或组播）技术，是一种允许一台或多台主机（多播源）发送单一数据包到多台主机（一次的，同时的）的TCP/IP网络技术。多播作为一点对多点的通信，是节省网络带宽的有效方法之一。在网络音频/视频广播的应用中，当需要将一个节点的信号传送到多个节点时，无论是采用重复点对点通信方式，还是采用广播方式，都会严重浪费网络带宽，只有多播才是最好的选择。多播能使一个或多个多播源只把数据包发送给特定的多播组，而只有加入该多播组的主机才能接收到数据包。目前，IP多播技术被广泛应用在网络音频/视频广播、AOD/VOD、网络视频会议、多媒体远程教育、“push”技术（如股票行情等）和虚拟现实游戏等方面。 
有些应用会有这样的要求：一些分布在各处的进程需要以组的方式协同工作，组中的进程通常要给其他所有的成员发送消息。即有这样的一种方法能够给一些明确定义的组发送消息，这些组的成员数量虽然很多，但是与整个网络规模相比却很小。给这样一个组发送消息称为多点点播送，简称多播。
一、IP多播技术简介 
1．IP多播地址和多播组 
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多播技术已得到硬件、软件厂商的广泛支持。 
（1）主机
支持IP多播通信的平台包括Windows CE 2.1、Windows 95、Windows 98、Windows NT 4和Windows 2000等，运行这些操作系统的主机都可以进行IP多播通信。此外，新生产的网卡也几乎都提供了对IP多播的支持。 
（2）集线器和交换机 
目前大多数集线器、交换机只是简单地把多播数据当成广播来发送接收，但一些中、高档交换机提供了对IP多播的支持。例如，在3COM SuperStack 3 Swith 3300交换机上可启用802.1p或IGMP多播过滤功能，只为已侦测到IGMP数据包的端口转发多播数据包。
（3）路由器
多播通信要求多播源节点和目的节点之间的所有路由器必须提供对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多播应用的编程方法 
在实际应用中，编程人员通常需要自己编制底层网络应用程序来实现网上的底层通信，如具体实现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要求的版本。 
2．创建套接字
调用WSASocket()函数可以创建一个使用UDP协议的套接字，它是加入多播组的初始化套接字，并且以后数据的发送和接收都在该套接字上进行。针对IP多播通信，可将参数dwFlags设置为WSA_FLAG_MULTIPOINT_C_LEAF、WSA_FLAG_MULTIPOINT_D_LEAF和WSA_FLAG_OVERLAPPED的位和，指明IP多播通信在控制层面和数据层面都是“无根的”，只存在叶节点，它们可以任意加入一个多播组，而且从一个叶节点发送的数据会传送到每一个叶节点（包括它自己）；创建的套接字具有重叠属性。 
3．设置套接字的选项 
调用setsockopt()函数为套接字设置SO_REUSEADDR选项，以允许套接字绑扎到一个已在使用的地址上。 
4．绑定套接字
调用bind()函数绑定套接字，从而将创建好的套接字与本地地址和本地端口联系起来。对于多播通信来说，发送和接收数据通常采用同一个端口。 
5．设置多播套接字的模式 
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#中的多播
在c#中一般的代理实例（指一个代理仅可以调用一个方法）被默认为Delegate类的对象，所以通常使用delegate关键字来定义代理，利用new运算符来创建代理实例，然后使用Delegate类的方法和属性管理代理实例。
而MulticastDelegate类是用来支持多重代理的，其调用列表中可以拥有多个方法的代理。
多重代理是指将一组代理组成一个集合，由MuticastDelegate类的一个对象来管理这个代理集合，利用这个代理集合执行多个方法，这个功能叫多播。