ICMP地址掩碼請求用于無盤系統在引導過程中獲取自己的子網掩碼(3.5節)。系統廣播它的ICMP請求報文(這一過程與無盤系統在引導過程中用RARP獲取IP地址是類似的)。無盤系統獲取子網掩碼的另一個方法是BOOTP協議,我們將在第16章中介紹。ICMP地址掩碼請求和應答報文的格式如圖6-4所示。

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選項來查看硬件地址。

注意,盡管在線路上什么也看不見,但是發送主機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地址掩碼應答必須是收到請求接口的子網掩碼(這是因為多接口主機每個接口有不同的子網掩碼),因此兩種情況下地址掩碼請求都來自于環回接口。
- 第1章 概述
- 1.1 引言
- 1.2 分層
- 1.3 TCP/IP的分層
- 1.4 互聯網的地址
- 1.5 域名系統
- 1.6 封裝
- 1.7 分用
- 1.8 客戶-服務器模型
- 1.9 端口號
- 1.10 標準化過程
- 1.11 RFC
- 1.12 標準的簡單服務
- 1.13 互聯網
- 1.14 實現
- 1.15 應用編程接口
- 1.16 測試網絡
- 1.17 小結
- 第2章 鏈路層
- 2.1 引言
- 2.2 以太網和IEEE 802封裝
- 2.3 尾部封裝
- 2.4 SLIP:串行線路IP
- 2.5 壓縮的SLIP
- 2.6 PPP:點對點協議
- 2.7 環回接口
- 2.8 最大傳輸單元MTU
- 2.9 路徑MTU
- 2.10 串行線路吞吐量計算
- 2.11 小結
- 第3章 IP:網際協議
- 3.1 引言
- 3.2 IP首部
- 3.3 IP路由選擇
- 3.4 子網尋址
- 3.5 子網掩碼
- 3.6 特殊情況的IP地址
- 3.7 一個子網的例子
- 3.8 ifconfig命令
- 3.9 netstat命令
- 3.10 IP的未來
- 3.11 小結
- 第4章 ARP:地址解析協議
- 4.1 引言
- 4.2 一個例子
- 4.3 ARP高速緩存
- 4.4 ARP的分組格式
- 4.5 ARP舉例
- 4.5.1 一般的例子
- 4.5.2 對不存在主機的ARP請求
- 4.5.3 ARP高速緩存超時設置
- 4.6 ARP代理
- 4.7 免費ARP
- 4.8 arp命令
- 4.9 小結
- 第5章 RARP:逆地址解析協議
- 5.1 引言
- 5.2 RARP的分組格式
- 5.3 RARP舉例
- 5.4 RARP服務器的設計
- 5.4.1 作為用戶進程的RARP服務器
- 5.4.2 每個網絡有多個RARP服務器
- 5.5 小結
- 第6章 ICMP:Internet控制報文協議
- 6.1 引言
- 6.2 ICMP報文的類型
- 6.3 ICMP地址掩碼請求與應答
- 6.4 ICMP時間戳請求與應答
- 6.4.1 舉例
- 6.4.2 另一種方法
- 6.5 ICMP端口不可達差錯
- 6.6 ICMP報文的4.4BSD處理
- 6.7 小結
- 第7章 Ping程序
- 7.1 引言
- 7.2 Ping程序
- 7.2.1 LAN輸出
- 7.2.2 WAN輸出
- 7.2.3 線路SLIP鏈接
- 7.2.4 撥號SLIP鏈路
- 7.3 IP記錄路由選項
- 7.3.1 通常的例子
- 7.3.2 異常的輸出
- 7.4 IP時間戳選項
- 7.5 小結
- 第8章 Traceroute程序
- 8.1 引言
- 8.2 Traceroute程序的操作
- 8.3 局域網輸出
- 8.4 廣域網輸出
- 8.5 IP源站選路選項
- 8.5.1 寬松的源站選路的traceroute程序示例
- 8.5.2 嚴格的源站選路的traceroute程序示例
- 8.5.3 寬松的源站選路traceroute程序的往返路由
- 8.6 小結
- 第9章 IP選路
- 9.1 引言
- 9.2 選路的原理
- 9.2.1 簡單路由表
- 9.2.2 初始化路由表
- 9.2.3 較復雜的路由表
- 9.2.4 沒有到達目的地的路由
- 9.3 ICMP主機與網絡不可達差錯
- 9.4 轉發或不轉發
- 9.5 ICMP重定向差錯
- 9.5.1 一個例子
- 9.5.2 更多的細節
- 9.6 ICMP路由器發現報文
- 9.6.1 路由器操作
- 9.6.2 主機操作
- 9.6.3 實現
- 9.7 小結