'design' Category

  • Game data server draft design

    November 26, 2007

    游戏数据服务器是什么
    数据服务器,一下简称DS,用来保存游戏中的数据,他存在与持久层之上,逻辑层之下,是一个针对逻辑层的数据持久层。
    为什么需要这层
    在我开发游戏服务器以来,发现的一个最严重的问题就是,游戏数据的安全和正确。对于游戏的数据我们大体可以分出一下两类:

    临时数据:由游戏运行时生成,无需进行保存。在玩家下线或游戏服务器关闭之后就可以抛弃。
    持久数据:游戏人物的数据、游戏中的物品,人物排名等等由玩家或服务器创造出的并有保存价值的数据

    对于一款网络游戏来说,数据基本上是一切。玩家丢了数据等于是被盗号,运营商如果丢了很多玩家的数据基本上就无法正常的运营下去。对于数据可能出现的问题如下:

    数据回档:档的原因多种多样, 大体有以下的原因:

    服务器崩溃导致距离上次存档的数据没有保存
    人物数据错乱,导致游戏无法将该玩家的数据保存(和数据库中的某些限制出现冲突)

    数据存储效率低下,导致玩家存储数据的时间长于每次存储的间隙
    游戏中的物品产生复制,在游戏中的交易的双方交易后出现某一方的回档,物品就会出现复制
    数据保存复杂、危险,由于程序员的大量开发工作主要针对于服务器的逻辑,如果需要兼顾撰写保存数据的SQL,很可能出现问题

    针对游戏服务器的数据的重要性和易错性,我觉得非常需要添加一层数据层,使游戏数据库对游戏服务器的逻辑透明,同时提供一些简单的方法保证数据的一致性。
    具体要求
    针对以上的分析,我觉得一个合格的DS需要做到一下的条目:

    使SQL对使用者透明:
    在这里我们假设,数据库的最终保存持久层依然是某种数据库,那么DS因该可以使用定义的数据类型自动生成保存,更新和读取的SQL语言。撰写逻辑的程序员,只需要定义数据类型和结构,完全不需要考虑和数据库的操作。数据库对于游戏逻辑程序员来说是完全透明的。
    数据需要有权限概念:
    第一个对某个数据进行访问的用户(其他的游戏逻辑服务器)是该数据的拥有者,拥有者可以限制其他访问者对该数据的权限,是否可读,是否可写等。同时拥有权可以放弃或移交。
    支持对数据的原子操作:
    对于交易等数据操作,可能需要同时更新两个以上的数据单元,这时候需要提供原子操作的支持,如果某个数据单元的更新不成功,就要让整个操作回滚。
    DS本身的稳定以及自我恢复:
    DS本身的逻辑应该足够简单,并保证服务稳定,内存占用合理并可以在配置文件中调整。DS如果发现持久层出现错误,比如无法连接到数据库,可以通知客户终止操作,并将当前DS内存的数据dump到本地文件,等待问题修正后可以重新Load到内存中。
    多个DS的分布处理:
    由于DS的内存和效率等的限制,对于一个游戏应用来说,一个DS可能无法承担所有的应用,需要考虑DS的分布处理。分布处理可能会涉及到很多细节,导致复杂度大大增加,希望有时间,我可以继续讨论这个问题。

  • 多服务器的用户身份认证方案

    November 13, 2007

     
    转自云风
    当游戏服务器群达到一定规模后,让用户只从一个入口连入会给这个入口带来很大的压力。这样,我们就需要让服务器群中的多台机器都允许用户直接连接。
    当服务器开放给用户直接登陆后,必须面临的一个问题就是用户身份认证的问题。
    大多数提供网络服务的公司都做了一套统一的用户认证系统,比如微软的 passport ,网易的通行证,等等。为了避免重复验证用户身份而给用户认证系统带来过大的负担,云风在这里给出一个参考解决方案。
    登陆服务器可以只有一台,专门用于用户第一次登陆的身份认证。它认证完用户的身份后,则发放一个游戏系统内部用的临时通行证给用户,用户可以拿着这个临时通行证到指定的地点玩游戏。
    我们需要讨论的是,以上流程中的安全问题,以及如何加强安全性。
    用户认证过程自然不能传送用户密码的全部信息,这跟密码是否加密无关。简单的安全措施是先由登陆服务器发送一个随机串给用户,用户把这个字符串同自己的密码连接起来,并 md5 以后传回服务器做验证。(这里用 md5 指代一种特定的不可逆 hash 算法)
    临时通行证的生成可以是这样: 登陆服务器从数据库中取得用户所属的服务器 id (通常是他最后一次登陆的位置,或者游戏逻辑认为他所在位置)、用户的游戏 id (往往不同于他的用户名)、一个约定字符串、一个顺序版本号、一些随机字节、把它们连在作一次 des 加密(这里用 des 指代一种特定的可逆密匙加密算法)。每生成一次临时通行证,版本号递增。加密临时通行证的密码由登陆服务器与每个可以接受用户直接连接的服务器约定,永远 不传送给用户。
    用户拿到这个临时通行证后,可以用之一次性登陆指定服务器。直到从服务器正常登出,若需切入新服务器,可由老服务器生成下一份临时通行证。临时通行证由于被服务器加密,所以对用户来说是一串无意义字符串,故而无法伪造。
    临时通行证传送给用户时,可用用户自己的密码之 md5 值(或者连接一个约定串增加安全性)做密匙加密。这样不知道密匙的人截获数据包也不能获得临时身份证。而临时身份证总是一次有效,且只针对特定服务器(服 务器会检查临时通行证中包含的版本号、服务器 id ),企图用临时身份证多次登陆也会失败。

  • Kerberos的原理 – MIT

    November 13, 2007

    Kerberos是一个重要的认证协议,它为互不相识的通信双方做安全的认证工作。Kerberos这个名字的原义是希腊神话中守卫冥王大门的长有三头的看门狗。下面这篇Kerberos的文章不知是哪位老大翻译的,感谢先!
    这是MIT(Massachusetts Institute of Technology)为了帮助人们理解Kerberos的原理而写的一篇对话集。里面有两个虚构的人物:Athena和Euripides,通过 Athena不断的构思和Euripides不断的寻找其中的漏洞,使大家明白了Kerberos协议的原理。
    Athena: 雅典娜,智慧与技艺的女神。
    Euripides:欧里庇得斯, 希腊的悲剧诗人。
    译文如下:
    第一幕
    在一个小工作间里。Athena和Euripides正在相邻的终端上工作。
    Athena: 嗨,这个分时操作系统实在太慢了。我根本无法工作,因为每个人都登上去了。
    Euripides: 不要对我报怨。我只是在这工作。
    Athena: 你知道我们需要什么吗?我们需要给每一个人一台工作,这样大家就不会担心计算机的速度了。并且,我们需要一个网络把所有的计算机都联起来。
    Euripides: 好。那么我们差不多要一千台工作站?
    Athena: 差不多吧。
    Euripides: 你知道一台普通的工作站的硬盘有多大吗?那里放不下所有的软件。
    Athena: 我已经有主意了。我们可以把系统软件放到服务器上。当你登录到工作站的时候,工作站会通过网络与其中一台服务器上的系统软件联系。这样的设置让一组工作站都使用同一份系统软件,并且利于系统软件的升級。只需改动服务器就可以了。
    Euripides: 好的。个人的文件怎到办呢?在分时操作系统上,我可以登录并从终端上取走我的文件。我能到工作站上取我的文件吗?我要象PC用户一样把我的文件放到磁盘上去吗?我希望不。
    Athena: 我想我们可以其它机器来存文件。你可以到任何一台机器上登录去取你的文件。
    Euripides: 打印怎么办呢?每个工作站都要有自已的打印机吗?谁来付钱?电子邮件呢?你怎么把邮件送到所有的工作站上去呢?
    Athena: 啊…..很明显我们没钱为每个人配一台打印机,但我们有专门的机器做打印服务。你把请求送到服务器,它就为你打印。邮件也可以这样做。专门有一台邮件服务器。你如果想要你的邮件,就联系邮件服务器,取走你的邮件。
    Euripides: 你的工作站系统听起来很不错。如果我有一台,你知道我要做什么吗?我要找出你的用户名,让我的工作站认为我就是你。然后我就去邮件服务器取走你的邮件。我会联上你的文件服务器,移走你的文件,然后--
    Athena: 你能做得到吗?
    Euripides: 当然!这些网络服务器怎么会知道我不是你?
    Athena: 嗯,我不知道.我想我需要认真思考一下.
    Euripides: 好吧。你想出来后告诉我.

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org