我們可以寫一個簡單程序(取名為icmptime),給某個主機發送ICMP時間戳請求,并打印出返回的應答。它在我們的小互聯網上運行結果如下:

程序打印出ICMP報文中的三個時間戳:發起時間戳(orig)、接收時間戳(recv)以及發送時間戳(xmit)。正如我們在這個例子以及下面的例子中所看到的那樣,所有的主機把接收時間戳和發送時間戳都設成相同的值。
我們還能計算出往返時間(rtt),它的值是收到應答時的時間值減去發送請求時的時間值。difference的值是接收時間戳值減去發起時間戳值。這些值之間的關系如圖6-7所示。

如果我們相信RTT的值,并且相信RTT的一半用于請求報文的傳輸,另一半用于應答報文的傳輸,那么為了使本機時鐘與查詢主機的時鐘一致,本機時鐘需要進行調整,調整值是difference減去RTT的一半。在前面的例子中, bsdi的時鐘比sun的時鐘要慢7 ms和8 ms。
由于時間戳的值是自午夜開始計算的毫秒數,即UTC,因此它們的值始終小于86400000 (24×60×60×1000)。這些例子都是在下午4:00以前運行的,并且在一個比UTC慢7個小時的時區,因此它們的值比82800000(2300小時)要大是有道理的。
如果對主機bsdi重復運行該程序數次,我們發現接收時間戳和發送時間戳的最后一位數總是0。這是因為該版本的軟件(0.9.4版)只能提供10ms的時間分辨率(說明參見附錄B)。
如果對主機svr4運行該程序兩次,我們發現SVR4時間戳的最后三位數始終為0:

由于某種原因, SVR4在ICMP時間戳中不提供毫秒級的分辨率。這樣,對秒以下的時間差調整將不起任何作用。
如果我們對子網140.252.1上的其他主機運行該程序,結果表明其中一臺主機的時鐘與sun相差3.7秒,而另一個主機時鐘相差近75秒:

另一個令人感興趣的例子是路由器gateway(一個Cisco路由器)。它表明,當系統返回一個非標準時間戳值時(不是自午夜開始計算的毫秒數, UTC),它就用32 bit時間戳中的高位來表示。我們的程序證明了一點,在尖括號中打印出了接收和發送的時間戳值(在關閉高位之后)。另外,不能計算發起時間戳和接收時間戳之間的時間差,因為它們的單位不一致。

如果我們在這臺主機上運行該程序數次,會發現時間戳值顯然具有毫秒級的分辨率,而且是從某個起始點開始計算的毫秒數,但是起始點并不是午夜UTC(例如,可能是從路由器引導時開始計數的毫秒數)。
作為最后一個例子,我們來比較sun主機和另一個已知是準確的系統時鐘—一個NT Pstratum1服務器(下面我們會更多地討論NTP,網絡時間協議)。

如果我們把difference的值減去RTT的一半,結果表明sun主機上的時鐘要快38.5~51.5 ms。
- 第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 小結