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