TCP/IP详解--第十二章

 第12章             广播和多播


12.1    引言

 

在第 1章中我们提到有三种 IP地址:单播地址、广播地址和多播地址。本章将更详细地介 绍广播和多播。

广播和多播仅应用于 UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。 TCP 是一个面向连接的协议,它意味着分别运行于两主机(由  IP地址确定)内的两进程(由 端口号确定)间存在一条连接。


考虑包含多个主机的共享信道网络如以太网。每个以太网帧包含源主机和目的主机的以 太网地址( 48bit)。通常每个以太网帧仅发往单个目的主机,目的地址指明单个接收接口,因 而称为单播 (unicast)。在这种方式下,任意两个主机的通信不会干扰网内其他主机(可能引起 争夺共享信道的情况除外)。


然而,有时一个主机要向网上的所有其他主机发送帧 这就是广播。通过 A R P 和 R A R P 可以看到这一过程。多播 (multicast) 处于单播和广播之间:帧仅传送给属于多播组的 多个主机。

为了弄清广播和多播,需要了解主机对由信道传送过 来帧的过滤过程。图 12-1说明了这一过程。

首先,网卡查看由信道传送过来的帧,确定是否接收 该帧,若接收后就将它传往设备驱动程序。通常网卡仅接 收那些目的地址为网卡物理地址或广播地址的帧。另外 多数接口均被设置为混合模式,这种模式能接收每个帧的一个复制。作为一个例子, tcpdump使用这种模式。

目前,大多数的网卡经过配置都能接收目的地址为多 播地址或某些子网多播地址的帧。对于以太网,当地址中 最高字节的最低位设置为 1时表示该地址是一个多播地址 用十六进制可表示为 01:00:00:00:00:00(以太网广播地址 ff:ff:ff:ff:ff:ff可看作是以太网多播地址的特例)。


交付

 

丢弃 交付

丢弃

 

交付 设备驱

动程序        丢弃

 

交付

 

接口卡          丢弃

 

 

 

 

图12-1   协议栈各层对收到帧 的过滤过程


如果网卡收到一个帧,这个帧将被传送给设备驱动程序(如果帧检验和错,网卡将丢弃该帧)。设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议(                                            I P、 ARP等等)。其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组。

设备驱动程序随后将数据帧传送给下一层,比如,当帧类型指定为 IP数据报时,就传往 IP层。IP根据IP地址中的源地址和目的地址进行更多的过滤检测。如果正常,就将数据报传送给下一层(如 TCP或UDP)。

每次 UDP收到由 IP 传送来的数据报,就根据目的端口号,有时还有源端口号进行数据报


过滤。如果当前没有进程使用该目的端口号,就丢弃该数据报并产生一个   ICMP不可达报文

(TCP根据它的端口号作相似的过滤)。如果 UDP数据报存在检验和错,将被丢弃。 使用广播的问题在于它增加了对广播数据不感兴趣主机的处理负荷。拿一个使用   UDP广

播应用作为例子。如果网内有 50个主机,但仅有 20个参与该应用,每次这 20个主机中的一个 发送 U D P广播数据时,其余 3 0 个主机不得不处理这些广播数据报。一直到  U D P层,收到的 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节)和 rwhod( BSD rwho客户的服务器)是向每个接口发送 UDP数据报的两个应用程序。这两个应用程序均用相 似的启动过程来确定主机中的所有接口,并了解哪些接口具备广播能力。同时,将对应于那种接口的指向网络的广播地址作为发往该接口的数据报的目的地址。

Host Requirements RFC没有进一步涉及多接口主机是否应当向其所有的接口发送 受限的广播。

 

12.2.2   指向网络的广播

 

指向网络的广播地址是主机号为全 1的地址。 A类网络广播地址为 netid.255.255.255,其中

netid为A类网络的网络号。 一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。

 

12.2.3   指向子网的广播

 

指向子网的广播地址为主机号为全 1且有特定子网号的地址。作为子网直接广播地址的 IP

地址需要了解子网的掩码。例如,如果路由器收到发往   1 2 8 . 1 . 2 . 2 5 5 的数据报,当 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] 是这种广播是陈旧过时的,更好的方式是使用多播而不是对 所有子网的广播。

[Almquist 1993] 指出RFC 922 要求将一个指向所有子网的广播传送给所有子网,但 当前的路由器没有这么做。这很幸运,因为一个因错误配置而没有子网掩码的主机会 把它的本地广播传送到所有子网。例如,如果IP地址为128.1.2.3的主机没有设置子网掩码,它的广播地址在正常情况下的默认值是 128.1.255.255。但如果子网掩码被设置为

255.255.255.0,那么由错误配置的主机发出的广播将指向所有的子网。

1983年问世的4.2BSD是第一个影响广泛的TCP/IP的实现,它使用主机号全0作为广 播地址。一个最早提到广播IP地址的是IEN 212 [Gurwitz and Hinden 1982],它提出用主 机号中的 1比特来表示 IP广播地址( IENs 是互联网试验注释,基本上是 RFC的前身)。 RFC 894 [Hornig 1984]认为4.2BSD使用不标准的广播地址,但RFC 906 [Finlayson 1984] 注意到对广播地址还没有Internet标准。RFC编辑在RFC 906中加了一个脚注承认缺少标准的广播地址,并强烈推荐将主机号全1作为广播地址。尽管1986年的4.3BSD采用主机 号全1表示广播地址,但直到 90年代早期,操作系统(著名的是 SunOS 4.x)还继续使 用非标准的广播地址。

 

12.3    广播的例子

 

广播是怎样传送的?路由器及主机又如何处理广播?很遗憾,这是难以回答的问题,因 为它依赖于广播的类型、应用的类型、 TCP/IP实现方法以及有关路由器的配置。

首先,应用程序必须支持广播。如果执行

 

sun% ping 255.255.255.255

/usr/etc/ping:unknown host 255.255.255.255

打算在本地电缆上进行广播。但它无法进行,原因在于该应用程序(  ping)中存在一个程序 设计上的问题。大多数应用程序收到点分十进制的                                                 I P 地址或主机名后,会调用函数 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那个地址,预期的结果是:

ARP高速缓存空

 

 

 

 

 

 

 

 

 

键入中断以停止显示

 

 

 

再检验ARP缓存

 

 

 

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章详细介绍。)

bsdi % tftp                          启动客户程序

tftp> connect 140.252.13.63       说明服务器的 IP地址

tftp> get temp.foo                 试图从服务器或获取一个文件

tftp: sendto: Permission denied

tftp> quit                            终止客户程序

在这个例子中,程序立即产生了一个差错,但不向网络发送任何信息。产生这一切的原因在 于,插口提供的应用程序接口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多播提供两类服务:

1) 向多个目的地址传送数据。有许多向多个接收者传送信息的应用:例如交互式会议系 统和向多个接收者分发邮件或新闻。如果不采用多播,目前这些应用大多采用                                     T C P 来完成

(向每个目的地址传送一个单独的数据复制)。然而,即使使用多播,某些应用可能继续采用

TCP来保证它的可靠性。

2) 客户对服务器的请求。例如,无盘工作站需要确定启动引导服务器。目前,这项服务 是通过广播来提供的(正如第 16章的BOOTP),但是使用多播可降低不提供这项服务主机的负 担。


12.4.1   多播组地址

 

图12-2显示了 D类IP地址的格式。

28位

D                                                                 多播组ID

 

图12-2   D类IP地址格式

 

不像图 1-5所示的其他三类 IP地址( A、B和C),分配的 28 bit 均用作多播组号而不再表示 其他。

多播组地址包括为 1110的最高 4 bit 和多播组号。它们通常可表示为点分十进制数,范围 从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用作网络时间协议 NTP,224.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。

 

这里对CSMA/CD或令牌网使用的是Internet标准比特顺序,和在内存中出现的比特顺序一样。这也是大多数程序设计员和系统管理员采用的顺序。 IEEE文档采用了这种 比特传输顺序。Assigned Numbers RFC给出了这些表示的差别。

 

这种地址分配将使以太网多播地址中的 23bit与IP多播组号对应起来,通过将多播组号中 的低位 23bit映射到以太网地址中的低位 23bit实现,这个过程如图 12-3所示。

由于多播组号中的最高 5 bit 在映射过程中被忽略,因此每个以太网多播地址对应的多播 组是不唯一的。   3 2 个不同的多播组号被映射为一个以太网地址。例如,多播地址

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)就必须对数据报进行过 滤。因为网卡可能接收到主机不想接收的多播数据帧。另外,如果网卡不提供足够的多播数 据帧过滤功能,设备驱动程序就必须接收所有多播数据帧,然后对它们进行过滤。


 

多播组地址中的这 5 bit 未用

作形成以太网地址

 

 


D类IP地址


多播组地址中的低位23位复制到


对应的以太网地址中

 

 

48位以太网地址

图12-3   D类IP地址到以太网多播地址的映射

 

局域网网卡趋向两种处理类型:一种是网卡根据对多播地址的散列值实行多播过 滤,这意味仍会接收到不想接收的多播数据;另一种是网卡只接收一些固定数目的多播地址,这意味着当主机想接收超过网卡预先支持多播地址以外的多播地址时,必须 将网卡设置为“多播混杂(multicastpromiscuous) ”模式。因此,这两种类型的网卡仍需要设备驱动程序检查收到的帧是否真是主机所需要的。

即使网卡实现了完美的多播过滤(基于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 映射到相应以太网地址中便可实现多 播组地址到以太网地址的转换。由于地址映射是不唯一的,因此需要其他的协议实现额外的 数据报过滤。

习题

 

12.1   广播是否增加了网络通信量?

12.2  考虑一个拥有 50台主机的以太网: 20台运行 TCP/IP,其他 30台运行其他的协议族。主机 如何处理来自运行另一个协议族主机的广播?

12.3  登录到一个过去从来没有用过的 Unix系统,并且打算找出所有支持广播的接口的指向子 网的广播地址。如何做到这点?

12.4  如果我们用 ping程序向一个广播地址发送一个长的分组,如

 

 

 

 

 

它正常工作,但将分组的长度再增加一个字节后出现如下差错:

 

sun % ping 140.252.13.63 1473

PING 140.252.13.63: 1473 data bytes sendto: Message too long 究竟出了什么问题?

12.5  重做习题10.6,假定8个RIP报文是通过多播而不是广播(使用RIP版本2)。有什么变

化?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值