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