P2P网络游戏系统设想
时间:2010-06-18 来源:CS_FB4
一 引言
网络游戏英文缩写为MMOGAME,简称“网游”。通过互联网可以多人同时参与的游戏,通过人与人之间的互动达到交流、娱乐和休闲的目的。
第一款网络游戏出现在1969年,如果想了解网游的历史可以参考百度百科:http://baike.baidu.com/view/3543.htm,网络游戏发展至今已近形成了比较成熟的技术,但随之而来的服务器负载压力却始终无法从软件架构设计上寻求到很好的解决方案,对于MMORPG服务器来说单机负载始终都在数千人左右。目前提升服务器性能的主要方法还是在硬件方面考虑,比如使用服务器组,服务器集群等。
本文试图通过P2P技术,重新构建网游服务器-客户端的架构模型,改变服务器所扮演的角色,下发权利到客户端,以此来降低服务器的负载压力。
二 P2P技术
1 P2P的概念
首先,我想先介绍下P2P技术。目前,在学术界、工业界对于P2P没有一个统一的定义,关于P2P技术存在两种解释:
(1) 一种解释是,P2P(Peer to Peer)中的Peer在英语里是“(地位、能力等)同等者”、“同事”和“伙伴”的意思。从字面上,P2P可以理解为对等互联网。在此网络中的参与者既是资源(服务和内容)提供者 (Server),又是资源获取者(Client);
(2) 另一种解释是,P2P就是一种思想,有着改变整个互联网基础的潜能的思想。客观讲,单从技术角度而言,P2P并未激发出任何重大的创新,而更多的是改变了人们对因特网的理解与认识。正是由于这个原因,IBM早就宣称P2P不是一个技术概念,而是一个社会和经济现象。
图2.1和图2.2是传统的CS模型和P2P模型的一个对比,目前网络游戏普遍采用CS模型。
图 2.1 Client/Server模式
图 2.2 Peer to Peer 模式
2 P2P体系结构与分类
目前存在许多不同特性的P2P网络,对于这些P2P网络的分类主要存在两种,一是按照P2P网络的拓扑结构进行分类,二是按照P2P网络的出现时间对其进行分类。
拓扑结构是指分布式系统中各个计算单元之间物理或逻辑的互联关系,节点之间的拓扑结构一直是确定系统类型的重要依据。按P2P网络的拓扑结构进行的分类可以将P2P网络大致分为四类:中心化拓扑(Centralized Topology)、全分布式非结构化拓扑(Decentralized Unstructured Topology)、全分布式结构化拓扑(Decentralized Structured Topology,也称作DHT网络)和半分布式拓扑(Partially Decentralized Topology):
(1) 中心化拓扑最大的优点是维护简单发现效率高。由于资源的发现依赖中心化的目录系统,发现算法灵活高效并能够实现复杂查询。最大的问题是与传统客户机/服务器结构类似,容易造成单点故障,访问的“热点”现象和法律等相关问题。
(2) 全分布式非结构化拓扑的P2P网络是在重叠网络(Overlay Network)采用了随机图的组织方式,节点度数服从Power-law规律(幂次法则),从而能够较快发现目的节点,面对网络的动态变化体现了较好的容错能力,因此具有较好的可用性。同时可以支持复杂查询,如带有规则表达式的多关键词查询,模糊查询等。
(3) 全分布式结构化拓扑的P2P网络主要是采用分布式散列表(Distributed Hash Table,简写成DHT)技术来组织网络中的节点。DHT是一个由广域范围大量节点共同维护的巨大散列表。散列表被分割成不连续的块,每个节点被分配给一个属于自己的散列块,并成为这个散列块的管理者。通过加密散列函数,一个对象的名字或关键词被映射为128位或160位的散列值。分布式散列表起源于SDDS (Scalable Distribute Data Structures)研究,Gribble等实现了一个高度可扩展,容错的SDDS集群。DHT类结构能够自适应节点的动态加入/退出,有着良好的可扩展性、鲁棒性、节点ID分配的均匀性和自组织能力。由于重叠网络采用了确定性拓扑结构,DHT可以提供精确的发现。只要目的节点存在于网络中DHT 总能发现它,发现的准确性得到了保证。
(4) 半分布式结构(有的文献称作 Hybrid Structure)吸取了中心化结构和全分布式非结构化拓扑的优点,选择性能较高(处理、存储、带宽等方面性能)的节点作为超级点(英文文献中多称作SuperNodes, Hubs),在各个超级点上存储了系统中其他部分节点的信息,发现算法仅在超级点之间转发,超级点再将查询请求转发给适当的叶子节点。半分布式结构也是一个层次式结构,超级点之间构成一个高速转发层,超级点和所负责的普通节点构成若干层次。
在实际应用中,每种拓扑结构的P2P网络都有其优缺点,表2.1从可扩展性、可靠性、可维护性、发现算法的效率、复杂查询等方面比较了这四种拓扑结构的综合性能。
P2P网络的另一种分类方法是按照其出现的时间进行分类,主要存在三代P2P系统:第一代P2P系统是以Napster为代表的中心化拓扑P2P系统,它是P2P思想的萌芽,但最终由于版权问题而失败;第二代P2P系统以Gnutella为代表,它吸取了第一代P2P系统的教训,采用了新的文件交换技术,是一种真正意义上的对等分布式网络;第三代P2P系统的出现主要是为了增加系统的健壮性,如解决第一代P2P系统可能出现的单点故障和第二代P2P系统吞噬网络资源的问题。
表 2.1 P2P系统的几种拓扑机构对比
比较标准/拓扑结构 |
中心化拓扑 |
全分布式非结构化拓扑 |
全分布式结构化拓扑 |
半分布式拓扑 |
可扩展性 |
差 |
差 |
好 |
中 |
可靠性 |
差 |
好 |
好 |
中 |
发现算法效率 |
最高 |
中 |
高 |
中 |
复杂查询 |
支持 |
支持 |
不支持 |
支持 |
三 P2P网络游戏系统设计
1. 设计思路
网络游戏就是一个虚拟的社会,一个具有简单规则的社会。本文将通过模拟人类社会的运作,来一步一步构建网络游戏的服务器和客户端。
首先,我们用“交易”来举个例子,“交易”是网络游戏和人类社会都具有的行为,但是在网络游戏和人类社会中却使用不同的方式实现。
图 3.1 人类社会的交易
在人类社会中,交易行为是直接进行的,公民甲和公民乙之间的交易没有任何中转,他们都是直接联系对方,换取自己所需要的东西。此外,参与交易行为的还有另外一个非常重要角色,那就是法律,法律制约着公民不能不顾他人意愿而强行与其交易。
图 3.2 网游虚拟社会的交易
而交易在网游中却具有另外一种形式。参看图3.2,在网络游戏中,公民甲如果想要和公民乙进行交易,他必须通过服务器告诉公民乙他的这个交易请求,而公民乙对于这个交易的回应同样需要服务器才能传达给公民甲。这一切确实能够很好的运作,但是服务器却因此背负了过多的责任,从而限制了网络游戏虚拟社会的规模。
不难发现人类社会的行为其实就是一个P2P模式的行为,他不仅是一个高效的模式,而且还拥有着几千年的实践经验的考验。而网络游戏的行为是一个CS模式的行为。仔细思考一下,是否能使用人类社会的规则来构建网络游戏虚拟社会呢?
2. P2P网游系统
这一节,我先给一个具有中心化拓扑结构的P2P网络游戏系统,图3.3和图3.4分别是中心服务器和客户端的简要实现。和普通的网络游戏结构很类似,这个系统最大的特点就是客户端有了一个P2P模块,用来直接和其他客户端通信。客户端的P2P模块是解决服务器端负载压力的关键所在。
图 3.3 服务器端设计
服务器端被粗略的分为了6个子服务器:登陆服务器、PK服务器、地图服务器、NPC服务器、广播服务器、信息检索服务器、逻辑服务器(如果在同一台主机上开多个服务器,可以增设网络连接服务器,子服务器间采用进程间通信方法,以减少建立SOCKET对象的数量)。
其中的红色三角形表示这个子服务器上有一个监听端口,用来监听客户端的连接请求。出于对服务器安全上的考虑,只开放了登陆服务器的监听端口,其它5个子服务器不开放任何监听端口,不再使用主动监听的形式,而是主动连接。客户端开放监听端口,等待服务器的连接。
登陆服务器:识别玩家的用户名密码,分配唯一的用户身份识别码(用于用户身份的合法性验证,防止伪封包,交易模块的分析中使用到了这个识别码).
信息检索服务器:随着游戏规模的扩大,游戏信息量的增加,同时也为了减轻服务器端逻辑处理的复杂性,信息检索服务器的出现成为一种必要。逻辑处理模块将注意力集中到实体的ID上,而客户端需要获取某个实体的详细信息时可以从信息检索服务器上查询(请求-响应的方式查询)。将不重要的信息延迟发送,不仅降低了程序设计的复杂性,而且可以提高游戏响应速度。比如说在游戏中,玩家甲拾取了一样物品ID=1234,游戏的逻辑服务器只需要将ID为1234的物品属主改为玩家甲,而不需要发送物品的详细信息给玩家甲。如果玩家甲需要物品信息,就通过信息检索服务器检索物品的详细信息。
广播信息服务器:用于向部分或所有玩家广播信息,最常见的就是全服务器公告。
逻辑服务器:用于最终确认交易、交友、工会收人结果的合法性。
地图服务器:管理游戏中的地图,玩家和NPC在地图中的位置变动等。
NPC服务器:用于管理游戏中的NPC,包括动作、行走等。
PK服务器:处理怪物与人、人与人之间的PK。
图 3.4 客户端设计
客户端的设计和普通网游客户端唯一的差别是有一个P2P模块,用来与其它客户端通信。他有两个监听端口,其中一个用来监听服务器端的连接请求(服务器端不具备监听端口),另外一个用来监听其它客户端的连接请求。
3. P2P的聊天系统
介绍完了服务器和客户端的基本设计之后,我们来看下如何使用P2P来实现聊天系统。
网络游戏的聊天一般有4种:(1)局部区域的喊话。(2)两个玩家之间的私聊。(3)工会聊天。(3)世界频道的聊天。
实现方法:
(1) 局部区域的喊话,由于是局部区域的喊话,对于信息的安全性并不是十分重要。玩家甲如果要在局部区域喊话,他首先通过信息检索服务器获取他所在区域的玩家地址,然后通过P2P模块分别向局部区域的所有玩家发布信息。
(2) 两个玩家之间的私聊必须要进行一定得保护。如果玩家甲和玩家乙之间需要私聊,两个玩家可以通过协商创建用于加密和解密的密钥。至于如何加密解密,这个就是题外话了。当然通话内容不需要经过服务器中转。
(3) 工会聊天同局部区域的喊话基本相同,不过聊天内容需要加密。
(4) 世界频道的喊话,需要广播信息服务器协助完成。这个还是不要做成P2P的好。
4. P2P的交易系统
很多人认为交易系统使用P2P是不可能的。但事实上交易行为在人类社会中确实是以P2P的方式实现的。那么网络游戏中的交易系统难道就不能以P2P的方式实现么?答案是:当然可以!这也是本文的目的所在。
图 3.5 P2P的交易
图 3.5 显示了P2P的交易流程,与传统服务器的交易不同,双方的交易是私下建立的,而且只有在双方都确认交易的时候,才会将交易信息发往服务器,由服务器判断最终的交易结果。服务器只需要接收两个数据包,做一次数据验证,发送两个数据包就可以完成一个交易。大大简化了传统服务器的交易流程。在这里,逻辑服务器担当了人类社会的法律角色,由他确定一切交易的公正性和合法性。
图 3.6 玩家甲发往服务器的数据包
图 3.7 玩家乙发往服务器的数据包
图3.6和3.7是客户端发往服务器端的数据包,由于ip地址已经暴漏,使用ip来鉴别客户端的合法性已经不安全,这里需要使用身份识别码来确认客户端身份,交易识别码用来备案交易项,以供日后使用。剩下的就是和交易相关的一些信息,服务器所做的验证就是确认玩家是否拥有这些物品,物品属性是否正确等,如果所有信息正确,就认为这是一个合法的交易,否则交易失败。
同样,交友、工会系统可以使用和交易系统同样的处理流程,这里就不再介绍这几个系统的实现。
5. P2P的PK系统和人物移动信息
对于人物的移动和PK系统的P2P设计,我还没有比较好的办法。这些模块占用了相当大的服务器资源。对于这个模块的设计,我只能提出一个很不成熟的解决方案。
首先,考虑下人类社会。杀人放火、打架斗殴的事件时有发生,但是并不是很多,至少没有严重影响到社会秩序。如果我问你为什么?你肯定会回答:因为有警察。不错,这也是我想说的,我们可以在游戏系统中引入“司法系统”。
图 3.8 游戏中的司法系统
玩家甲和乙在pk的时候可以从信息检索服务器获取对方的信息。在PK的过程中,服务器记录所有的PK数据(也就是犯罪现场),但是并不分析数据的合法性。如果甲发现乙使用了违规的技能,他就会向服务器报告这个违规。我们称甲为原告。服务器收到投诉后会调查犯罪现场(PK数据),如果被告乙的罪名成立。那么被告乙将会受到一定得惩罚(没收财产、降级、封号等)。
四 结束语
P2P的网游系统还可以加入语音聊天、视频聊天等依靠其它软件才能实现的功能。由于本人知识水平有限,文中难免有不少想法很片面,很不成熟,在此我只是希望能够找出一个解决目前网络游戏服务器瓶颈的一个可行办法。抛砖引玉,希望与大家共同探讨P2P网络游戏系统的可行性。