背景
時間同步這個問題其實大家都會遇到,比如最常見的,我們的電腦上設置時間為,選擇為 internet 時間同步,還有網游服務器面對各個客戶端的時間不固定,如何才能進行客戶端的時間同步,當然還有電商在搞活動的時候,也需要考慮同步客戶端的時間。
簡單的模型
客戶端每次請求服務端的時候,帶上偏移信息,服務端將客戶端上傳的數據時間部分進行矯正,主要是加上這個偏移值,那么客戶端如果計算這個偏移值呢?
假設
網絡傳輸時間不變
客戶端發送請求前的時間為 t1, 服務端接受請求的時間為 T1, 服務端處理完數據,開始響應數據的時間為 T2, 客戶端收到響應的時間為 t2。
client server
t1 -----> T1
-----------|
t2 <----- T2
本次同步網絡傳輸時間為
nt = (t2 - t1) / 2
偏移offset 定義為 同一時刻 服務端時間戳 - 客戶端時間戳
請求時offset1為:
offset1 = T1 - nt - t1 ---------1
響應時 offset2 為:
offset2 = T2 + nt - t2 ----------2
略去 nt :
offset = (offset1 + offset2) / 2 = (T1 - t1 + T2 - t2) / 2
計算模型
offset = (T1 - t1 + T2 - t2) / 2
誤差分析:
由於網絡傳輸耗時不是一個常量,1 式 和 2 式 的 nt 並不相等
優化模型
將多次同步請求的偏移結果,剔除掉異常數據,剩下數據取平均值處理作為最終結果
具體為:
- 隔 200ms 發起一次同步請求,一共發起 5 次 同步請求,記錄五次的偏移結果為: offsets {offset1, offset2, offset3, offset4, offset5}
- 取 offsets 的中位數 offset0
- 求取方差
- 將 offsets 中平方小於方差的累加求和,然后取平均值 offset
- offset 作為時間同步的偏移
其他
http://blog.csdn.net/xufeng0991/article/details/43276363
https://wenku.baidu.com/view/a5e76c07f242336c1fb95e46.html