6.4 ICMP時間戳請求與應答
I C M P時間戳請求允許系統向另一個系統查詢目前的時間。傳回的建議值是自午夜開始計算的毫秒數,協調的統一時間( Coordinated Universal Time, UTC)(早期的參考手冊認為U T C是格林尼治時間)。這種I C M P封包的好處是它提供了毫秒級的分辨率,而利用其他方法從别的主機擷取的時間(如某些 U n i x系統提供的r d a t e指令)隻能提供秒級的分辨率。由于傳回的時間是從午夜開始計算的,是以調用者必須通過其他方法獲知當時的日期,這是它的一個缺陷。
I C M P時間戳請求和應答封包格式如圖 6 - 6所示。

請求端填寫發起時間戳,然後發送封包。應答系統收到請求封包時填寫接收時間戳,在發送應答時填寫發送時間戳。但是,實際上,大多數的實作把後面兩個字段都設成相同的值(提供三個字段的原因是可以讓發送方分别計算發送請求的時間和發送應答的時間)。
6.4.1 舉例
我們可以寫一個簡單程式(取名為 i c m p t i m e),給某個主機發送 I C M P時間戳請求,并列印出傳回的應答。它在我們的小網際網路上運作結果如下:
程式列印出I C M P封包中的三個時間戳:發起時間戳( o r i g)、接收時間戳( r e c v)以及發送時間戳( x m i t)。正如我們在這個例子以及下面的例子中所看到的那樣,所有的主機把接收時間戳和發送時間戳都設成相同的值。
我們還能計算出往返時間(r t t),它的值是收到應答時的時間值減去發送請求時的時間值。d i f f e r e n c e的值是接收時間戳值減去發起時間戳值。這些值之間的關系如圖6 - 7所示。
如果我們相信RT T的值,并且相信RT T的一半用于請求封包的傳輸,另一半用于應答封包的傳輸,那麼為了使本機時鐘與查詢主機的時鐘一緻,本機時鐘需要進行調整,調整值是d i f f e r e n c e減去RT T的一半。在前面的例子中, b s d i的時鐘比s u n的時鐘要慢7 ms和8 ms。
由于時間戳的值是自午夜開始計算的毫秒數,即 U T C,是以它們的值始終小于86 400 000( 2 4×6 0×6 0×1 0 0 0 )。這些例子都是在下午 4 : 0 0以前運作的,并且在一個比 U T C慢7個小時的時區,是以它們的值比82 800 000(2 3 0 0小時)要大是有道理的。
如果對主機b s d i重複運作該程式數次,我們發現接收時間戳和發送時間戳的最後一位數總是0。這是因為該版本的軟體( 0 . 9 . 4版)隻能提供1 0 m s的時間分辨率(說明參見附錄 B)。如果對主機s v r 4運作該程式兩次,我們發現 S V R 4時間戳的最後三位數始終為 0:
由于某種原因, S V R 4在I C M P時間戳中不提供毫秒級的分辨率。這樣,對秒以下的時間差調整将不起任何作用。
如果我們對子網 1 4 0 . 2 5 2 . 1上的其他主機運作該程式,結果表明其中一台主機的時鐘與s u n相差3 . 7秒,而另一個主機時鐘相差近 7 5秒:
另一個令人感興趣的例子是路由器 g a t e w a y(一個C i s c o路由器)。它表明,當系統傳回一個非标準時間戳值時(不是自午夜開始計算的毫秒數, U T C),它就用32 bit時間戳中的高位來表示。我們的程式證明了一點,在尖括号中列印出了接收和發送的時間戳值(在關閉高位之後)。另外,不能計算發起時間戳和接收時間戳之間的時間差,因為它們的機關不一緻。
如果我們在這台主機上運作該程式數次,會發現時間戳值顯然具有毫秒級的分辨率,而且是從某個起始點開始計算的毫秒數,但是起始點并不是午夜 U T C(例如,可能是從路由器引導時開始計數的毫秒數)。
作為最後一個例子,我們來比較 s u n主機和另一個已知是準确的系統時鐘—一個N T Pstratum 1伺服器(下面我們會更多地讨論 N T P,網絡時間協定)。
如果我們把d i f f e r e n c e的值減去RT T的一半,結果表明s u n主機上的時鐘要快3 8 . 5~51.5 ms。
6.4.2 另一種方法
還可以用另一種方法來獲得時間和日期。
- 在1 . 1 2節中描述了日期服務程式和時間服務程式。前者是以人們可讀的格式傳回目前的時間和日期,是一行A S C I I字元。可以用t e l n e t指令來驗證這個服務:
另一方面,時間服務程式傳回的是一個 3 2 b i t的二制進數值,表示自 U T C,1 9 0 0年1月1日午夜起算的秒數。這個程式是以秒為機關提供的日期和時間(前面我們提過的 r d a t e指令使用的是T C P時間服務程式)。
- 嚴格的計時器使用網絡時間協定( N T P),該協定在 RFC 1305中給出了描述 [ M i l l s 1 9 9 2 ]。這個協定采用先進的技術來保證 L A N或WA N上的一組系統的時鐘誤差在毫秒級以内。對計算機精确時間感興趣的讀者應該閱讀這份 R F C文檔。
- 開放軟體基金會( O S F)的分布式計算環境( D C E)定義了分布式時間服務( D T S),它也提供計算機之間的時鐘同步。文獻 [ R o s e n b e rg, Kenney and Fisher 1992]提供了該服務的其他細節描述。
- 伯克利大學的 U n i x系統提供守護程式 t i m e d( 8 ),來同步區域網路上的系統時鐘。不像N T P和D T S,t i m e d不在廣域網範圍内工作。