太原做淘宝网站的,互联网门户网站,用vs2010做网站导航,网站开发实战课程12.1 引言
在第1章中我们提到有三种IP地址#xff1a;单播地址、广播地址和多播地址。本章将更详细地介绍广播和多播。
广播和多播仅应用于UDP#xff0c;它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议#xff0c;它意味着分别运行于两主…12.1 引言
在第1章中我们提到有三种IP地址单播地址、广播地址和多播地址。本章将更详细地介绍广播和多播。
广播和多播仅应用于UDP它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议它意味着分别运行于两主机由IP地址确定内的两进程由端口号确定间存在一条连接。
考虑包含多个主机的共享信道网络如以太网。每个以太网帧包含源主机和目的主机的以太网地址48bit。通常每个以太网帧仅发往单个目的主机目的地址指明单个接收接口因而称为单播(unicast)。在这种方式下任意两个主机的通信不会干扰网内其他主机可能引起争夺共享信道的情况除外。
然而有时一个主机要向网上的所有其他主机发送帧这就是广播。通过ARP和RARP可以看到这一过程。多播(multicast)处于单播和广播之间帧仅传送给属于多播组的多个主机。
为了弄清广播和多播需要了解主机对由信道传送过来帧的过滤过程。图12-1说明了这一过程。
首先网卡查看由信道传送过来的帧确定是否接收该帧若接收后就将它传往设备驱动程序。通常网卡仅接收那些目的地址为网卡物理地址或广播地址的帧。另外多数接口均被设置为混合模式这种模式能接收每个帧的一个复制。作为一个例子tcpdump使用这种模式。
目前大多数的网卡经过配置都能接收目的地址为多播地址或某些子网多播地址的帧。对于以太网当地址中最高字节的最低位设置为1时表示该地址是一个多播地址用十六进制可表示为01:00:00:00:00:00以太网广播地址ff:ff:ff:ff:ff:ff可看作是以太网多播地址的特例。
如果网卡收到一个帧这个帧将被传送给设备驱动程序如果帧检验和错网卡将丢弃该帧。设备驱动程序将进行另外的帧过滤。首先帧类型中必须指定要使用的协议IP、ARP等等。其次进行多播过滤来检测该主机是否属于多播地址说明的多播组。
设备驱动程序随后将数据帧传送给下一层比如当帧类型指定为IP数据报时就传往IP层。IP根据IP地址中的源地址和目的地址进行更多的过滤检测。如果正常就将数据报传送给下一层如TCP或UDP。
每次UDP收到由IP传送来的数据报就根据目的端口号有时还有源端口号进行数据报过滤。如果当前没有进程使用该目的端口号就丢弃该数据报并产生一个ICMP不可达报文TCP根据它的端口号作相似的过滤。如果UDP数据报存在检验和错将被丢弃。
使用广播的问题在于它增加了对广播数据不感兴趣主机的处理负荷。拿一个使用UDP广播应用作为例子。如果网内有50个主机但仅有20个参与该应用每次这20个主机中的一个发送UDP广播数据时其余30个主机不得不处理这些广播数据报。一直到UDP层收到的UDP广播数据报才会被丢弃。这30个主机丢弃UDP广播数据报是因为这些主机没有使用这个目的端口。
多播的出现减少了对应用不感兴趣主机的处理负荷。使用多播主机可加入一个或多个多播组。这样网卡将获悉该主机属于哪个多播组然后仅接收主机所在多播组的那些多播帧。
12.2 广播
在图3-9中我们知道了四种IP广播地址下面对它们进行更详细的介绍。
12.2.1 受限的广播
受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址此时主机可能还不知道它所在网络的网络掩码甚至连它的IP地址也不知道。
在任何情况下路由器都不转发目的地址为受限的广播地址的数据报这样的数据报仅出现在本地网络中。
一个未解的问题是如果一个主机是多接口的当一个进程向本网广播地址发送数据报时为实现广播是否应该将数据报发送到每个相连的接口上如果不是这样想对主机所有接口广播的应用必须确定主机中支持广播的所有接口然后向每个接口发送一个数据报复制。
大多数BSD系统将255.255.255.255看作是配置后第一个接口的广播地址并且不提供向所属具备广播能力的接口传送数据报的功能。不过routed见10.3节和rwhodBSDrwho客户的服务器是向每个接口发送UDP数据报的两个应用程序。这两个应用程序均用相似的启动过程来确定主机中的所有接口并了解哪些接口具备广播能力。同时将对应于那种接口的指向网络的广播地址作为发往该接口的数据报的目的地址。
12.2.2 指向网络的广播
指向网络的广播地址是主机号为全1的地址。A类网络广播地址为netid.255.255.255其中netid为A类网络的网络号。
一个路由器必须转发指向网络的广播但它也必须有一个不进行转发的选择。
12.2.3 指向子网的广播
指向子网的广播地址为主机号为全1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如如果路由器收到发往128.1.2.255的数据报当B类网络128.1的子网掩码为255.255.255.0时该地址就是指向子网的广播地址但如果该子网的掩码为255.255.254.0该地址就不是指向子网的广播地址。
12.2.4 指向所有子网的广播
指向所有子网的广播也需要了解目的网络的子网掩码以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全1。例如如果目的子网掩码为255.255.255.0那么IP地址128.1.255.255是一个指向所有子网的广播地址。然而如果网络没有划分子网这就是一个指向网络的广播。
当前的看法[Almquist 1993]是这种广播是陈旧过时的更好的方式是使用多播而不是对所有子网的广播。
12.3 广播的例子
广播是怎样传送的路由器及主机又如何处理广播很遗憾这是难以回答的问题因为它依赖于广播的类型、应用的类型、TCP/IP实现方法以及有关路由器的配置。
首先应用程序必须支持广播。如果执行
打算在本地电缆上进行广播。但它无法进行原因在于该应用程序ping中存在一个程序设计上的问题。大多数应用程序收到点分十进制的IP地址或主机名后会调用函数inet_addr(3)来把它们转化为32 bit的二进制IP地址。假定要转化的是一个主机名如果转化失败该库函数将返回-1来表明存在某种差错例如是字符而不是数字或串中有小数点。但本网广播地址255.255.255.255也被当作存在差错而返回-1。大多数程序均假定接收到的字符串是主机名然后查找DNS第14章失败后输出差错信息如“未知主机”。
如果我们修复ping程序中这个欠缺结果也并不总是令人满意的。在6个不同系统的测试中仅有一个像预期的那样产生了一个本网广播数据报。大多数则在路由表中查找IP地址255.255.255.255而该地址被用作默认路由器地址因此向默认路由器单播一个数据报。最终该数据报被丢弃。
指向子网的广播是我们应该使用的。在6.3节中我们向测试网络见扉页前图中IP地址为140.252.13.63的以太网发送数据报并接收以太网中所有主机的应答。与子网广播地址关联的每个接口是用于命令ifconfig见3.8节的值。如果我们ping那个地址预期的结果是
IP通过目的地址140.252.13.63来确定这是指向子网的广播地址然后向链路层的广播地址发送该数据报。
在6.3节提到的这种广播类型的接收对象为局域网中包括发送主机在内的所有主机因此可以看到除了收到网内其他主机的答复外还收到来自发送主机sun的答复。
在这个例子中我们也显示了执行ping广播地址前后ARP缓存的内容。这可以显示广播与ARP之间的相互作用。执行ping命令前ARP缓存是空的而执行后是满的也就是说对网内其他每个响应回显请求的主机在ARP缓存中均有一个条目。我们提到的该以太网数据帧被传送到链路层的广播地址0xffffffff是如何发生的呢由sun主机发送的数据帧不需要ARP。
如果使用tcpdump来观察ping的执行过程可以看到广播数据帧的接收者在发送它的响应之前首先产生一个对sun主机的ARP请求因为它的应答是单播的。在4.5节我们介绍了一个ARP请求的接收者该例中是sun通常在发送ARP应答外还将请求主机的IP地址和物理地址加入到ARP缓存中去。这基于这样一个假定如果请求者向我们发送一个数据报我们也很可能想向它发回什么。
我们使用的ping程序有些特殊原因在于它使用的编程接口在大多数Unix实现中是低级插口(raw socket)通常允许向一个广播地址发送数据报。如果使用不支持广播的应用如TFTP情况又如何呢TFTP将在第15章详细介绍。
在这个例子中程序立即产生了一个差错但不向网络发送任何信息。产生这一切的原因在于插口提供的应用程序接口API只有在进程明确打算进行广播时才允许它向广播地址发送UDP数据报。这主要是为了防止用户错误地采用了广播地址正如此例而应用程序却不打算广播。 在广播UDP数据报之前使用插口中API的应用程序必须设置SO_BROADCAST插口选项。并非所有系统均强制使用这个限制。某些系统中无需进程进行这个说明就能广播UDP数据报。而某些系统则有更多的限制需要有超级用户权限的进程才能广播。 下一个问题是是否转发广播数据。有些系统内核和路由器有一选项来控制允许或禁止这一特性见附录E。
如果让路由器bsdi能够转发广播数据然后在主机slip上运行ping程序就能够观察到由路由器bsdi转发的子网广播数据报。转发广播数据报意味着路由器接收广播数据确定该目的地址是对哪个接口的广播然后用链路层广播向对应的网络转发数据报。
我们观察到它的确正常工作了同时也看到BSD系统中的ping程序检查重复的数据报序列号。如果出现重复序列号的数据报就显示DUP!这意味着一个数据报已经在某处重复了然而它正是我们所期望看到的因为我们正向一个广播地址发送数据。
我们还可以从远离广播所指向的网络上的主机上来进行这个试验。在主机angogh.cx.berkeley.edu和我们的网络距离14跳上运行ping程序如果路由器sun被设置为能够转发所指向的广播它还能正常工作。在这种情况下这个IP数据报传送ICMP回显请求被路径上的每个路由器像正常的数据报一样转发它们均不知道传送的实际上是广播数据。接着最后一个路由器netb看到主机号为63就将其转发给路由器sun。路由器sun觉察到该目的IP地址事实上是一个相连子网接口上的广播地址就将该数据报以链路层广播传往相应网络。
广播是一种应该谨慎使用的功能。在许多情况下IP多播被证明是一个更好的解决办法。
12.4 多播
IP多播提供两类服务
向多个目的地址传送数据。有许多向多个接收者传送信息的应用例如交互式会议系统和向多个接收者分发邮件或新闻。如果不采用多播目前这些应用大多采用TCP来完成向每个目的地址传送一个单独的数据复制。然而即使使用多播某些应用可能继续采用TCP来保证它的可靠性。客户对服务器的请求。例如无盘工作站需要确定启动引导服务器。目前这项服务是通过广播来提供的正如第16章的BOOTP但是使用多播可降低不提供这项服务主机的负担。
12.4.1 多播组地址
图12-2显示了D类IP地址的格式。
不像图1-5所示的其他三类IP地址A、B和C分配的28 bit均用作多播组号而不再表示其他。
多播组地址包括为111 0的最高4bit和多播组号。它们通常可表示为点分十进制数范围从224.0.0.0到239.255.255.255。
能够接收发往一个特定多播组地址数据的主机集合称为主机组(host group)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制同时不属于某一主机组的主机可以向该组发送信息。
一些多播组地址被IANA确定为知名地址。它们也被当作永久主机组这和TCP及UDP中的熟知端口相似。同样这些知名多播地址在RFC最新分配数字中列出。注意这些多播地址所代表的组是永久组而它们的组成员却不是永久的。
例如224.0.0.1代表“该子网内的所有系统组”224.0.0.2代表“该子网内的所有路由器组”。多播地址224.0.1.1用作网络时间协议NTP224.0.0.9用作RIP-2(见10.5节)224.0.1.2用作SGI公司的dogfight应用。
12.4.2 多播组地址到以太网地址的转换
IANA拥有一个以太网地址块即高位24 bit为00:00:5e十六进制表示这意味着该地址块所拥有的地址范围从00:00:5e:00:00:00到00:00:5e:ff:ff:ff。IANA将其中的一半分配为多播地址。为了指明一个多播地址任何一个以太网地址的首字节必须是01这意味着与IP多播相对应的以太网地址范围从01:00:5e:00:00:00到01:00:5e:7f:ff:ff。
这种地址分配将使以太网多播地址中的23bit与IP多播组号对应起来通过将多播组号中的低位23bit映射到以太网地址中的低位23bit实现这个过程如图12-3所示。
由于多播组号中的最高5bit在映射过程中被忽略因此每个以太网多播地址对应的多播组是不唯一的。32个不同的多播组号被映射为一个以太网地址。例如多播地址224.128.64.32十六进制e0.80.40.20和224.0.64.32十六进制e0.00.40.20都映射为同一以太网地址01:00:5e:00:40:20。
既然地址映射是不唯一的那么设备驱动程序或IP层见图12-1就必须对数据报进行过滤。因为网卡可能接收到主机不想接收的多播数据帧。另外如果网卡不提供足够的多播数据帧过滤功能设备驱动程序就必须接收所有多播数据帧然后对它们进行过滤。 局域网网卡趋向两种处理类型一种是网卡根据对多播地址的散列值实行多播过滤这意味仍会接收到不想接收的多播数据另一种是网卡只接收一些固定数目的多播地址这意味着当主机想接收超过网卡预先支持多播地址以外的多播地址时必须将网卡设置为“多播混杂(multicast promiscuous)”模式。因此这两种类型的网卡仍需要设备驱动程序检查收到的帧是否真是主机所需要的。即使网卡实现了完美的多播过滤基于48 bit的硬件地址由于从D类IP地址到48 bit的硬件地址的映射不是一对一的过滤过程仍是必要的。尽管存在地址映射不完美和需要硬件过滤的不足多播仍然比广播好。 单个物理网络的多播是简单的。多播进程将目的IP地址指明为多播地址设备驱动程序将它转换为相应的以太网地址然后把数据发送出去。这些接收进程必须通知它们的IP层它们想接收的发往给定多播地址的数据报并且设备驱动程序必须能够接收这些多播帧。这个过程就是“加入一个多播组”使用“接收进程”复数形式的原因在于对一确定的多播信息在同一主机或多个主机上存在多个接收者这也是为什么要首先使用多播的原因。当一个主机收到多播数据报时它必须向属于那个多播组的每个进程均传送一个复制。这和单个进程收到单播UDP数据报的UDP不同。使用多播一个主机上可能存在多个属于同一多播组的进程。
当把多播扩展到单个物理网络以外需要通过路由器转发多播数据时复杂性就增加了。需要有一个协议让多播路由器了解确定网络中属于确定多播组的任何一个主机。这个协议就是Internet组管理协议IGMP也是下一章介绍的内容。
12.4.3 FDDI和令牌环网络中的多播
FDDI网络使用相同的D类IP地址到48 bit FDDI地址的映射过程[Katz 1990]。令牌环网络通常使用不同的地址映射方法这是因为大多数令牌控制中的限制。
12.5 小结
广播是将数据报发送到网络中的所有主机通常是本地相连的网络而多播是将数据报发送到网络的一个主机组。这两个概念的基本点在于当收到送往上一个协议栈的数据帧时采用不同类型的过滤。每个协议层均可以因为不同的理由丢弃数据报。
目前有四种类型的广播地址受限的广播、指向网络的广播、指向子网的广播和指向所有子网的广播。最常用的是指向子网的广播。受限的广播通常只在系统初始启动时才会用到。
广播是将数据报发送到网络中的所有主机通常是本地相连的网络而多播是将数据报发送到网络的一个主机组。这两个概念的基本点在于当收到送往上一个协议栈的数据帧时采用不同类型的过滤。每个协议层均可以因为不同的理由丢弃数据报。
试图通过路由器进行广播而发生的问题常常是因为路由器不了解目的网络的子网掩码。结果与多种因素有关广播地址类型、配置参数等等。
D类IP地址被称为多播组地址。通过将其低位23 bit映射到相应以太网地址中便可实现多播组地址到以太网地址的转换。由于地址映射是不唯一的因此需要其他的协议实现额外的数据报过滤。