UDP组播

随着internet的飞速发展,利用internet进行协作开发的项目越来越多。
对某些应用而言,如分布式数据库开发,一个开发工作组有很多人需在不同的地点协作并经常交换情况。
​在组的规模比较小的情况下,只需点对点交换信息即可;
​如果组的规模比较大,点对点交换信息不管对网络还是对信息发送者,都是一种负担,代价昂贵。
​有时虽可用广播的方式进行处理,但如果在一个上百万节点的网络上向数千台主机进行广播是很低效的甚至是不大可能的。
​一则绝大部分机器对此不感兴趣,造成信息垃圾;
​更糟糕的是,部分主机虽需要此信息但可能被误认为对此信息不感兴趣而收不到此项信息。
​因此,我们需要一种办法让本身规模较大而相对互连网又较小的工作组能相互方便、快捷地传递信息。
​为此,我们引进了 IP组播的概念。  


​1.硬件组播的含义  

1.1 含义  
硬件组播(multicasting)是一种多点投递的形式,它使用硬件技术,通过使用大量组播地址来通信。
​当某一组机器需要通信时,选择一个组播地址,并配置好相应的网络接口硬件,识别组播地址,从而收到该组播地址上分组的拷贝。  

    
1.2 组播与广播、单播  
广播(broadcasting)是多点投递的最普遍的形式,它向每一个目的站投递一个分组的拷贝。
​它可以通过多个单次分组的投递完成,也可以通过单独的连接传递分组的拷贝,直到每个接收方均收到一个拷贝为止。  


​在多数网络中,用户是通过把分组分送给一个特殊保留的地址即广播地址(broadcast address)来进行广播投递,
​它的主要缺点是会耗费大量的主机资源和网络资源。  


​单播(unicasting)是指只有一个目的地的数据报传递。
​从投递目的地的数量而言,单播和广播均可看作是组播的一个子集。
​单播可以看作仅包括一台机器群组的组播;
​广播可以看作包含了所有机器群组的组播。
​但从数据报的投递方式而言,单播、广播和组播还是有较大的区别。  

    
2.IP组播的基本概念  
2.1 含义  
IP组播(IP multicasting)是对硬件组播的抽象,是对标准IP网络层协议的扩展。
​它通过使用特定的IP组播地址,按照最大投递的原则,将IP数据报传输到一个组播群组(multicast group)的主机集合。
​它的基本方法是:
​    当某一个人向一组人发送数据时,它不必将数据向每一个人都发送数据,只需将数据发送到一个特定的预约的组地址,
​    所有加入该组的人均可以收到这份数据。
​    这样对发送者而言,数据只需发送一次就可以发送到所有接收者,大大减轻了网络的负载和发送者的负担。  

    
2.2 IP组播成员  
IP组播中各个成员可以不受地域的限制,分布于各个独立的物理网络上,其关系也是动态的,
​一台主机可以在任何时候加入或者退出某个群组,也可以是任意群组的成员,
​其成员关系决定了该主机是否接收发送给该群组的组播数据报;
​同时,不是某个群组的成员也可以向某个群组发送组播数据报,使之具有更大的灵活性。
​  

参与组播的主机可以分为三个级别:  
  级别0: 主机不能收、不能发IP组播数据报  
  级别1: 主机只能发、不能收IP组播数据报  
  级别2: 主机既能收、也能发IP组播数据报  
级别0的主机不受组播收发数据报的影响,
​   唯一的例外是在某些类型的局域网,级别1或级别2的主机可能将组播数据报误送给级别 0 的主机(这种情况将在 3.2.1中讨论),
​   级别 0 的主机需要仔细检查所有到达的数据报的目的IP地址(主机对任何数据报均需这样),丢弃误投的数据报。  

级别1的主机可以分享部分基于组播的服务,
​   比如资源定位、状态报告、发送IP组播数据报,但不能加入到任何主机组。
​   一个主机仅需极少数代码就可以从级别0升级到级别1,
​   即IP软件允许某个应用程序指定一个组播地址作为其目的IP地址,并将组播地址映射为相应网络的硬件组播地址(具体映射方法在3.2中讨论)  

级别2的主机可以可以使用IP组播所有功能,
​   除可以使用级别1主机所能使用的功能外,可以自由加入和离开主机组、可以发送IP组播数据报等。
​   要实现此功能,它要求实现internet群组管理协议(internet group management protocol,简称IGMP)、IP扩展和主机的本地网络服务接口。

3.    IP组播地址  
3.1 基本概念  
3.1.1 定义  
根据internet NIC关于IP地址的规定,IP地址共分为A-E 共5类,
​其中A-C类目前应用的普通IP地址,
​E类地址保留为将来使用,
D 类地址即为组播地址,其网络号为固定的1110(第0~3位),
第4~31位定义了某一特殊的组播地址,范围为 224.0.0.0~239.255.255.255,共有228个约27亿个地址。  

IP组播地址仅能作为目的地址。它们不能作为数据报的源字段或者出现在源路由和路由记录选项中。  

3.1.2 分类  
IP组播地址由internet NIC负责管理,和协议端口一样,有一部分是保留的,仅供特殊群组成员使用,
​不管有无成员,该地址均要保留,这部分地址称为知名(well-known)地址;
​其余地址则不一样,仅供临时使用,被称为临时组播群组(transient multicast group),可以按需创建,成员可以动态调整,但在成员数目为0时撤销。  


​3.1.3 部分知名IP组播地址  

如上所述,IP组播地址范围是224.0.0.0~239.255.255.255,下面列出部分知名或已用的IP组播地址。
​实际上, 224.0.0.0---224.2.255.255的绝大部分地址已被使用,建议使用时避开上述地址(详细使用情况请参阅RFC 1700)。  

  224.0.0.0 基础地址,保留,不能被任何群组使用  
  224.0.0.1 全主机群组(all hosts group),指参加本IP组播的所有主机、路由器、网关(不是指整个互连网)  
  224.0.0.2 本子网上的路由器(all routers on a LAN)  
  224.0.0.4 DVMRP*路由器(DVMRP Routers)  
  224.0.0.5 本子网上的OSPF*路由器(all OSPF routers on a LAN)  
  224.0.0.6 本子网上被指定的OSPF路由器(all designated OSPF routers on a LAN)  
  224.0.1.1 网络时间协议(Network Time Protocol,NTP)  
  224.0.5.000-224.0.5.127 蜂窝式数字信息包数据发送主机组(CDPD Groups)  
  224.1.0.0-224.1.255.255 基于流的协议组播主机组(Stream Protocol Multicast Groups)  
  224.2.0.0-224.2.255.255 多媒体会议呼叫(Multimedia Conference Calls)  
*注:DVMRP是Distance vector multicast routing protocol的缩写,意为距离矢量组播选路协议,是用来生成组播路由;
​         OSPF 是open shortest path first,意为开放最短路径最先,是IETF设计的一种路由协议。  

    
3.2 IP组播地址与网络硬件组播地址的映射  
3.2.1 IP组播地址与以太网硬件组播地址的映射  
3.2.1.1 映射方法  
以太网硬件地址是48位,而IP地址是32位,有效IP组播地址是28位,
​以太网支持IP组播地址到以太网组播地址的映射,他们之间的映射很巧妙而简单,
​主要规则如下:  

  将IP组播地址的低23位简单地代替特定的以太网地址01.00.5e.00.00.00(16进制)中的低23位。  

​例如:
​       IP组播地址                     224.66.60.89          (16进制,其2进制为:1110 0000.0100 0010.0011 1100.0101 1001)
​       映射到以太网的地址为:01.00.5e.66.60.89(16进制)。   

按此规则,IP组播地址范围为224.0.0.0~239.255.255.255,映射到以太网组播地址为01.00.5E.00.00.00~ 01.00.5E.7F.FF.FF  
这样做一是因为映射方法简单,便于计算和实现;
​二是可以包括绝大部分组播地址了;
​三是IP组播地址映射后仅使用以太网地址的固定部分,有利于排错和查找,不易与其它使用以太网的协议发生冲突和干扰。  

  
​3.2.1.2 不同IP组播地址映射到相同以太网地址的讨论  

在IP组播地址映射到以太网地址的过程中,有人可能发现一个有趣的现象,多个不同的IP组播地址映射到了相同的以太网地址
​例如:IP组播地址 225.118.100.100和226.246.100.100映射到以太网的地址均为01.00.94.118.100.100。
​这是为什么呢,下面从机理上作一分析:  

由于IP组播地址的有效位为28位,而映射到以太网时仅取低23位(第9~31位),
​高5位(实际是IP组播地址的第4~8位,下同)的地址信息在映射过程实际上是没有用而被丢掉了,
​这样如果低23位地址信息一样,则不管高5位地址的值是多少,其映射的以太网地址都是一样的。如下图: 

   
  IP组播地址 : 1110 gggg gddd dddd dddd dddd dddd dddd 
         |----|----||--------------------------|  
   组播地址的网络ID  高5位           低23位  
   
高9位映射时信息均被丢掉 映射时直接代替特定以太网地址的低23位  
那么,任意两个IP组播地址映射到以太网地址时,其地址相同的概率为多少呢?  
  任意两个IP组播地址如果低23位相同,则不管高5位的值是否相同,二者映射的以太网地址都是一样的,低23位相同的可能性为 ,高5位的2进制组合有25种,这样可知:  
  任意两个IP组播地址映射到以太网地址时,其地址相同的概率P= ,很小,约为百万分之3.8,所以这种映射方法还是相当可靠的。  
    
3.2.2 IP组播地址与其它网络组播地址的映射  
环形网和总线网根据IEEE802.2标准,直接支持组播,和以太网一样直接处理组播。
​对于支持网络广播而不支持组播的网络,如实验以太网,则将IP 组播地址简单映射为本地广播地址,不过这样增加了本地网络主机的开销。
​点对点连接的两台主机(或者一台主机和支持组播的路由器),组播数据报直接投递。
​对存储转发网络(store-and forward network),如ARPANET或者公用X.25网络,IP组播地址映射为本地的知名IP组播路由器。

4 实现IP组播的基本模型  
要实现IP组播要对IP服务接口、IP模块、本地网络服务接口以及本地网络模块分别进行扩展。

​4.1 多播的编程 
多播的程序设计使用setsockopt()函数和getsockopt()函数来实现,组播的选项是IP层的其选项值和含义参见11.5所示。
 表11.5 多播相关的选项:
getsockopt()/setsockopt()的选项                   含 义 
IP_MULTICAST_TTL                                     设置多播组数据的TTL值 
IP_ADD_MEMBERSHIP                                 在指定接口上加入组播组 
IP_DROP_MEMBERSHIP                              退出组播组 
IP_MULTICAST_IF                                        获取默认接口或设置接口 
IP_MULTICAST_LOOP                                 禁止组播数据回送 

1. 选项IP_MULTICASE_TTL 
​    选项IP_MULTICAST_TTL允许设置超时TTL, 范围为0255之间的任何值.
​    例如:
​       unsigned char ttl=255; 
​       setsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl)); 

2. 选项IP_MULTICAST_IF 
选项IP_MULTICAST_IF用于设置组播的默认网络接口, 会从给定的网络接口发送,另一个网络接口会忽略此数据。
例如:
​    struct in_addr addr; 
​    setsockopt(s,IPPROTO_IP,IP_MULTICAST_IF,&addr,sizeof(addr)); 
参数addr是希望多播输出接口的IP地址,使用INADDR_ANY地址回送到默认接口。 
默认情况下,当本机发送组播数据到某个网络接口时,在IP层,数据会回送到本地的回环接口
​3. 选项IP_MULTICAST_LOOP用于控制数据是否回送到本地的回环接口。
例如:
unsigned char loop; 
setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop)); 
参数loop设置为0禁止回送,设置为1允许回送。

​4. 选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP 加入或者退出一个组播组。
通过选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP,对一个结构struct ip_mreq类型的变量进行控制。
struct ip_mreq原型如下:
struct ip_mreq  { 
​  struct in_addr imn_multiaddr; /*加入或者退出的广播组IP地址*/ 
​  struct in_addr imr_interface; /*加入或者退出的网络接口IP地址*/ 
}; 
选项IP_ADD_MEMBERSHIP用于加入某个广播组,之后就可以向这个广播组发送数据或者从广播组接收数据。
此选项的值为mreq结构,
成员imn_multiaddr是需要加入的广播组IP地址,
成员imr_interface是本机需要加入广播组的网络接口IP地址。
例如:
struct ip_mreq mreq; setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)); 

5 IP组播的应用  
由于IP组播能有效减少网络和主机开销,较单播和广播有其独特优越性,因此,IP组播已经得到了广泛的应用,
​主要有几个方面:
​1、基于因特网的视频组播。这方面的应用很广泛,如实时视频会议系统、远程教学系统、远程演示系统和视频点播系统(VOD)等等。
​2、特别互联网工作组(Special internet group,简称SIG)。它是由世界各地的具有共同兴趣的人组成,
​      可以包括体育、音乐、计算机软件、硬件等一切可以引起共同兴趣的东西。比较有名的有E-MAIL讨论组和ACM的技术讨论组。  

  
6 部分IP组播相关的网址  
如对IP组播的有关问题想进一步钻研,读者可以到以下站点查阅有关资料。  
  http://www.rfc-editor.org/ 一个集全部RFC文档之精华的站点,不过是全英文的,读者需要一定英文基础  
  http://www.rfcsite.yeah.net/ 一个RFC文档的中文界面站点,具体内容仍是英文  
  http://www.rfc.at.china.com/ 一个RFC文档的全中文站点,不过中文的RFC文档不是很多  
  http://www.ieee.org/ IEEE的官方站点,有很多有关组播的学术论文,也是全英文的  
1、网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,
​     此时信息的接收和传递只在两个节点之间进行。
​     单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已。
     ​例如,你在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是单播数据传输方式。 


​2、多播也叫组播,是一种多地址的广播,发送和接受端是一对多的关系,服务器只向特定的一组用户发送一个数据包,
​     组中的用户可以共享这个数据包,组外的用户是无法接受到的,
​     多播需要全网内的路由器支持多播,否则许多用户是受不到多播数据的,在广域网实现比较困难 。
​ 

3、广播也是一对多的关系,不同的是,广播把数据包的copy发给网络中所有用户,
​     而有的用户此时并不需要数据包,这实际上将造成带宽资源的一定浪费,广播无法通过路由器,
​     组播没有这个限制,只要加入组就能收到数据包,可以说融合了单播和广播的优点 。
​ 

4、ICMP主要用于网络设备和结点之间的控制和差错报告报文的传输。 
     从因特网的角度看,因特网是由收发数据报的主机和中转数据报的路由器组成。
​     鉴于IP网络本身的不可靠性,ICMP的目的仅仅是向源发主机告知网络环境中出现的问题。
​     ICMP主要支持路由器将数据报传输的结果信息反馈回源发主机。ICMP协议系统默认就安装了的,可以做相应设置防止ICMP攻击。 


​利用UDP组播能在intarnet,internet上也数据报的形式进行数据的组播
​(在internet上进行组播,要求路由器支持IGMP (internet网关管理协议,这个协议是在IP出现以后,为了支持组播而出现的))
​相对于极度消耗网络带宽的广播来说(广播只能在intranet 内广播),
​UDP组播有了很大的优化,只有终端加入到了一个广播组,UDP组播的数据才能被他接受到.

UDP组播是采用的无连接,数据报的连接方式,所以是不可靠的.也就是数据能不能到达接受端和数据到达的顺序都是不能保证的.
​但是由于UDP不用保证数据的可靠性,所有数据的传送速度是很快的.

7. 组播的“根” 
组播从概念上来讲分为两部分:控制部分和数据部分。
​    控制部分决定着组播的对象的组织方式。
​    而数据部分决定了数据的传输方式。 

控制层有“有根”,“无根”两种情况。
    ​对于有根的控制层,存在着一个root和若干个leaf. 
​        root负责管理这个组播组,只有他能邀请一个leaf加入一个组播组(ATM就是有根控制的一个典型的例子)。
    ​对于无根的控制层,没有root,只有若干的leaf. 每一个leaf都能自己加入一个组播组(IP就是无根控制的典型例子) 

​数据层也有“有根”,“无根”两种情况。
​     对于有根数据层,从root发出的数据能到达每一个leaf,而从leaf发出的数据只能到达root
​    .对于无根数据层,每一个leaf发出的数据能到达组播组中的每一个leaf(甚至包括他自己)。每一个leaf也能接受组播组里的任何数据包。


二.IP组播地址 
IP组播通信需要一个特殊的组播地址.
​IP组播地址是一组D类IP地址,范围从224.0.0.0 到 239.255.255.255。其中还有很多地址是为特殊的目的保留的。
​224.0.0.0到224.0.0.255的地址最好不要用,因为他们大多是为了特殊的目的保持的(比如IGMP协议)

三.IGMP协议 
IGMP(internet网关管理协议)是IP组播的基础.在IP协议出现以后,为了加入对组播的支持,IGMP产生了。
​IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,
​这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。
​假如不同子网内的A,B要进行组播通信,那么,位与A,B之间的所有路由器必须都要支持IGMP协议,否则A,B之间不能进行通信。 

当一个应用加入一个组播组后,就会向这个子网的所有路由器发送一个IGMP加入命令,
​告诉他子网内有人对发送到某一个组播组的数据感兴趣.路由器也会定时向子网内的所有终端发送一条查询消息,
​用于询问是否还有人对某个组播组的数据感兴趣。
​如果有的话,终端就会回应一条IGMP消息,路由器则继续转发这个组播组的数据。
​如果没有人回应这条消息,那么路由器就认为已经没有终端对这个组播组的数据感兴趣,就不会在转发关于这个组播组的数据了。

​在IGMP第二版中,一个终端推出组播组以后,会向路由器发送一个推出消息,
​路由器也会通过这个消息来判断是否还要继续转发关于这个组播组的数据了
​(IGMP第一版中没有这个功能)[这些事情都是底层的系统做的,你只要坐享其成就好了]


本文来自:http://www.91linux.com/html/article/network/20080616/12575_3.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值