« February 2007 | Main | April 2007 »

March 30, 2007

游戏服务器内的组播

游戏服务器在设计时,会有许多组播的需求。比如一个 NPC 需要向周围的观察者播出它的状态信息。无出不在的各种聊天频道中需要向频道中的参于者广播聊天消息等。

通常,我们会为每个组播的请求维护一张列表,然后再把需要的信息包发送给指定列表上的多个连接。这个过程在很多地方都会遇到,一个设计的不太好的引擎,再这里有可能滋生诸多 bug 。尤其在多服务器的设计时尤其如此。

这两天,我试图寻找一种简洁统一的解决方案。

前几天的一篇 blog 讨论了一组服务器设置多个外部接入点的设计。就着这个思路我们可以引申一下。

当每台连接服务器设置一个不大的上限,比如最多同时处理 8192 个外部连接,那么管理分组倒不会带来太大的负担。

我们只需要在逻辑服务器与连接服务器间定义四条协议。

  1. 把一个连接加入指定分组。
  2. 让一个连接退出指定分组。
  3. 向一个分组广播消息。
  4. 删除一个分组。

这里,后两条协议是冗余的。

对于第三条协议,如果表示连接号的容量足够大,我们完全可以留一部分号码用于组播。这在 IP 协议中定义 IP 地址的构成时就是用的类似方案。不过我们的设计为了节省带宽,全部用的 2 字节做内部连接号,资源比较紧张,所以就单独设计一条协议了。

对于第四条协议,当最后一个连接退出时,分组就自然取消了。增加一个专门的删除协议,纯粹是使用上的方便。

在连接服务器上维护一个分组,仅仅需要一个 1K 的数组(8192 bits)。而有组播需求时,只用遍历这个数组。在 32 位系统下,只是一个 256 次的循环而已。因为大部分分组的成员都不会太多。数组中充斥着大量的 0 。扫描一下就非常的快了。

连接服务器用一个简单的 freelist + hash 表的技术,就可以高效且动态的管理不限量的分组,无论从 CPU 还是内存的负载来看,都是可以接受的。

我们额外需要做的只是一个分组编号分配管理器。为每个进程分配唯一独立的分组号就够了。在我们现在的设计中,为了尽量避免交互通讯。分配新组号采用不需要反馈的形式。每个需要申请组号的进程,都有独立的组号 id 空间。由分组管理器对若干独立的分组号做一次统一映射。

换句话说,每个服务器进程都可以直接从 0 号分组用起,然后直接用 1 号,2 号,3 号 …… 类似操作系统管理物理内存一样。独立进程拥有的只是虚拟分组号,由管理器映射到全局唯一分组号上。这样就完美的解决了不同服务器进程间的分组编号冲突问题。

精读《TCP/IP 详解》

也算写了好些 tcp/udp 应用的程序了。断断续续的看了几本关于网络编程的书。这一本跟编程无关的书也当资料般的查过几章。但这几年来,居然没能抽出时间把它精读一遍,想想还真不是我的风格 :D 直到近几天,我才坚持慢慢的读这本书。

前几天在三亚晒太阳,同行的一个同事(游戏部门的技术总监)在读一本英文版关于 AJAX 的书。市场部的同事看到表示不理解。带书出门,似乎是程序员的共性,其实我自己也带了本正在读的《科学精神的形成》,可惜最终也没能拿出来翻。回想起来,似乎已经有很久没有读纯粹的技术书籍了。也就是那种略微枯燥的,讲解具体技术知识点的书。想想啊,作为程序员,这种历练还是不要断的好。

为什么《TCP/IP 详解》这本书很重要?我这样理解:

面对各种事物,“到底是怎样的?”这个问题时常萦绕在我的脑中。它是我碰到未知问题的第一反应。知根知底后,才能有脑力去想为什么。当想明白为什么后,知识方能融会贯通。然后,就再也忘不掉了。

我承认以前我始终没完全搞明白互联网上的根基:TCP/IP 协议是怎样正确的工作的。那些从网卡上进进出出的比特流如何在交换着信息。我也知道这本书可以解答我的许多问题。但是很惭愧的是,它在书架上立了好久,却没能一页页的翻下去。

好在意识到这点后,就不会再是一个遗憾。

人生中会遇到很多疑问,大部分不会有答案。所以,每本用来解惑的书都值得珍惜。明知道答案在那里却不去努力,是一种悲哀。

March 29, 2007

游戏服务器处理多个连接入口的方案

最近在考虑为一组游戏服务器配置多个连接入口。这个需求来至于我们的国情。作为大的游戏运营商,势必要考虑国内的网络状况——南北不通的现状。以往别的公司的代理游戏,由于不是自己开发,都选择了一个实际的方案:在北网通和南电信各放若干组服务器。北边来的在北边玩,南方住的安居在南方。

我们的游戏却不行,因为我需要一个完整的大世界,必须解决南北互通的问题。据我所知国内运营的游戏 EVE 是比较好解决了这个问题的。

我们自己的游戏大多也解决了,只是宣传上还是鼓励玩家登陆相应的服务器。我们的解决方案本质上很简单。建立有多个出口的机房,同时拥有电信和网通的线路。或是用自己的线路互联电信和网通的机器。这后者普通用户自己在家也可以做,只要你肯花钱,同时购买电信的 ADSL 于网通的宽带即可。目前许多城市两者都向大众提供服务。

当然,最终我们还是需要编写服务器的程序员做一些配合。

早先,我的一组游戏服务器的设计是单台的连接服务器作为玩家的总入口,再汇集所有信息到心跳服务器,由它转发到后面的逻辑服务器组处理。关于这个设计以前写过篇 blog

其实稍微改动一下设计,就能很好的解决多个连接入口的问题。

只需要为每种网络配置独立的连接服务器,电信和网通各一台(或者还需要教育网),同时连入同一台心跳服务器。数据在心跳服务器汇总。数据包在汇集的时候,为了区分是哪个外部连接进来的,会被连接服务器编上内部 id 。当有多台连接服务器时,每台只需要配置不同的内部 id 掩码来区分就够了。

ps. 早先我们想用连接服务器配置双网卡的方式来解决这个问题。这几天反思这样成本过高。到时候要求每组服务器都有两条不同的网线接入,部线过于麻烦。

March 21, 2007

网络诈骗的技术防范

互联网上没人知道你是一条狗。早年的那幅漫画估计在老一代网民中深入人心。现今的时代已经不大相同了,在互联网上想长期隐藏自己的真实身份已经越来越难。

但是,网络带来的身份隐藏依然可以给许多不良居心者带来诸多便利。其中之一,就是利用 IM 软件诈骗。很难防范的是,通过盗取一些防范有疏漏的用户的 IM 密码,然后假冒这个人登陆 IM 去欺骗他的网友。因为,大多数网民即使会对陌生人有足够的警惕,但对熟悉的网友却缺乏警惕。

即使是再熟悉的朋友,我也绝对不会接受他在网上发给我的任何可执行文件。但是,并非所有人都会如我这样做。这种简单的播种木马的方式,在当今社会却是最有效的一种。

另外,在网络游戏中,通过盗取某一玩家的帐号,既而在游戏中诈骗其他人的虚拟财产的案例也屡见不鲜。甚至,它成了一种在网络上欺骗朋友的借口。一句,“昨天我被盗号了”,一切坏事都可以被开脱。

那么,对于 IM 或是网络游戏服务提供商,我们是否可以提供一些技术手段来减少此类事故的发生呢?

虽然,在互联网上,我们用技术手段无法确认坐在网络那一端计算机前是何人何物。但我们可以确认所有可以用程序检测到的东西。最直接的是 IP 。早期我用 oicq 的时候,装一个插件就可以显示对方的 ip 。如果跟我聊天的网友的 ip 有太大的变化,我都会心生一丝警觉。现在,像 popo 这样的服务统一从服务器中转消息,已不再能显示对方 ip 了。这个手段无从用起。

但是展开来想,我们可以在 client 上收集足够多的硬件唯一信息,比如 mac 地址,硬盘序列号,cpu id 等等。组成一个唯一序列,经过 hash 后发生给服务器。然后由服务器做进一步 hash 变形转发给用户。

这样,通过 im (或网络游戏)进行交流的用户之间,可以以此作为保障。一旦经常交流的朋友更换了机器,im client 可以在 UI 上做出示意(或警告)。盗取别人的帐号的人,伪造身份会变的困难。虽然这种方法不能提供 100% 的确保,我想也会安全很多了。

March 20, 2007

为何麻将如此流行?

曾经有种流行的说法是,中国人喜欢打麻将,日本人喜爱围棋,而美国人多打桥牌。这类文章 google 一搜一大把。

当然中国人或是韩国人也喜欢下围棋,而日本人也没以前那么爱围棋了。八十年代的时候,似乎在国内校园里也非常流行打桥牌。而桥牌在美国现在还是不是那么那么流行,就不得而知了。所谓国民的特性从所喜爱的游戏中可看出总总之观点,我一直是不置可否的。今天写的跟这些无关。

由于家庭渊源,我个人不喜欢打麻将。但对麻将也没有感情上的厌恶。小时候即没见父母打过,也不曾见过传送中的因为麻将而导致的家破人亡、妻离子散。只觉得麻将无非一种有竞技性质的桌上游戏而已。

我对麻将所知非常有限,规则陆陆续续的了解了许多。大约知道各地的细则不太一样,大体却是相差不大。似乎体育总局定过一个国标麻将 ,我们的 popo 游戏 就是按这个做的,据我所知,喜欢玩这个规则的不多。大家还是按地域各打各的一套。这也是边锋游戏成功的秘诀之一。

那么,在我看来的一个普通游戏,甚至没有统一明确的规则,为何风靡整个华人世界呢?

单从游戏规则设计的角度看,麻将不能算在好游戏的定义范畴内。它的规则过于繁杂,远不如围棋那样精简。其中的变化相比许多棋牌游戏又来的简单。只听说围棋象棋桥牌等有段位级别的,还没见谁顶个麻将大师的头衔。

我的高中物理老师据说是个麻将高手,同时我也看到午休时他和一些老师打桥牌。我觉得这是两种截然不同的游戏,但却能够同时热衷,觉得有些不可思议。他自己也说,麻将嘛,打到一定水平后,就是比谁反应快,技巧性其实是比较弱的。

仔细想想,麻将之所以普及,也在于这种竞技性的弱化。

一方面,游戏的初始状态对结果的影响占到了很大的比例,这就是纯运气的因素了。不像桥牌的八人赛制,即使拿到手的牌可好可坏,也可以做到完全公平。

另一方面,对手的不可知性,使得个人之技术进一步弱化。三个独立对手的存在,让结果变的更不可知。而围棋如果添一色棋子三人同下,却几乎不可为。这也是围棋之道和麻将之道的根本区别了。

最后的结果是,麻将桌上永远不会出现常胜将军。再不会玩的人,也可以进来凑个乐子。偶尔做个大胡。大家谓之曰:新手的手气总是不错的 :) 。这样,麻将甚至抹平了人之间的智力差异,经验差异。可以更方便的找到玩伴。我想这是麻将成功流行的一个重要因素吧。


ps. 最近在读一本书,《游戏——自然规律支配偶然性》,多次提到一类小球游戏的概率模型。作为公平性而言,参于游戏的每种颜色的小球都可能最后胜出,规则是公平的。但游戏的规则差异会导致决定胜出的过程不同。我想读过这本书的人会有不同的感想,有兴趣的朋友倒可以看看。

这本书的作者是一个德国化学家及生物物理学家, 1967 年曾获诺贝尔化学奖。可惜的是,书的中译本及其晦涩糟糕,让我读的非常辛苦。很多句子译者完全没有弄懂,读者如我需得反复揣摩原文含义。书已经在床头放了小半年了,依然没有看完。只是从中明白许多道理,不忍放弃。

March 19, 2007

google talk 的平等

我最早用的 IM 是 icq ,从 97 年一直用到大约 01 年才放弃。放弃的原因之一是早期的 icq 没有在服务器上保存联系人名单,只能用第三方的服务。

OICQ 也用的比较早,从 98 年开始使用,直到 03 年左右。不想用是因为这个软件做的越来越花哨。而且大部分朋友都开始隐身了,我不想隐身登陆,使用它严重影响了我的工作。

然后又开始用 msn 和网易 popo 。后者是工作需要,从一个公司内部版升级上来,直到内部服务器停止运行,完全迁徙到公众服务器上。

以上 IM 软件到现在也还都偶尔登陆上去转转,包括 icq 。但已经不大使用。目前只挂着 google talk

我承认我是个 gfans ,喜欢 gtalk 的人可以说出万般理由,比如界面整洁、体积小巧、没啥花哨功能、跟 gmail 结合的不错、聊天记录保存在服务器、语音质量高、发送图片方便等等。

而我看中的是 google talk 中透出的平等精神。

gtalk 基于公开的 jabber 协议暂且不谈,那也不是普通用户特别关心的事情。这里只想把另一个小功能和国内常用的 qq 、 msn 做一下对比。

qq 的隐身功能是许多人诟病的、个人认为它部分满足了人的一种偷窥欲 :D 看看哪些朋友在线,而自己却不想暴露行踪。这点应该是从 icq 那学来的,依稀早期的 icq 的隐身是一种君子协议,不管人们是否隐身,服务器都会把好友信息发送到 client 。看不到隐身的朋友,只是因为 client 不显示罢了。后来 icq 应该修改了这个做法、qq 当然也改了。

msn 的做法高明了一点,如果你隐身,那么你就不能向朋友发送消息。如果你想登陆 msn 跟朋友聊天,那么你就不能隐身。如果非要这么干的话,只能把不相关的人 block 掉。据说部分用户就是这么干的,平时把大多数联系人 block 掉,只在聊天的时候解除屏蔽。这样就达到了隐身的效果。

只有 google talk 最符合我心目中的需求。在 google talk 中,如果你 block 了别人,对方也自动 block 掉你。也就是说,你不想让对方看见,那么你自己也看不见对方。这是一个平等交易。

人人平等,是许多人的梦想。但是,上天永远不会自动帮大家制造一个人人平等的社会。追求平等并不只是索取自己的未得,更多的是意味着自己主动放弃与他人的不平等优势。小到 IM 上的隐身设计,如果苛求自己的工作不被打扰,而要求可以在黑暗处窥视大众,那么、自己又有何权利要求社会给予自己更多的平等呢。

所以、即使在我用 QQ 的年代,用 msn 的年代,我也从未隐身过。有了 google talk ,其它的 IM 服务就都可以不用了。

google talk 的聊天记录也充分体现出这种平等的设定。在敏感话题上,你可以要求对方关闭聊天记录。但是你自己的聊天记录也会被强制关闭。当然这也是一种君子协定。换一个非 google talk 的 jabber client 就可以自由保留聊天记录在本机了。这是技术上无法杜绝的,但其反应的设计理念却是一脉向承。

ps. 这些年换了这么多个 im 服务,每个上面都是数百好友。经常联系的也都有数十个。很多人跟我提及不能随便更换 IM 的原因:朋友群不容易迁徙。我以切身体会来看,至少有相当一部分如我者,这根本不是个问题。新的 IM 扩大自己的市场,不在于让老用户集体迁徙,而在于能否在新的 IM 服务上快速建立一个用户群。如果你摆脱不了特定 IM 的禁锢,那么尝试一下多写些 email 吧。网上认识新朋友的时候,不要急着要 QQ 号,可以给对方一个 email 地址。如果有缘,何必拘泥于工具呢。

最近终于用 jabber 的服务把 msn 好友导入到 gtalk 帐户上了。这也不是啥新鲜事,早就可以这么干了。不知道方法的朋友可以 google 一下 。好久没有登陆 msn ,这两天老朋友找过来聊天的特别多,一点感慨。

March 15, 2007

论技术,还是 google 的强啊

gfw 这个词似乎也要被 gfw 掉了。

google 中国百度 上,都已经搜索不到 gfw 这个关键词了。

但是用双引号 "gfw" 引起来,百度还可以搜索的到。而谷歌已经“漂亮”的阻止了这样一次搜索

值得一提的是,对于搜索 gfw ,google 给出的结果是:无法访问您所搜索的信息。 而 baidu 则说:抱歉,没有找到与“gfw” 相关的网页。

哈哈,看来自欺欺人倒是我们的优良传统之一。

ps. 最近在断断续续的读《1984》。刚听同事说,似乎朝鲜人民的家里也都安有一部不能关掉,只能把声音调小的收音机。:D

很高兴这样一本书可以被翻译出版,我想在朝鲜应该是禁书吧。

March 14, 2007

关于 email

email 似乎在现今的网民群落中没落了。虽然像我这样只要在线上,每天都至少会 check 一次 email 的人依然不在少数,但我却感觉这个高比例只存在于从事 IT 行业的人群中。在网民的整体中,email 作为一种日常通讯工具,越来越得不到信任。

今天我跟几个同事交换了一下看法,发现有人赞同我的观点,而也有人不赞同。那么,下面也就只是一家之言吧。

正如现今传统邮政系统的在人民生活中的地位变迁一样,email 的变化不值褒贬。现在我们的信箱里,绝大多数都是商业广告,或是各种机器打印的帐单。偶尔会有人订一些报刊杂志,或是邮购物品的包裹单。这些就是大多数现代人信箱中的一切。

网络和短信平台的出现,取代了缓慢的手写邮件。当然,手写的邮件并没有消失。我的母亲偶尔会给我发上一封信,现在我能看到的漂亮的字迹已经不多了 :) 似乎我那上小学的小表妹定期也会写封信给她的大姑妈(我的母亲),然后扫描过的图片会通过网络进入我的屏幕。

记得上大学的时候,前两年尤其喜欢写信,平均每天都写上五六页信纸。似乎快毕业时,新进学校的师弟师妹们也在重复这种生活。现在毕业久了,不知道如今大学生们的信箱中是否还是挤的满满。

前段时间遇到一个旧同事,他正迷恋于外出旅游。相见时对我说,“留个邮政地址吧。去到一个新地方,给所有认识的朋友发个明信片,写上几句感言,是个不错的体验。”

email 这个东西出现的时间相较要短的多,它却更快走向尴尬的地位。

一个重要的原因是垃圾邮件的泛滥。这比我的邮政信箱中塞满的邮件广告要严重的多,毕竟电子数据比纸张要廉价的太多。不过,我觉得这不是最严重的问题。总有一天,我们会通过技术手段避免过多的垃圾邮件。从我自己的体验来看,gmail 做的不错。据说我们公司自己的 163.com 邮件服务 也还可以。

我个人是比较偏好用 email 作为最主要的沟通手段的,其重要程度排在 IM 之前。或许是因为个人的脑子转的不够快吧,想说点事情总需要多想想。而且自己的时间需要更合理的分配,IM 那种及时聊天的方式实在不适合我。经常需要长时间思考的我,无法容忍思路一再的被打断。于我来说,除非生活变的空虚无聊,是不会整天跑在 IM 上闲聊的。现在看来,尚无出现这种状态的可能性。

我的许多同事一致观点是,重要的事情,会选择 写 email 。那么这依赖需要传达信息的对方会去 check email 。似乎,并非所有人都有经常 check email 的习惯。那么在另一个人群中,重要的事情往往会选择在 Im 上沟通。如果有电话号码的话,我想短信和通话会是更好的选择。

其实,公司里有重要的事情通过 email 群发,为了招呼所有人的习惯,IM 上还是会强调一下去收一下 email 的。我想大家都意识到 email 之不可靠这一点了。

降低 email 的用户体验的还有频繁的更换自己的 email 地址。电话换了,打个电话确认一下就知道,但是 email 换了,收到退信的几率却不是 100% 。email 服务的廉价,导致每个人都可以拥有诸多 email 地址。不常接触的人之间,很难确认对方正在使用的 email 地址是哪一个。这种不信任感在我自己的留言本上时常可以显露出来。经常会有人向我询问我目前在用的 email ,在 IM 上聊天时,如果需要发邮件,也会再次确认邮件地址,并嘱咐去收取。在一些场合,email 蜕化成了交换文件的工具(甚至只是一个网络储存工具)。无论我把我自己的 email 地址放在个人主页何等显著的位置,向我发邮件的人依然小心翼翼。

总结了这些后,我向公司邮件部门提出了建议。既然我们身为中国最大的免费邮件提供商,或许我们可以做点什么。

我希望作为服务商可以向公众提供关于某个特定邮件用户的登陆查询接口。只要用户自己允许,可以让任意用户查询自己邮箱的使用频率。诸如最后一次登陆时间,和最近一段时间被使用的频率都是可以被允许查询的范围。如果一个邮箱长时间(比如半年)没有被使用,就可以强制被查询到这个事实。(一般按照协议,超过一段时间未使用的邮箱会被收回,但是回收邮箱的期限往往比原来的协议上长的多)

跟同事讨论这个问题时,质疑的意见主要有两方面:

  1. 用户隐私的问题。用户可能不希望人知道他有没有看过邮件。我的想法是,一个模糊的时间不算隐私。如果一个人每天都 check email ,那么他不会在乎别人知道他最近一天有登陆过邮箱。同样,一个不是天天检查邮箱的人,保持一周一次的登陆频率,也不算秘密。而让发信者知道一个邮箱半年都没有人登陆过,是极大的方便。若真的在乎隐私的话,可以由用户选择把查询关闭。

  2. 可能会给垃圾邮件发送者制造方便。我的观点是,从宏观上,有一定可能减少垃圾邮件的总量。我们减少的是垃圾邮件发送者的无谓发送造成的带宽浪费;而发送垃圾邮件的人并不会因为明确知道这个邮箱有人在看而增加垃圾邮件发送的频率。记得以前读过一个观点:如果垃圾邮件的末尾留有退订地址,你去执行退订手续的话,并不会增加收到垃圾邮件的数量。而且我深信,垃圾邮件最终会用技术手段解决的。

email 比 IM 或是 sms 有着无可比拟的优势。但这种优势也依赖用户群体的规模性。作为服务提供商,我们应该做点什么。诸如提供使用频率查询系统这样的工作,应该可以提供用户对 email 系统的信任感吧。至少,我们应该保护已有的 email 用户,让他们的用户体验更好。

March 03, 2007

关于卖空(Sell Short)

周末了,我一时兴起登陆了在美国的股票帐户玩儿。发现里面的股票交易的下单选择有三种:Buy , Sell , 和 Sell Short 。这 Sell Short 就是传说中的卖空了,在国内的股市上还不能这么操作。我一直是有耳闻,而不得其详。

一时冲动想试一下,终于搞清楚是怎么个运作了。

所谓卖空,就是向某人借入一支你想卖掉的股票(简单说就是看跌的股票)来执行卖出操作。当然这个借股票的过程是由股票交易机构帮你完成的,并不需要直接去找个持有这支股票的人来借。

借的过程相当于定了个契约,这一步交易机构并不收你佣金。但是执行 Sell Short 这个操作,需要立刻把借来的股票卖掉,这卖掉是要收交易佣金的(所以还是被交易中介赚到了钱)。

卖掉借来的股票后,你就立刻有了一笔现金,不过同时你还欠人一笔股票。如果你的帐户里的资产够偿还这笔股票,是没有人催你还的。如果日后这支股票跌了,你可以选择把股票还掉,当然是以当时的低价买入偿还。前后有一个差价(当初 sell short 时你获得的现金和事后你用钱购入股票偿还),这就是你的赢利。反之,如果股票涨了的话,你就需要用更多的现金来购买这支股票来偿还了。

因为 Sell Short 这种操作对于交易机构来说,你至少要执行两次操作(当时的一次,和日后偿还时执行的购入操作一次),这样交易佣金也是两次。多一种操作方法,可以促进交易频率。所以对于他们来说,是鼓励客户做这种操作的。

我前几年玩过半年外汇实盘,当时做足了功课。一些技术分析工具还是用的比较熟的(个人偏好是用 Bollinger Bands 布林带)。靠技术分析,当年在外汇投资上小赚了点零花钱,对自己的操作能力还是比较有信心的。

后来觉得太费精力,又逐步失去乐趣,而没有再做。

今天重新拣回来还是满有意思。挑了些自己熟悉的国内公司,比如 SINA ,SOHU ,SNDA ,NCTY ,BIDU 等,逐个看了技术图。最后决定 Sell Short 百度 :)当时的价格是 105.4 ,最近几天一直在跌,我认为还回继续下去。小小尝试了 100 股。

结果太另人失望了,BIDU 居然是一支 Hard-to-Borrow 的股票 :( 不能操作。我的理解就是,市场上没人愿意借给我卖掉这支股票。

第二个选择就是 SINA ,Sell Short 了 500 股,居然立刻成交了。成交价是 33.35 。付了 12 块多的佣金。不过到写这篇 Blog 时,SINA 已经跌破 33 块了。:D

纯属娱乐 :) 下周工作日就不玩了。还是写程序最有意思哈。

ps. 告戒一切证卷市场上拼搏的朋友,切勿投机,少做短线。