UNPv1第十九章:多播

单播地址标识单个接口,广播地址标识所有接口,多播地址标识一组接口。多播数据报仅对感兴趣的接口接收。

单播、广播、组播的区别小结(源自http://www.cnblogs.com/Ewin/archive/2008/11/25/1340752.html)

1.单播:

主机之间一对一的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用单播模式,具体的说就是IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。
单播的优点:

  1. 服务器及时响应客户机的请求
  2. 服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务。

单播的缺点:

  1. 服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。
  2. 现有的网络带宽是金字塔结构,城际省际主干带宽仅仅相当于其所有用户带宽之和的5%。如果全部使用单播协议,将造成网络主干不堪重负。现在的P2P应用就已经使主干经常阻塞。而将主干扩展20倍几乎是不可能。

2.广播:

主机之间一对所有的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。
广播的优点:

  1. 网络设备简单,维护简单,布网成本低廉
  2. 由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。

广播的缺点:

  1. 无法针对每个客户的要求和时间及时提供个性化服务。
  2. 网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。
  3. 广播禁止允许在Internet宽带网上传输。

3.组播:

主机之间一对一组的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。
组播的优点:

  1. 需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点。
  2. 由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个组播,所以其提供的服务可以非常丰富。
  3. 此协议和单播协议一样允许在Internet宽带网上传输。

组播的缺点:

  1. 与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补。
  2. 现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中

4.多播套接口选项:

IP_ADD_MEMBERSHIP和IPV6_ADD_MEMBERSHIP
在一个指定的本地接口上加入一个多播组。我们用IPv4中的单播地址或IPv6中的接口索引去指定本地接口。当加入或离开一个组时,要用到下面两个结构。

struct ip_mreq{
  struct in_addr  imr_multiaddr;  /* IPv4 class D multicast addr */
  struct in_addr  imr_interface;  /* IPv4 add of local interface */
};
struct ipv6_mreq{
  struct in6_addr  ipv6mr_multiaddr;  /* IPv6 multicast addr */
  unsigned int  ipv6mr_interface;  /* interface index or 0 */
};

如果本地接口指定为通配地址(在IPv4中为INADDR_ANY)或者IPv6中的索引0,那么本地接口就由内核来选择。
如果某台主机上当前有一个或多个进程属于某个接口上的一个给定多播组,我们就称该主机在那个接口上属于所给定组。

IP_DROP_MEMBERSHIP 和 IPV6_DROP_MEMBERSHIP
在一个指定的本地接口上离开一个多播组。
如果一个进程加入了一个组但从未明确地离开那个组,当套接口关闭时(或者显示地关闭或者因进程终止),成员关系将自动地去掉。同一个主机上的多个进程都加入同一个组也是可以的,这种情况下,主机一直是那个组的成员,知道最后一个进程离开那个组。

IP_MULTICAST_IF 和 IPV6_MULTICAST_IF
给从本套接口上发送的外出多播数据报指定接口。这个接口在IPv4中被指定为in_addr结构,在IPv6中被指定为接口索引。如果其值为IPv4中的INADDR_ANY或IPv6中的接口索引0,这将去掉以前通过这个选项指派给此套接口的接口,系统于是给每个外出数据报选择接口。

IP_MULTICAST_TTL 和 IPV6_MULTICAST_HOPS
给外出的多播数据报设置IPv4的TTL或IPv6的跳限。如果不指定,那么缺省值都将为1,也就是限制数据报在本地子网。

IP_MULTICAST_LOOP 和 IPV6_MULTICAST_LOOP
打开或关闭多播数据报的本地自环即回馈。缺省时回馈是打开的:如果一个主机在发送接口上属于一个多播组,该主机上的进程发送的每个数据报的复本也会回馈,被主机当作接收的数据报处理。

5.mcast_join和相关函数

#include "unp.h"
int mcast_join(int sockfd, const struct sockaddr * sa, socklen_t salen, const char * ifname, u_int ifindex);  //返回: 成功时为0,出错时为-1
//mcast_join函数加入一个多播组,这个组的IP地址在由addr指向的套接口地址结构中,它的长度由salen指定。

int mcast_leave(int sockfd, const struct sockaddr * sa, socklen_t salen); 
//返回: 成功时为0,出错时为-1
//mcast_leave离开一个多播组,这个组的IP地址在由addr指向的套接口地址结构中。

int mcast_set_if(int sockfd, const char * ifname, u_int ifindex); 
//返回: 成功时为0,出错时为-1
//mcast_set_if给外出多播数据报设置缺省的接口索引。如果ifname非空,则指定接口名字,否则ifindex大于0,则指定了接口索引。

int mcast_set_loop(int sockfd, int flag);  
//返回: 成功时为0,出错时为-1
//mcast_set_loop设置回馈选项为1或0

int mcast_set_ttl(int sockfd, int ttl); 
//返回: 成功时为0,出错时为-1
//mcast_set_ttl设置IPv4的TTL或IPv6的跳限。

int mcast_get_if(int sockfd); //返回: 成功时为非负接口索引,出错时为-1
int mcast_get_loop(int sockfd);  //返回: 成功时为当前回馈标志,出错时为-1
int mcast_get_ttl(int sockfd); //返回: 成功时为当前TTL或跳限,出错时为-1

你可能感兴趣的:(UNPv1第十九章:多播)