多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码(3.5节)。系统广播它的ICMP请求报文(这一过程与无盘系统在引导过程中用RARP获取IP地址是类似的)。无盘系统获取子网掩码的另一个方法是BOOTP协议,我们将在第16章中介绍。ICMP地址掩码请求和应答报文的格式如图6-4所示。 ![](https://box.kancloud.cn/2016-04-13_570de1e90e794.png) ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。 这样,发送端就可以把应答与请求进行匹配。 我们可以写一个简单的程序(取名为icmpaddrmask),它发送一份ICMP地址掩码请求报文,然后打印出所有的应答。由于一般是把请求报文发往广播地址,因此这里我们也这样做。 目的地址(140.252.13.63)是子网140.252.13.32的广播地址(见图3-12)。 ~~~ sun % icmpaddrmask 140.252.13.63 received mask = ffffffe0, from 140.252.13.来3自3 本 机 received mask = ffffffe0, from 140.252.13.来3自5 bsdi received mask = ffff0000, from 140.252.13.来3自4 svr4 ~~~ 在输出中我们首先注意到的是,从svr4返回的子网掩码是错的。显然,尽管svr4接口已经设置了正确的子网掩码,但是SVR4还是返回了一个普通的B类地址掩码,就好像子网并不存在一样。 ~~~ svr4 % ifconfig emd0 emd0: flags=23<UP,BROADCAST,NOTRAILERS> inet 140.252.13.34 netmask ffffffe0 broadcast 140.252.13.63 ~~~ SVR4处理ICMP地址掩码请求过程存在差错。我们用tcpdump命令来查看主机bsdi上的情况,输出如图6-5所示。我们用-e选项来查看硬件地址。 ![](https://box.kancloud.cn/2016-04-13_570de1e9202eb.png) 注意,尽管在线路上什么也看不见,但是发送主机sun也能接收到ICMP应答(带有上面“来自本机”的输出行)。这是广播的一般特性:发送主机也能通过某种内部环回机制收到一份广播报文拷贝。由于术语“广播”的定义是指局域网上的所有主机,因此它必须包括发送主机在内(参见图2-4,当以太网驱动程序识别出目的地址是广播地址后,它就把分组送到网络上,同时传一份拷贝到环回接口)。 接下来, bsdi广播应答,而svr4却只把应答传给请求主机。通常,应答地址必须是单播地址,除非请求端的源IP地址是0.0.0.0。本例不属于这种情况,因此,把应答发送到广播地址是BSD/386的一个内部差错。 RFC规定,除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答(为了成为授权代理,它必须进行特殊配置,以发送这些应答。参见附录E)。但是,正如我们从本例中看到的那样,大多数主机在收到请求时都发送一个应答,甚至有一些主机还发送差错的应答。 最后一点可以通过下面的例子来说明。我们向本机IP地址和环回地址分别发送地址掩码请求: ~~~ sun % icmpaddrmask sun received mask= ff000000, from 140.252.13.33 sun % icmpaddrmask localhost received mask= ff000000, from 127.0.0.1 ~~~ 上述两种情况下返回的地址掩码对应的都是环回地址,即A类地址127.0.0.1。还有,我们从图2-4可以看到,发送给本机IP地址的数据报(140.252.12.33)实际上是送到环回接口。 ICMP地址掩码应答必须是收到请求接口的子网掩码(这是因为多接口主机每个接口有不同的子网掩码),因此两种情况下地址掩码请求都来自于环回接口。