網絡時間協議(英語:Network Time Protocol,縮寫:NTP)是在數據網絡潛伏時間可變的計算機系統之間經過分組交換進行時鐘同步的一個網絡協議,位於OSI模型的應用層。自1985年以來,NTP是目前仍在使用的最古老的互聯網協議之一。NTP由特拉華大學的David L. Mills設計。
NTP意圖將全部參與計算機的協調世界時(UTC)時間同步到幾毫秒的偏差內。它使用Marzullo算法的修改版來選擇準確的時間服務器,其設計旨在減輕可變網絡延遲形成的影響。NTP一般能夠在公共互聯網保持幾十毫秒的偏差,而且在理想的局域網環境中能夠實現超過1毫秒的精度。不對稱路由和擁塞控制可能致使100毫秒(或更高)的錯誤。
該協議一般描述爲一種主從式架構,但它也能夠用在點對點網絡中,對等體雙方可將另外一端認定爲潛在的時間源。發送和接收時間戳採用用戶數據報協議(UDP)的端口123實現。這也可使用廣播或多播,其中的客戶端在最初的往返校準交換後被動地監聽時間更新。NTP提供一個即將到來閏秒調整的警告,但不會傳輸有關本地時區或夏時制的信息。
當前協議爲版本4(NTPv4),這是一個RFC 5905文檔中的建議標準。它向下兼容指定於RFC 1305的版本3。算法
ntp組件是Linux平臺ntp協議的軟件實現,部分Linux操做系統默認安裝了ntp組件,若是沒有先安裝ntp,才能使用該協議完成時間同步。安全
服務器能訪問外網而且配置了DNS,直接服務器
ntpdate 0.cn.pool.ntp.org 或 nptdate ntp1.aliyun.com
就能夠同步外網時間。網絡
部分服務器出於安全考慮,雖然通外網,但沒有配置DNS,這時須要直接從時間服務器的ip地址同步時間。可使用阿里雲(ntp1.aliyun.com)的時間服務器ip直接同步,架構
ntpdate 120.24.81.91 或者 清華的時間服務器ntpdate 84.16.73.33
假設局域網有一臺服務器(ip地址是IP_TIME)時間是正確的,將這臺服務器配置爲局域網ntp時間服務器,其它服務器執行測試
ntpdate IP_TIME
這樣,至少全部服務器就和這臺的時間同步了,這臺是否須要和網絡時間同步要看功能要求。確實須要的話,這臺必須能夠訪問互聯網,按上面描述同步到網絡時間,其他可保持不能訪問互聯網的狀態。ui
假設A B兩臺Linux服務器,要將兩臺都同步到網絡時間。
A是開通了外網的,雖然沒配置DNS服務器,但能ping通120.24.81.91(阿里雲時間服務器)。能夠直接同步時間。
B沒開通外網,ping 120.24.81.91會報connect: Network is unreachable,這種確定沒法從外網服務器同步時間。執行ntpdate 120.24.81.91,會報no server suitable for synchronization found,或者no servers can be used, exiting。
解決辦法統共分三步,A和B的防火牆都關閉,整個過程用root帳號操做。阿里雲
服務器第一次同步時間顯示以下操作系統
[root@localhost ~]# ntpdate 120.24.81.91 10 Aug 09:46:07 ntpdate[15071]: step time server 120.24.81.91 offset 1.423469 sec
第2-n次顯示以下設計
[root@localhost ~]# ntpdate 120.24.81.91 10 Aug 14:16:14 ntpdate[12150]: adjust time server 120.24.81.91 offset -0.030012 sec
每執行一次,offset後面的偏差都會變化,趨勢是愈來愈準確。
配置A爲NTP server,首先修改配置文件/etc/ntp.conf。怎麼修改往下看。
修改完成執行以下cat指令,除了192.168.2.0改爲你本身局域網的網段,其他要求必須和下面同樣,有比下面多出的語句就註釋掉,沒有的語句就加上。若是剛好和下面同樣,192位置也是你的局域網網段,那就什麼都不用改。
#cat /etc/ntp.conf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}' restrict default ignore //#設置默認策略爲容許任何主機進行時間同步 restrict 127.0.0.1 //給於本機全部權限 restrict 192.168.2.0 mask 255.255.255.0 nomodify notrap //給於局域網機的機器有同步時間的權限 server 0.127.127.1.0 //設置時間服務器爲本機,能夠設爲120.24.81.91外網服務器 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 driftfile /var/lib/ntp/drift broadcastdelay 0.008 keys /etc/ntp/keys
而後執行
# /etc/init.d/ntpd start 或 #service ntpd start
會顯示OK,表示成功,本機已是NTP server了。
若是配置文件反覆修改,執行
# /etc/init.d/ntpd restart
從新加載配置文件。
A啓動NTP server服務後,要等待5分鐘,才能在B上執行同步時間指令,這個時間是給NTP server同步本機時間用的。
5分鐘後在B上執行
[root@DB1 ~]# ntpdate AIP (AIP是A的內網IP地址) 10 Aug 13:35:59 ntpdate[10737]: adjust time server AIP offset 0.004937 sec
,就能夠同步A的系統時間到B,也至關於同步了外網時間。
因爲NTP server自己時間還沒和操做系統同步好,會返回錯誤
no server suitable for synchronization found
可使用ntpdate –d AIP指令查看。
[root@DB1 ~]# ntpdate -d AIP 10 Aug 13:28:07 ntpdate[10719]: ntpdate 4.2.0a@1.1190-r Thu Oct 5 04:11:32 EDT 2006 (1) Looking for host 192.168.2.10 and service ntp host found : 192.168.2.10 transmit(192.168.2.10) receive(192.168.2.10) 省略 192.168.2.10: Server dropped: strata too high server 192.168.2.10, port 123 stratum 16, precision -20, leap 11, trust 000 refid [192.168.2.10], delay 0.02573, dispersion 0.00000 省略
有「Server dropped: strata too high」的提示,而且「stratum 16」。
stratum的正常範圍是「0~15」。
什麼都不用作,等一段時間再執行指令試試,就會變成stratum 11, precision -20, leap 00, trust 000。stratum 11是正常範圍,此時執行ntpdate AIP就成功同步時間了。
B須要頻繁校訂時間的話,crontab配置ntpdate指令能夠達到目的。
crontab -e 9 7 * * * /usr/sbin/ntpdate AIP
操做系統時間同步到硬件時間也均可以根據須要設定crontab。硬件時間保持和操做系統時間一致的好處是能夠避免重啓服務器後硬件時間覆蓋系統時間致使偏差。
經測試,ntpd服務運行時,沒法執行ntpdate指令。要頻繁同步網絡時間,還要做爲局域網的NTP server給其它服務器同步時間,A上的crontab定時任務要按照以下順序執行
1. ntpdate 外網時間服務器ip 2. service ntpd start 3. 間隔一段可接受的時間,間隔約長,和網絡時間的偏差越大。 此時B可同步到A的時間 4. service ntpd stop 下面循環回第一步 1. ntpdate 外網時間服務器ip