组播的优点
![18135602 18135602](http://static.oschina.net/uploads/img/201312/21144357_v1Da.jpg)
当服务器需要向n个客户端发送同样的数据包时
- 单播:服务器向n个不同的客户端发送n次相同的数据包。
- 组播:服务器向一个组播地址发送一次数据包。
组播地址:
IP头中源地址为A/B/C类地址,IP头中的目标地址改为D类地址,一个地址代表一个组。
IP组播地址是不能成为源地址的,只能是目标地址。它们不能作为数据报的源字段或者出现在源路由和路由记录选项中。
D类地址是从224.0.0.0到239.255.255.255之间的IP地址,其中224.0.0.0到224.0.0.255是被保留的地址。组播协议的地址范围类似于一般的单播地址,被划分为两个大的地址范围,239.0.0.0—239.255.255.255是私有地址,供各个内部网在内部使用,这个地址的组播不能上公网,类似于单播协议使用的192.168.X.X和10.X.X.X。224.0.1.0— 238.255.255.255是公用的组播地址,可以用于Internet上。
组播中数据的传送:
IP组播是指一个IP报文向一个“主机组”的传送,这个包含零个或多个主机的主机组由一个单独的IP地址标识。主机组地址也称为“组播地址”,或者D类地址。除了目的地址部分,组播报文与普通报文没有区别,网络尽力传送组播报文但是并不保证一定送达。主机组的成员可以动态变化,主机有权选择加入或者退出某个主机组。主机可以加入多个主机组,也可以向自己没有加入的主机组发送数据。主机组有两种:永久组和临时组。永久组的IP地址是保留地址。临时组的地址则使用除永久组地址外的非保留D类地址。
IGMP(internet网关管理协议)是IP组播的基础.在IP协议出现以后,为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A,B要进行组播通信,那么,位与A,B之间的所有路由器必须都要支持IGMP协议,否则A,B之间不能进行通信。当一个应用加入一个组播组后,就会向这个子网的所有路由器发送一个IGMP加入命令,告诉子网内有人对发送到某一个组播组的数据感兴趣。路由器也会定时向子网内的所有终端发送一条查询消息,用于询问是否还有人对某个组播组的数据感兴趣。如果有的话,终端就会回应一条IGMP消息,路由器则继续转发这个组播组的数据。如果没有人回应这条消息,那么路由器就认为已经没有终端对这个组播组的数据感兴趣,就不会在转发关于这个组播组的数据了。在IGMP第二版中,一个终端退出组播组以后,会向路由器发送一个退出消息,路由器也会通过这个消息来判断是否还要继续转发关于这个组播组的数据了(IGMP第一版中没有这个功能)[这些事情都是底层的系统做的,你只要坐享其成就好了]。
主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。
组播使用:
1. 建立支持数据报的socket。
2. 把socket和本地的一个端口绑定(以后会通过这个端口进行数据的收发)。
3. 通过socket加入一个组播组。
4. 然后就能通过socket进行数据的收发。
5. 通过sockept离开一个组播组。
6. 关闭socket 。
如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据。
在加入组播组以后,就可以在指定的组播组收发信息了。
因为任何主机都可以加入任意的组播组,那么服务器与客户端可以通过自定义的协议交流,用来排除服务器不感兴趣的主机。