- 本章主要講如何實現(xiàn)一個網(wǎng)絡(luò)時間協(xié)議NTP(Network Time Protocol)客戶端,谷歌的世界時間同步誤差大概在7毫秒,開源網(wǎng)站CockroachDB的延遲在數(shù)十毫秒,使用了NTP協(xié)議,在處理與時間敏感的數(shù)據(jù)時,
chrono
庫成為了事實上的標準庫; - 由于潮汐影響和地球轉(zhuǎn)矩的問題,事實上每一秒的長度不是固定的,引出了兩種時間機制,一種是TAI,用于世界的原子時鐘,每秒長度固定;另一種是UTC,用于通常生活中,差不多每隔18個月會添加1個閏秒,到2016年,TAI和UTC的偏差已經(jīng)達到了36秒;在計算機系統(tǒng)中通常跑著兩種時鐘(clocks),一種叫實時時鐘(real-time clock),根據(jù)物理設(shè)備(例如石英鐘)的震動來統(tǒng)計時間,用于沒有電源驅(qū)動的場景,一種叫系統(tǒng)時間(system time),系統(tǒng)時間根據(jù)硬件中斷來增加,所有電腦上的應(yīng)用獲取時間都是通過system time;
- 9.3節(jié)介紹了幾個時間有關(guān)的術(shù)語,例如
Absolute time
、Real-time clock
、system clock
、monotonically increasing
、steady clock
、High accuracy
、High resolution
、fast clock
等等,對于理解各種不同的時間有很大的幫助; - 時間的編碼使用了2個32位integer,第一個表示秒,第二個表示n分之一秒(fraction of a second),好處有兩點,簡單易懂,計算高效;挑戰(zhàn)也有兩點,范圍固定(有上限,因為integer寬度有限),不準確(整型是離散的而不是連續(xù)的),幾個常見的表示時間的方式有,a. UNIX時間戳,32位整型,表示從1970年1月1日其的毫秒數(shù);b. MS Windows FILETIME(從Windows 2000開始啟用),64位無符號整型,表示從1601年1月1日(UTC時間)到當時的100納秒的增量(increments);c. Rust社區(qū)的chrono庫,32位有符號整型,同時帶有NaiveTime的枚舉類型來表示不同的時區(qū);d. time_t類型,在C標準庫libc里,不同版本也有一定區(qū)別,詳見Page298;
- 9.5給出了應(yīng)用獲得系統(tǒng)時間的具體調(diào)用過程,如下
- 獲取本地時間的方法可以使用
chrono::Local::now()
,如果返回值是感嘆號!
,表示該函數(shù)永不返回,代碼跑到unimplemented!()
宏這里時會panic; - 用
clap::Arg
或者clap::App
來處理輸入?yún)?shù),clap::Arg
可以幫助簡單處理輸入?yún)?shù),clap::App
把整個程序封裝成應(yīng)用,可以添加版本、參數(shù)說明、參數(shù)是否必須等要求; - 可以在
cargo.toml
指定[target.'cfg(not(windows))'.dependencies]
用于非windows操作系統(tǒng)編譯時的依賴,同理,去掉not可以用于設(shè)置Windows操作系統(tǒng)的依賴; - NTP有兩種模式,一種是always on,采用p2p的形式來在局域網(wǎng)中達成一個穩(wěn)定的關(guān)于"now"的共識,一種是request/response,通過向服務(wù)器發(fā)送請求(request)來獲取一個中心化認可的時間戳,通過記錄傳輸時間來校準;
- request/response模式有4個時間點需要記錄,t1表示客戶端發(fā)出request的時間戳、t2表示服務(wù)端收到客戶端request的時間戳、t3表示服務(wù)端發(fā)出response的時間戳、t4表示客戶端收到response的時間戳,這4個時間戳的格式在RFC2030中規(guī)定,流程如下圖所示,9.9.1節(jié)提供了詳細實現(xiàn)
11. NTP中要計算兩個值, θ \theta θ 和 δ \delta δ,如下表所示,表示從客戶端到服務(wù)端的傳輸延遲,實際應(yīng)用中會發(fā)送requests到多個server來減小單個服務(wù)的誤差
文章來源地址http://www.zghlxwxcb.cn/news/detail-525273.html
文章來源:http://www.zghlxwxcb.cn/news/detail-525273.html
到了這里,關(guān)于Rust in Action筆記 第九章 時間管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!