使用广播可以将封包发送到网络中的各个节点,使用多播则仅将封包发送到网络节点的一个集合。
1.1 多播地址
为了发送IP多播数据,发送者需要一个合适的多播地址,这个地址代表一个组,IP多播地址采用D类IP地址确定多播的组,地址的范围是224.0.0.0到239.255.255.255。不过有些多播地址保留为特殊的目的使用。
224.0.0.0 -------------------------------基地址(保留)
224.0.0.1 -------------------------------本子网上的所有节点
224.0.0.2 -------------------------------本子网上的所有路由器
224.0.0.4 -------------------------------网段中所有的DVMRP路由器
224.0.0.5 -------------------------------所有的OSPF路由器
224.0.0.6 -------------------------------所有的OSPF指派路由器
224.0.0.9 -------------------------------所有RIPv2路由器
224.0.0.13------------------------------所有PIM路由器
1.2 组管理协议(IGMP)
IGMP是IPv4引入的管理多播客户和它们之间关系的协议。IGMP被开发出来用于通知路由器网络上的一个机器对指定组的数据感兴趣。
为了多播正确的工作,两个多播节点之间的所有路由器必须支持IGMP协议。任何没有开启IGMP协议的路由器仅简单地丢弃接收到的多播数据。
另外,当终端加入到多播组时,它指定TTL参数,来指明终端的多播应用程序想要经过多少个路由器来发送和接收数据,如下代码所示。
int nTtl = 0; setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,(char*)&nTtl,sizeof(nTtl));
l 初始TTL为0的多播封包被限制在同一个主机
l 初始TTL为1的多播封包被限制在同一个子网
l 初始TTL为32的多播封包被限制在同一个站点
l 初始TTL为64的多播封包被限制在同一个地区
l 初始TTL为128的多播封包被限制在同一个大陆
l 初始TTL为255的多播封包没有范围限制
注意:许多多播路由器拒绝转发目的地址在224.0.0.0~224.0.0.255之间的任何多播数据报,不管它的TTL是多少。
每个多播传输仅从一个网络接口发出,即便是主机有多个多播接口。可以使用套接字选项IP_MULTICAST_IF改变默认发送数据接口,如下代码所示。
struct in_addr addr;
setsockopt(sock,IPPROTO_IP,IP_MULTICAST_IF,&addr,sizeof(addr));
其中addr是本地机器想要外出的接口。设置为地址INADDR_ANY可以恢复使用默认接口。
1.3带源地址的IP多播
带源地址的IP多播允许加入组时指定要接收哪些成员的数据。有两种方式:
1) “包含”方式,这种方式下,为套接字指定N个有效源地址,套接字仅接收来自这些源地址的数据;使用IP_ADD_SOURCE_MEMBERSHIP和IP_DROP_SOURCE_MEMBERSHIP。
2) “排除”方式,这种方式下,为套接字指定N个源地址,套接字将接收来自这些源地址之外的数据;使用IP_BLOCK_SOURCE(排除某个源地址)和IP_UNBLOCK_SOURCE(从排除集合中移除此源地址)以上两种方式输入参数都是ip_mreq_source结构。
另:【转】
多播范围管理
多播范围管理确定多播流能够从它的源传输的范围。限制多播的范围可以防止商业数据传输到网络以外,从此提供了安全性。在多播组管理中,支持多播的路由器跟踪路由器直接连接的子网的多播组成员。支持多播的路由器只将多播数据转发给拥有组成员的子网,因而节省了网络带宽。多播分布树定义从源到多播组的数据传输,然后构建一个包含一组路由器和链路的优化分布树,以便让组成员接收来自源的数据。我们来仔细研究一下每一种网络传输技术。
传统上,IP多播使用IP多播应用和多播路由器中的TTL参数来管理多播分布。当你定义IP多播中的TTL值时,不会在TTL值之外传输内容。例如,如果你把Site Server’s Active Channel Multicaster TTL值设置为16,那么你确保Site Server的Web内容不在16个路由器跳以外多播。每一个多播数据包都在它的IP题头中携带一个TTL值。与单播相似,每当多播路由器转发多播数据包时,路由器将数据包的TTL值递减1。在默认情况下,路由器不转发TTL值=1的数据包。你可以在多播路由器的每一个接口上将默认的TTL域值设置为其他值。例如,如果你将路由器接口上的TTL域值设置为10,那么只有TTL值大于10的数据包才能通过这个路由器接口。
基于TTL的多播范围管理存在两个缺点。第一,可能难以定义多播应用中的TTL值。如果TTL值太大,你的多播数据可能会超出你的网络。如果TTL太小,你的多播数据可能不会到达多播范围以外的有关接收者。第二,如果有人在某个路由器接口上设置了自定义域值,那么你的多播范围可能无法预测。例如,你无法将你的网络分解成多播区域,以便将多播应用限制在这些区域,因为如果一个路由器拥有的接口TTL域值小于一个数据包的TTL值,路由器将转发这个数据包。
要克服这些限制,IETF(Internet工程任务组,Internet Engineering Task Force)提出将Administratively Scoped IP Multicast作为RFC 2365的Internet标准(1998年7月)。管理范围允许你使用管理范围内的地址,使多播的范围达到某个网络边界(在你的机构中)。IETF已经将239.0.0.0~239.255.255.255之间的IP多播地址指定为管理范围内的地址,用于在内部网络中本地使用。你可以在你的网络边界上将支持管理范围寻址的路由器配置为仅限于你的专用多播区域,也可以在你的网络中定义多个独立的多播区域,这样只会在指定的区域中传输敏感的多播数据。
多播网络只将数据转发给在界定多播区域的相应多播组中拥有接收者的子网(选择转发是多播和广播最重大的区别,广播将大量数据发送到所有子网)。要将多播数据转发给界定多播区域中的接收者,路由器需要它们的本地子网上的组成员信息。每一个子网上的一个路由器定期向本地子网上的所有计算机多播成员查询消息。本地子网上的计算机(组成员)以它们所属组的成员报告来响应路由器的查询消息。路由器将这些成员信息保存在它的组数据库中。本地的子网计算机也向它们从属的组多播成员报告。当其他组成员接收到成员计算机的报告时,组成员推迟它们的成员报告,并等待一段不确定的时间。这个等待期间减少了成员报告通信和路由器处理时间。只要一个路由器得知本地子网上的一个组成员,这个路由器就会把多播数据转发给这个子网,而且其他组成员也将接收到这个多播数据。当新成员加入一个组时,该成员不需要等待来自路由器的下一个成员查询。相反,新成员立即发送成员报告,就像响应成员查询一样。当路由器接收到这个报告时,如果新成员是子网多播组的第一个成员,那么路由器将立即向这个新成员驻留的子网转发多播数据。
转载于:https://blog.51cto.com/david514419/1191905