基于http的毫秒級時鐘校準方法
【技術領域】
[0001]本發(fā)明涉及一種基于HTTP的毫秒級時鐘校準方法,屬于技術領域。
【背景技術】
[0002]在日常生活中,越來越多網(wǎng)站推出了搶購活動,例如淘寶、京東、當當?shù)然ヂ?lián)網(wǎng)企業(yè)推出的限時搶購活動,以及12306的網(wǎng)上售票等,吸引了越來越多用戶參與其中。但是由于本機與目標主機之間的時間存在誤差,導致慢人一步,搶購失敗而大失所望,這樣的例子隨處可見。
[0003]隨著大家對搶購活動的熱衷程度不斷加深,網(wǎng)上出現(xiàn)了大量的搶購軟件。這些搶購軟件利用頻繁刷新和驗證的手段進行搶購,然而這種方式一方面隨著驗證方式復雜性的增強,破解驗證的難度也不斷增加;另一方面頻繁刷新對網(wǎng)站的服務器造成了極大的壓力,以至于各大網(wǎng)站通過各種技術手段來遏制這種行為。根據(jù)新華社的最新采訪,12306網(wǎng)站表示為了保證旅客購票和網(wǎng)站平穩(wěn)運行,他們正在加大對惡意搶票軟件的遏制和防控,并且取得了一定的效果。所以,這種通過頻繁刷新和破解驗證的手段并非是最優(yōu)的選擇。于是怎樣提高準確度成為了解決這個問題的關鍵點。
[0004]目前,許多網(wǎng)站的搶購時間提示只精確到秒級別,不顯示毫秒級的時間,即使部分網(wǎng)站頁面上顯示了看似精確的毫秒級時鐘倒計時,但是該倒計時通常是使用Ja V a S c r i P t腳本在客戶端瀏覽器上使用SetTimeout函數(shù)模擬顯示出來的,受到JavaScript計時機制的影響,該時鐘并不精確。鑒于搶購過程中毫秒級的誤差往往決定了搶購能否成功。
[0005]解決網(wǎng)絡時鐘同步常用的手段是NTP的同步對時方式,該方式是基于NTP協(xié)議,由服務器向客戶端發(fā)送帶有時間戳的NTP包從而估計客戶端與服務器之間的時間誤差,諸如《基于NTP協(xié)議的網(wǎng)絡時間同步系統(tǒng)的研宄與實現(xiàn)》、《高精度計算機網(wǎng)絡時鐘同步技術的研宄》、《網(wǎng)絡時鐘同步的研宄》等論文都對這種方式進行了深入研宄。但是,這種方式的不足在于依賴服務器端對NTP的支持,所以在服務器不提供NTP支持的情況下,該方法并不能獲得客戶端與服務器之間的時鐘誤差。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的目的在于克服現(xiàn)有技術中的不足,提供一種基于HTTP的毫秒級時鐘校準方法,解決現(xiàn)有技術中目標網(wǎng)站僅顯示到秒,對于毫秒級別的時間不能精確獲取,導致本地主機與目標主機時鐘不能同步精確到毫秒的技術問題。
[0007]為解決上述技術問題,本發(fā)明所采用的技術方案是:基于HTTP的毫秒級時鐘校準方法,包括如下步驟:
[0008]步驟一:設置毫秒級時鐘誤差下限為tl,毫秒級時鐘誤差上限為t2,發(fā)送HTTP請求的毫秒級時間間隔為t,t = (t2-tl)/2 ;
[0009]步驟二:在本地時鐘到達整數(shù)秒時,本地主機向目標主機發(fā)送第一個HTTP請求,記錄本地主機發(fā)送時間sendTimel,接收到第一次響應時的本地主機時間backTimel以及目標主機發(fā)送響應的時間serverTimel ;
[0010]步驟三:等待一個時間間隔t,使本地主機向目標主機發(fā)送第二個HTTP請求,記錄本地主機發(fā)送時間sendTime2,接收到第二次響應時的本地主機時間backTime2以及目標主機發(fā)送響應的時間serverTime2 ;
[0011]步驟四:根據(jù)sendTimel、backTimel計算網(wǎng)絡單向時延OWD,OffD =(backTimel-sendTimel)/2 ;
[0012]步驟五:計算秒級誤差Δ??:計算backTimel-serverTimel-OWD,取計算結果的值向上取整賦值給Atl ;
[0013]步驟六:若Λ 11>0,表示本地主機時間比目標主機時間快,則轉到步驟七;
[0014]若Atl彡0,表示本地主機時間比目標主機時間慢或者同步,則轉到步驟八;
[0015]步驟七:若serverTimel年serverTime2,則毫秒級誤差Δ t2在tl至t之間,將t賦給t2,再將新的tl、t2的中點作為新的t,即t2 = t,t = (tl+t2)/2 ;
[0016]若serverTimel == serverTime2,則毫秒級誤差Δ t2在t至t2之間,將t賦給tl,再將新的tl、t2的中點作為新的t,即tl = t,t = (tl+t2)/2 ;跳轉到步驟九;
[0017]步驟八:若serverTimel年serverTime2,則毫秒級誤差Δ t2在t至t2之間,將t賦給tl,再將新的tl、t2的中點作為新的t,即tl = t,t = (tl+t2)/2 ;
[0018]若serverTimel == serverTime2,則毫秒級誤差Δ?2在tl至t之間,將t賦給t2,再將新的tl、t2的中點作為新的t,即t2 = t,t = (tl+t2)/2 ;跳轉到步驟九;
[0019]步驟九:若tl Φ t2,則跳轉至步驟二 ;若tl = = t2,則At2 = tl,進入下一步;
[0020]步驟十:若Atl>0,輸出時鐘誤差At = Atl+At2 ;若Atl彡0,輸出時鐘誤差At= Δ tl- Δ t2 ;
[0021]步驟^^一:根據(jù)時鐘誤差調(diào)整本地主機時間,消除本地主機與目標主機之間的時間差。
[0022]所述毫秒級時鐘誤差下限tl = 0ms,毫秒級時鐘誤差上限t2 = 1000ms,發(fā)送HTTP請求的毫秒級時間間隔t = 500msο
[0023]所述目標主機發(fā)送響應的時間是通過解析接收到的HTTP響應中的Data字符串得到的。
[0024]所述本地主機發(fā)送時間、接收到響應時的本地主機時間和目標主機發(fā)送響應時間均采用UTC格式。
[0025]與現(xiàn)有技術相比,本發(fā)明所達到的有益效果是:(I)該發(fā)明能夠將本機與目標主機的之間的誤差精確到毫秒級別;(2)按照HTTP協(xié)議規(guī)范,服務器返回的響應數(shù)據(jù)頭信息中包含有精確到秒的時間,因此本發(fā)明可以與任何網(wǎng)站服務器進行時鐘校準;(3)使用二分法估計毫秒級誤差,僅需要進行10次左右的交互即可以將誤差確定到毫秒級別,且本地主機每秒只與目標主機進行一次交互,在提高效率的同時也不會對服務器造成過大壓力,應用于網(wǎng)站購票能夠提高購票成功率,具有較好的實用價值和市場推廣前景。
【附圖說明】
[0026]圖1是本發(fā)明中時鐘誤差計算流程圖。
[0027]圖2是Atl>0時,網(wǎng)絡通信圖。
[0028]圖3是Atl彡O時,網(wǎng)絡通信圖。
[0029]圖中:每格代表I秒,At表示總時間誤差;Δ tl表示秒級誤差;Δ t2表示毫秒級誤差。
【具體實施方式】
[0030]本發(fā)明充分利用現(xiàn)有HTTP協(xié)議中的機制,無需增加客戶端和服務器之間額外通信開銷即可有效解決客戶端時間和服務器時間的同步問題,將本地主機與目標主機之間的同步精確度提尚到暈秒級別。
[0031]作為本發(fā)明的一個實施例,采用Java編程語言以Windows作為運行環(huán)境,主要由預處理模塊、時鐘誤差計算模塊、時鐘校準模塊組成。
[0032]預處理模塊為了將獲取的本地主機時間精確到毫秒,使用Windows多媒體時鐘:調(diào)用Windows系統(tǒng)API的timeGetTime函數(shù),從而獲得從Windows啟動開始所經(jīng)歷的時間(精度為毫秒),進而得到本地主機精確到毫秒的準確時間。
[0033]假設本地主機與目標主機之間的時間誤差為At,At可定義為兩部分:At =Atl+At2,其中Atl為秒級別的誤差,Λ t2為毫秒級別的誤差。假定測算過程中毫秒級誤差At2的誤差范圍是tl至t2,且計算過程中tl、t2精確到毫秒。為了計算方便,本發(fā)明中本地主機發(fā)送時間、接收到響應時的本地主機時間和目標主機發(fā)送響應時間均采用UTC格式存儲,即自1970年I月I日O時O分O秒以來的毫秒數(shù)。
[0034]下面結合附圖對本發(fā)明作進一步描述。
[0035]如圖1所示,為本發(fā)明中時鐘誤差計算方法,包括如下步驟:
[0036]步驟一:設置毫秒級時鐘誤差下限為tl,毫秒級時鐘誤差上限為t2,發(fā)送HTTP請求的毫秒級時間間隔為t,t = (t2-tl)/2 ;本發(fā)明中,毫秒級時鐘誤差下限tl = 0ms,毫秒級時鐘誤差上限t2 = 1000ms,發(fā)送HTTP請求的毫秒級時間間隔t = 500ms。
[0037]步驟二:利用URLConnect1n的實例化對象調(diào)用getOutputStream函數(shù),在本地時鐘到達整數(shù)秒時,本地主機向目標主機發(fā)送第一個HTTP請求,通