關鍵字:遊戲 服務器 客戶端 防外掛加速
遊戲當中有些動作要求必須間隔一定時間才能執行,比如跑步等動作。如果僅在客戶端限制的話往往都被加速器(外掛)所破壞。本文假定客戶端必須間隔400毫秒的數據包傳輸,提出服務器端解決加速問題的一種方法。
一、客戶端發送若干數據包
t1=tc;
Send(…);
t2=tc;
Send(…);
…
t6=tc;
Send(…);
t1-6:每個數據包必須包含的發送時客戶端當前時間值
Tc:客戶端當前時間
二、服務器端接收若干數據包
Void OnConnect(void) { IsFirstData = True; } Void OnReceive(…) { ...... T=DataPack.ClientTime; //T當前數據包內的時間值 if(IsFirstData) //第一次接收? { IsFirstData = False; Tsf=Ts; //記錄當前服務器時間 Tcf=T; //記錄數據包內的客戶端的時間值,T=t1 Tlst=T; //保存當次數據包中的時間值 }else { if(T - Tlst < 400) //時間間隔驗證 OnError(); if((T-Tcf) - (Ts-Tsf ) > Tnd+ Tx) //時長驗證 OnError(); if (Ts-Tsf) > MaxLong //每十分鐘初始一次Tsf、Tcf,防止兩端時間誤差累加放大 { Tsf = ts; Tcf=T; } Tlst=T; //保存當次數據包中的時間值 } …… }
Tsf:服務器收第一個數據包時的當前時間
Ts:服務器當前時間
Tcf:客戶端第一個數據包裏面的時間值
T:當前接收到數據包內的客戶端時間值
Tlst:上次接收到的數據包的時間值
Tnd:網絡傳輸延時時間的最大允許值,常量
Tx:客戶端和服務器端的在最大計時週期內(MaxLong)的最大允許的時間累計誤差,常量
(T-Tcf):當前數據包和第一個數據包間隔時長
(Ts-Tsf ):當前服務器時間和接收第一個數據包時的間隔時長
MaxLong:最大計時週期:10分鐘,常量,適當調整
正常情況下(圖一),數據包間隔時間和兩端時間是符合規則的。但如果外掛要想插入兩個數據包(圖二)t7和t8,那麼t7必須等於2400,t8必須等於2800才能滿足(T - Tlst >= 400)條件,這樣在接收到t8的時候(T-Tcf) - (Ts-Tsf )就有800毫秒的誤差,當插入的數據包超過一定數量的時候(假定Tnd + Tx=1000)就會觸發閥門((T-Tcf) - (Ts-Tsf ) > Tnd + Tx)打開,將該用戶列入黑名單並斷線。
實際遊戲中,有效數據包需要限時,有些遊戲不需要,應用起來可能還要複雜些。外掛也可能還有更多的應對策略,但此法可以參考來完善遊戲中的防護機制。