关于数据包的时间间隔

37 views
Skip to first unread message

Ghost Cheng

unread,
Mar 10, 2006, 5:07:40 PM3/10/06
to dev4server
Hi all:
 
我本来希望根据每次收到玩家数据包的时间来判断他是否使用了加速外挂。
比如连续两次数据包的时间间隔小于多少毫秒,就认为是外挂。
 
但是因为TCP粘包的问题,导致经常两个包一起收到,这样时间就不能准确判断了。
而我又不能将这个判断放到网络层,因为除了移动、打怪的消息是需要时间检测的,
其他消息,比如获取一些信息之类,会连续发送。
 
客户端我也已经关闭了NG算法,但是服务器的缓冲区还是经常两个包一起收,
不知道诸位有什么好办法解决这个问题?

--

Sincerely,
Ghost Cheng
Email : ghost...@gmail.com
Web : http://www.GhostSoft.net

burns7975

unread,
Mar 10, 2006, 10:38:06 PM3/10/06
to 高性能网络编程邮件列表
试试看:

将WSASend或WSARead的第五个参数设置为MSG_PARTIAL

Collins

unread,
Mar 10, 2006, 11:19:51 PM3/10/06
to 高性能网络编程邮件列表
我觉得防外挂可以通过频繁的更改通讯协议来实现,比如协议标识或者版本号,每次停机维护的时候都要更新。

Collins

unread,
Mar 10, 2006, 11:23:33 PM3/10/06
to 高性能网络编程邮件列表
如果是防加速外挂,我觉得可以单独设计一个包,客户端每n秒发一次,服务器可以通过计算这个包的平均时间间隔来判断客户端是否用了加速外挂。

Ghost Cheng

unread,
Mar 11, 2006, 2:40:24 AM3/11/06
to dev4s...@googlegroups.com
Hi all:
 
多谢burns7975与Collins,我现在还是采取了从网络层检测时间间隔的方式,client的send线程,每发一个数据包后sleep(500)。
 
to burns7975:
我后来想通了,强行取消系统原有的缓冲机制,会给服务器造成一些额外负担,所以还是使用系统的缓冲方式。
 
另外 to Collins:
"单独设计一个包,客户端每n秒发一次"我觉得这个办法只能防变速精灵一类的程序,
如果有人分析了你的协议,自己写一个脱机挂,将移动与攻击的数据包加速发送,而你那个特定的定时数据包按要求发送,
那一样没有用阿~
 
还有,我觉得频繁的更改通讯协议毕竟不是长久之计,感觉不太爽。

史上最菜鸟

unread,
Mar 12, 2006, 10:20:59 PM3/12/06
to 高性能网络编程邮件列表
可以象魔兽世界样,设计技能的冷却时间,靠程序内部来实现。依靠网络发包来判断使不可靠的。

WL38

unread,
Mar 13, 2006, 1:24:54 AM3/13/06
to 高性能网络编程邮件列表
每个包都打时间戳,首先记录下第一个包的时间和你的服务器时间差T1。以后判断每个包的时间戳和上一个包的时间戳必须相差比如1秒,这样就好了。以后时不时地检查一下他发来的包的时间戳和你服务器时间差
T2 ,如果 T2 慢慢地越来越大于(或小于)T1
,那就说明这个包是伪造的,或者说时间戳是伪造的。

不过……,这个开销似乎太大了,看你取舍了。

ppmsn2005

unread,
Mar 13, 2006, 1:40:49 AM3/13/06
to dev4s...@googlegroups.com
见鬼了 这种方法。 网络不确定性 一点没考虑。

Roger Chen

unread,
Mar 13, 2006, 1:58:03 AM3/13/06
to dev4s...@googlegroups.com
我的看法是,服务器端需要处理的是各个操作之间的最小时延,其他的处理则应该
在客户端来判断,比如是否采用了加速外挂等等,服务器不适合用来处理这种情况
,因为变量实在太多了。

比如从操作A到操作B最少要t1时间,操作B到操作C最少要t2时间,则服务器要保证
的是这些操作的被处理的时间差至少要有这个数值,多出来则基本不用考虑。在
Java 5.0 concurrent包中有一个Delayed接口和DelayQueue实现,把用户发送的这
些数据包添加到DelayQueue队列实现中,会保证这些数据包至少在这么多时延后才
能被拿到。当然,这个队列也得做流量控制,超出流量后做相应处理。


On Sun, 12 Mar 2006 22:24:54 -0800
"WL38" <wl...@hotmail.com> 撰写于:

--
Roger Chen <che...@gmail.com>

WL38

unread,
Mar 13, 2006, 2:00:16 AM3/13/06
to 高性能网络编程邮件列表
网络确不确定和我没有什么关系吧,这个时间戳是客户端打的,就算数据包在网络上传一年,时间戳也只是1年前的时间戳,不会变。请
ppmsn2005 指教1、2

soar...@msn.com

unread,
Mar 15, 2006, 5:02:29 AM3/15/06
to 高性能网络编程邮件列表
某些消息包里带上时间戳,服务器就可以很方便的判断出客户端是不是在采用变数齿轮之类的程序了

sunway

unread,
Mar 15, 2006, 9:01:15 PM3/15/06
to 高性能网络编程邮件列表
>>某些消息包里带上时间戳,服务器就可以很方便的判断出客户端是不是在采用变数齿轮之类的程序了
时间戳可以被更改的。

WL38

unread,
Mar 15, 2006, 9:11:33 PM3/15/06
to 高性能网络编程邮件列表
时间戳的确可以伪造,但是焦点在于时间变化速率和服务器上的变化速率不一致,这个变化速率是不能伪造的吧

sunway

unread,
Mar 15, 2006, 9:15:37 PM3/15/06
to 高性能网络编程邮件列表
既然服务器上也要统计变化速率,那包里要这个时间戳是浪费带宽,
服务器上只根据计算的变化速率计算一下就OK了

WL38

unread,
Mar 15, 2006, 10:59:21 PM3/15/06
to 高性能网络编程邮件列表
呵呵,这就是楼主的问题焦点所在了!TCP粘包,所以服务器根据收到包的时间计算速率肯定不对的。

sunway

unread,
Mar 15, 2006, 11:43:48 PM3/15/06
to 高性能网络编程邮件列表
禁止使用朗格算法就可以了,根据我的开发经验,比如跑步攻击这类比较的频繁的数据包不会出现粘包。出现只能说明客户端代码有BUG。
>>呵呵,这就是楼主的问题焦点所在了!TCP粘包,所以服务器根据收到包的时间计算速率肯定不对的。
Reply all
Reply to author
Forward
0 new messages