针对网络游戏客户端更新的 P2P 网络

我最近在构思一个用 P2P 网络同步文件的计划。用于以后网络游戏的 client 同步更新。现有的 BT 之类的软件很成熟了,不过我考虑到网络游戏有其特殊性,说不定可以做的更好。

网络游戏可以说有一个天然的稳定的 p2p 网络的基础,好象我们的梦幻西游,最高已经超过八十万玩家同时在线了。而所有玩家所需求的是同一份 client。这跟 BT 网络上传输文件的需求和环境都不太相同。

游戏服务器将是一个天然的中心管理服务器,类似 BT 的种子发布服务器。BT 的下个版本据说要加入分布式的用户列表。也是,如果真有几十万玩家同时需要共享一份文件时,让每个玩家都知道他们的几十万同伙的位置是不现实的。这就需要分布式来做。而且,我们的游戏相关服务器是全职为玩家服务器的,无论从带宽还是性能上,都非常不错,这点应该加以利用。

关于分布式用户列表的问题暂时不讨论了,我最近想的比较多的是针对 LAN 的优化。

很明显,现在国内的网络玩家很多都是网吧用户。网吧更新是一个大问题,以前没有用 P2P 技术前,网吧老板大多采用自己同步 client 的作法。现在越来越多的游戏 client 采用 P2P 了,一般内嵌一个 BT 。但是当用户特别多时,BT 种子服务器都不堪重负(这个是存在于我们公司运营中的梦幻西游和大话西游的事实)。

如果能针对 LAN 做一些优化就好了。我能想到的是,如果一个玩家可以在自己的 LAN 上发现一份 copy ,就不再外连 BT 种子服务器,而是相互通讯,复制一份过来。整个 LAN 充当外部 P2P 网络的一个节点,如果有对外的连接任务,大家应该协商平摊,不应该做重复的事情。而且任务也尽量分散,不让某一台机器处理的任务过多,造成 CPU 和单机的网络负载太大。

在一个 LAN 上,各个玩家伙伴的身份是对等的,没有中央服务器,所以协调工作是很难展开的。我们务必先产生出一个领导者。因为领导者是临时产生的,我们无法确定它的机器性能如何,是否能长期稳定工作。所以,我们不能让领导者担负过强的工作,而且要有集体认可的候补人员。

能想到的最简单的集体推选方法是这样的:我们默认的标准是,IP 值最小的人是当然领导候选人。每个 client 进程启动后,都向 LAN 广播,准备参选领导职位。如果 LAN 上已经存在领导人,每个人都回复他现在的领导人是谁。如果他是更适合当领导的人,所有人回复他,承认他的地位。

当这个新人收到别人的通知,得知领导人以后,他却没有收到领导人的消息,认为现任领导人可能失踪。由这个人推举新领导。直到大家都确认领导人是谁。

所有点对点传输任务,必须得到领导的认可。新人只有找到领导后,向领导索取LAN上自己的结队对象,领导分配至少1个的结队对象给他。这个新人再主动去向这些对象索取需要同步的文件。注:这里,LAN 上任何一个人向自己索取文件,并不需要先得到领导的同意就可以满足其要求。

整个 LAN 对外的连接需要得到领导的同意,当整个 LAN 上文件都不全时,领导主要定期向外索取连接,但是这个连接任务应该分摊给大家,而不是全部由自己连接。当同伴完成任务后,应该主动讲获取部分传回领导。(然后领导通知其他人去索要)

当整个 LAN 文件收全后,为了保证外部 P2P 网络的健全,整个 LAN 作为一个节点,应该主动发起连接,这个发起者就是领导。领导定期分配任务给同伴,让每个人平均分配对外的连接。

所有人都应该定期保持对领导的联系,防止领导意外失踪。