广播和多播

一:广播

1:概述

         多播支持在ipv4中是可选的,在IPv6中却是必须的;

         IPv6不支持广播。使用广播的任何IPv4应用程序一旦移植到IPv6就必须改用多播重新编写;

         广播和多播要求用于UDP或原始IP,它们不能用于TCP

2:广播地址

         广播地址有以下两种,其中-1表示索有为均为1的字段。

         (1):子网定向广播地址:{子网,-1}。作为指定子网上所有接口的广播地址。举例来说,如果我们有一个192.168.42/24的子网,那么192.168.42.255就是盖子王上所有接口的子网定向广播地址。通常情况下,路由器不转发这种广播,不过有些系统是可配置的。

         (2):受限广播地址:{-1, -1}或255.255.255.255。路由器从不转发目的地址为255.255.255.255的IP数据报。

 

3:单播和广播的比较

A:单播

         上图描述了向一个单播地址发送一个UDP数据报时所发生的步骤。图中以太网的网地址为192.168.42/24。左侧的应用进程在一个UDP套接字上调用sendto,往IP地址192.168.42.3端口7433上发送一个数据报。经过UDP协议,IP协议以及以太网协议的封装,最终形成一个以太网帧。

         其中的目的以太网地址通过ARP协议得到,为00:0a:95:79:bc:b4。该以太网帧的帧类型宇段值为表示IPv4分组的0x0800,IPv6分组的帧类型为0x86dd。

         中间主机的以太网接口看到该帧后,把它的目的以太网地址与自己的以太网地址进行比较,既然它们不一致,该接口于是忽略这个帧。可见单播帧不会对该主机造成任何额外的影响,因为忽略它们的是接口而不是主机。

         右侧主机的以太网接口看到该帧,发现该帧的目的以太网地址与自己的以太网地址相同。该接口于是读入整个帧,读入完毕后可能产生一个硬件中断,致使相应设备驱动程序从接口内存中读取该帧。既然帧类型为0x0800,该帧承载的分组于是被置于IP的输入队列。

         IP层处理该分组时,它首先比较该分组的目的IP地址(192.168.42.3)和自已所有的IP地址〔主机可以多宿〕。既然这个目的地址是本主机自己的IP地址之一,该分组于是被接受。

         IP层接着查看该分组IPv4首部的协议字段,其值为表示UDP17。该分组承载的UDP数据报于是被传递到UDP层。

         UDP层检查该UDP数据报的目的端口〔如果其UDP套接字己经连接,那么还检查源端口〕,接着在本例子中,把该数据报置于相应套接字的接收队列。必要的话UDP层作为内核一部分唤醒阻塞在相应输入操作上的进程,由该进程读取这个新收取的数据报。

         本例子的关键点是单播IP数据报仅由通过目的IP地址指定的单个主机接收。子网上的其他主机不受任何影晌。

 

B:广播

         上图描述了向一个广播地址发送一个UDP数据报时所发生的步骤,发送进程的目的地址为子网定向广播地址192.168.42.255的数据报。

         当左侧的主机发送该数据报时,它注意到目的IP地址是所在以太网的子网定向广播地址,于是把它映射成48位全为1的以太网地址:ff:ff:ff:ff:ff:ff。这个地址使得该子网上的每一个以太网接口都接收该帧,图中右侧两个运行IPv4的主机自然都接收该帧。既然以太网帧类型为0x0800,这两个主机于是都把该帧承载的分组传递到IP层,既然该分组的目的IP地址是匹配两者的广播地址,并且协议字段为17(UDP),这两个主机于是都把该分组承载的UDP数据报传递到UDP。

         右侧的那个主机把该UDP数据报传递给绑定端口520的应用进程。一个应用进程无需就为接收广播UDP数据报而进行任何特殊处理:它只需要创建一个UDP套接宇,并把应用的端口号捆绑到其上。

         然而中间的那个主机没有任何应用进程绑定UDP端口520。该主机的UDP代码于是丢弃这个已收取的数据报。该主机绝不能发送一个ICMP端口不可达消息,因为这么做可能产生广播风暴。即子网上大量主机几乎同时产生一个响应,导致网络在一段时间内不可用。

         在图中还表示出,左侧主机发送的数据报也被递送给自己。这是广播的一个属性。

         本例展示了广播存在的根本问题,子网上未参加相应广播应用的所有主机也不得不沿协议栈一路向上,完整地处理收取的UDP广播数据报,直到该数据报历经UDP层时被丢弃为止。要是运行着以较高速率产生IP数据报的应用,这些非必要的处理有可能严重影响子网上这些其他主机的工作。通过多播,在一定程度上解决了本问题。

 

二:多播

         多播数据报只应该由对它感兴趣的接口接收,也就是说,由运行相应多播会话应用系统的主机上的接口接收。另外,广播一般局限于局域网内使用,而多播则既可用于局域网,也可跨广域网使用。

 

         1:多播地址

         IPv4的D类地址,从224.0.0.0239.255.255.255IPv4的多播地址。D类地址的低序28位构成多播组ID,整个32位地址则称为组地址。下图展示了从IPv4多播地址到以太网地址的映射方法:

         以太网地址的高序24位总是01:00:5e。下一位总是0,低序23位复制自多播组ID的低序23位。多播组ID的高序5位在映射过程中被忽略。这意味着32个多播地址会映射成单个以太网地址,因此这个映射关系不是一对一的。

         下面是几个特殊的IPv4多播地址:

         224.0.0.1是所有主机组。子网上所有具有多播能力的节点(主机、路由器或打印机等)必须在所有具有多播能力的接口上加入该组。

         224.0.0.2是所有路由器组。子网上所有多播路由器必须在所有具有多播能力的接口上加入该组。

 

2:多播和广播的比较

         下图描述了局域网上多播的过程:

         右侧主机上的接收应用进程启动,并创建一个UDP套接字,捆绑端口123到该套接字上,然后加入多播组224.0.1.1。这种“加入”操作是通过调用setsockopt完成。

         上述操作完成之后,IPv4层内部保存这些信息,并告知合适的数据链路接收目的以太网地址为01:00:5e:00:01:01的以太网帧。该地址就是接收应用进程刚加入的多播地址对应的以太网地址。

         下一个步骤是左侧主机上的发送应用进程创建一个UDP套接字,往IP地址224.0.1.1的123端口发送一个数据报。发送多播数据报无需任何特殊处理:发送应用进程不必为此加入多播组。

         发送主机把该IP地址转换成相应的以太网目的地址,再发送承载该数据报的以太网帧。注意该帧中同时含有目的以太网地址和目的IP地址。

         假设中间主机不只备IPv4多播能力。它将完全忽略该帧,因为:(1)该帧的目的以太网地址不匹配该主机的接口地址;(2)该帧的目的以太网地址不是以太网广播地址;(3)该主机的接口未被告知接收任何组地址(高序字节的低序位被置为1的以太网地址)

         该帧基于我们所称的“不完备过滤”被右侧主机的数据链路接收,其中的过滤操作由相应接口使用该帧的以太网目的地址执行。我们之所以说这种过滤不完备是因为尽管告知该接口接收以某个特定以太网组地址为目的地址的帧,通常它也会接收以其他以太网组地址为目的地址的帧。

         当我们告知一个以太网接口接收目的地址为某个特定以太网组地址的帧时。许多当前的以太网接口卡对这个地址应用某个散列(hash)函数,计算出一个介于0和511之间的值。当有一个目的地为某个组地址的帧在线缆上经过时,接口对其目的地址应用同样的散列函数,计算出一个介于0511之间的值。如果该值与之前的值匹配,那就接收这个帧;否则忽略这个帧。

         右侧主机的数据链路收取该帧后,把由该帧承载的分组传递到IP层,因为该以太网帧的类型为IPv4。既然收到的分组以某个多播IP地址作为目的地址,IP层于是比较该地址和本机的接收应用进程已经加入的所有多播地址,根据比较结果确定是接受还是丢弃该分组。我们称这个操作为完备过滤,因为它基于IPv4报头中完整的32位D类地址执行。在本例子中,IP层接受该分组并把承载在其中的UDP数据报传递到UDP等,UDP层再把承载在UDP数据报中的应用数据报传递到绑定了端口123的套接字。

         上图中没有展示的还有以下三种情形:

         (1)运行所加入多播地址为225.0.1.1的某个应用进程的一个主机。既然多播地址组ID的高5位在到以太网地址的映射中被忽略,该主机的接口也将接收目的以太网地址为01:00:5e:00:01:01的帧,这种情况下,由该帧承载的分组将由IP层中的完备过滤丢弃。

         (2)运行所加入多播地址符合以下条件的某个应用进程的一个主机:由这个多播地址映射成的以太网地址恰好和01:00:5e:00:01:01一样被该主机执行非完备过滤的接口散列到同一个结果。该接口也将接收目的以太网地址为01:00:5e:00:01:01的帧,直到由数据链路层或lP层丢弃。

         (3)目的地为相同多播组(224.0.1.1)不同端口(譬如4000)的一个数据报。上图中右侧主机仍然接收该数据报,并由IP层接受并传递给UDP层,不过UDP层将丢弃它。

 

3:广域网上的多播

         多播相对于广播的优势在于不会给对多播分组不感兴趣的主机增加额外负担。广域网上也可以使用多播,比如下图:


         假设其中的5台主机启动了某个程序,这5个进程都加入了一个给定多播组,另外假设每个多播路由器与其相邻多播路由器的通信使用某个多播路由协议,以MRP指称。

         当某个主机上的一个进程加入一个多播组时,该主机向所有直接连接的多播路由器发送一个IGMP消息,告知它们本主机已加入了那个多播组,多播路由器随后使用MRP交换这些信息,这样每个多播路由器就知道在收到目的地为所加入多播地址的分组时该如何处理。

         假设左上方主机的一个进程开始发送目的地为那个给定多播地址的分组。如下图:


         跟踪这些多播分组从发送进程游走到所有接收进程所经历的步骤如下:

         这些分组由发送进程多播发送,接收主机H1接收这些分组(因为它已经加入给定多播组),多播路由器MR1也接收这些分组(因为每个多播路由器都必须接收所有多播分组)。

         MR1把这些多播分组转发到MR2,因为MRP已经告知MR1:MR2需要接收目的地为给定多播组的分组。

         MR2在直接连接的局域网上多播发送这些分组,因为该局域网上的主机H2和H3属于该多播组。MR2还向MR3发送这些分组的一个副本。

         MR2那样对分组进行复制是多播转发所特有的。单播分组在被路由器转发时从不被复制。

         MR3把这些多播分组发送到MR4,但是不在直接连接的局域网上多播这此分组,因为我们假设该局域网上没有主机加入该多播组。

         MR4在直按连接的局域网上多播发送这些分组,因为该局域网上的主机H4和HS属于该多播组。它并不向MRS发送这些分组的一个副本,因为直接连接MR5的局域网上没有主  机属于该多播组,而MR4已经根据与MRS交换的多播路由信息知道这一点。

 

摘自《Unix网络编程卷一:套接字联网API》第20章和第21章

 

原文地址:https://www.cnblogs.com/gqtcgq/p/7247250.html