速读原著-TCP/IP(广播的示例)

第12章 广播和多播

12.3 广播的例子

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

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

sun % ping 255.255.255.255
/usr/etc/ping: unknown host 255.255.255.255

打算在本地电缆上进行广播。但它无法进行,原因在于该应用程序( p i n g)中存在一个程序设计上的问题。大多数应用程序收到点分十进制的 I P地址或主机名后,会调用函数i n e t _ a d d r( 3 )来把它们转化为 32 bit的二进制I P地址。假定要转化的是一个主机名,如果转化失败,该库函数将返回- 1来表明存在某种差错(例如是字符而不是数字或串中有小数点)。

但本网广播地址( 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5)也被当作存在差错而返回- 1。大多数程序均假定接收到的字符串是主机名,然后查找 D N S(第1 4章),失败后输出差错信息如“未知主机”。如果我们修复 p i n g程序中这个欠缺,结果也并不总是令人满意的。在 6个不同系统的测试中,仅有一个像预期的那样产生了一个本网广播数据报。大多数则在路由表中查找 I P地址2 5 5 . 2 5 5 . 2 5 5 . 2 5 5,而该地址被用作默认路由器地址,因此向默认路由器单播一个数据报。最终该数据报被丢弃。

指向子网的广播是我们应该使用的。在6 . 3节中,我们向测试网络(见扉页前图)中I P地址为140.252.13.63 的以太网发送数据报,并接收以太网中所有主机的应答。与子网广播地址关联的每个接口是用于命令i f c o n f i g(见3 . 8节)的值。如果我们p i n g那个地址,预期的结果是:
在这里插入图片描述
I P通过目的地址( 1 4 0 . 2 5 2 . 1 3 . 6 3)来确定,这是指向子网的广播地址,然后向链路层的广播地址发送该数据报。

在6 . 3节提到的这种广播类型的接收对象为局域网中包括发送主机在内的所有主机,因此可以看到除了收到网内其他主机的答复外,还收到来自发送主机( s u n)的答复。

在这个例子中,我们也显示了执行 p i n g广播地址前后A R P缓存的内容。这可以显示广播与A R P之间的相互作用。执行 p i n g命令前A R P缓存是空的,而执行后是满的(也就是说,对网内其他每个响应回显请求的主机在 A R P缓存中均有一个条目)。我们提到的该以太网数据帧被传送到链路层的广播地址( 0 x ffffffff)是如何发生的呢?由 s u n主机发送的数据帧不需要A R P。

如果使用t c p d u m p来观察p i n g的执行过程,可以看到广播数据帧的接收者在发送它的响应之前,首先产生一个对 s u n主机的A R P请求,因为它的应答是单播的。在 4 . 5节我们介绍了一个A R P请求的接收者(该例中是 s u n)通常在发送A R P应答外,还将请求主机的 I P地址和物理地址加入到 A R P缓存中去。这基于这样一个假定:如果请求者向我们发送一个数据报,我们也很可能想向它发回什么。

我们使用的p i n g程序有些特殊,原因在于它使用的编程接口(在大多数 U n i x实现中是低级插口(raw socket))通常允许向一个广播地址发送数据报。如果使用不支持广播的应用如T F T P,情况又如何呢?(T F T P将在第1 5章详细介绍。)
在这里插入图片描述
在这个例子中,程序立即产生了一个差错,但不向网络发送任何信息。产生这一切的原因在于,插口提供的应用程序接口A P I只有在进程明确打算进行广播时才允许它向广播地址发送U D P数据报。这主要是为了防止用户错误地采用了广播地址(正如此例)而应用程序却不打算广播。

在广播U D P数据报之前,使用插口中A P I的应用程序必须设置S O _ B R O A D C A S T插口选项。并非所有系统均强制使用这个限制。某些系统中无需进程进行这个说明就能广播UDP数据报。而某些系统则有更多的限制,需要有超级用户权限的进程才能广播。

下一个问题是是否转发广播数据。有些系统内核和路由器有一选项来控制允许或禁止这一特性(见附录E)。

如果让路由器b s d i能够转发广播数据,然后在主机 s l i p上运行p i n g程序,就能够观察到由路由器b s d i转发的子网广播数据报。转发广播数据报意味着路由器接收广播数据,确定该目的地址是对哪个接口的广播,然后用链路层广播向对应的网络转发数据报。
在这里插入图片描述
我们观察到它的确正常工作了,同时也看到 B S D系统中的p i n g程序检查重复的数据报序列号。如果出现重复序列号的数据报就显示 D U P !,这意味着一个数据报已经在某处重复了,然而它正是我们所期望看到的,因为我们正向一个广播地址发送数据。

我 们 还 可 以 从 远 离 广 播 所 指 向 的 网 络 上 的 主 机 上 来 进 行 这 个 试 验 。 在 主 机a n g o g h . c x . b e r k e l e y . e d u(和我们的网络距离1 4跳)上运行p i n g程序,如果路由器s u n被设置为能够转发所指向的广播,它还能正常工作。在这种情况下,这个I P数据报(传送I C M P回显请求)被路径上的每个路由器像正常的数据报一样转发,它们均不知道传送的实际上是广播数据。接着最后一个路由器n e t b看到主机号为6 3,就将其转发给路由器s u n。路由器s u n觉察到该目的I P地址事实上是一个相连子网接口上的广播地址,就将该数据报以链路层广播传往相应网络。

广播是一种应该谨慎使用的功能。在许多情况下, I P多播被证明是一个更好的解决办法。

发布了1489 篇原创文章 · 获赞 1394 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/weixin_42528266/article/details/104727759