我来解释一下为啥开外挂能把 zone 里的其他玩家挤下线. (我没下载过eq 服务器端的代码,不过以我编程10多年来的经验,估计相差不多,也欢迎更明白的人指点,服务器端当初可能没有考虑到限制从id 来的消息频繁度)
首先, 客户端(用户的eq 程序 ,和 外挂)发送请求消息, 服务器端接受消息,处理消息.
服务器用队列保存请求来的消息, 这个队列的大小, 是通过当前zone的玩家数量来动态调整的.(比如:当前zone id: 100人;Msg_Queue_Length = 1000), 假设服务器目前的性能,可以在1s内平均处理完1000个请求。
处理 请求的伪代码段可能就是这样的
foreach (单个用户请求消息 in 所有请求消息队列)
{
// do 单个用户请求
// 将处理完的用户请求 从 所有请求消息队列 中 移走,这样其length 就减1
}
接收 服务器将 用户的请求 加入到 所有请求消息队列
{
if (所有请求消息队列的长度 == Msg_Queue_Length )
{
// 将队列里等待时间最长的那个消息请求 remove, 这个逻辑就是关键。比如:普通用户的正常请求还没处理,就被外挂的批量消息给替代掉了。
}
// 将当前消息加入到 所有请求消息队列
}
正常情况下zone 100人, 平均每秒每人 5 个消息请求, 则每一个用户来的请求都能被处理。
如果有人开外挂,外挂最大的特点,就是无间断的 请求消息处理 (人为的操作,是无法产生无间断的大量消息请求)。
如果有人
恶意 主动使用外挂发 大量消息请求 (比如1s内发送800个),这将导致Msg_Queue_Length 里面的1000个请求里的800个被占用,而其他99个id ,只能去分200个消息请求的能力。 必然导致被大面积被卡掉。如果发的消息更多点呢?
可想而知。