twzheng's cppblog

『站在风口浪尖紧握住鼠标旋转!』 http://www.cnblogs.com/twzheng

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  136 随笔 :: 78 文章 :: 353 评论 :: 0 Trackbacks
[转]微软msn服务器设计思想初步理解
来源不明

由于工作需要,我用了近2个月的时间去了解msn的协议,通过长时间的抓包和试图实现,我将我了解了的msn的服务器端的部分设计思想总结如下。

        作为服务器设计,比较重要的几个问题是:(不妥之处,希望大家修正)

                1.安全性

                2.并发服务能力

                3.性能的可线性提高



    一、安全性

            服务器的安全性包括两部分,一是服务器本身软硬件配置上的安全性,比如防止系统漏洞;二是服务器和客户端通讯协议的安全性设计,防止通过协议本身导致密码泄露、服务器被非法攻击等。

             在协议上,msn的密码是通过ssl传送到服务器的;我对ssl的内部细节不是很了解,但是显然,密码经过ssl传输过程到服务器端后,是被明文解出的, 因此安全性依赖于ssl本身提供。在这方面,我倾向于yahoo的设计,密码不通过自身的明文或者任何本身的加密后密文传输,而是同服务器返回的 session和password结合,进行混合的不可反向解密的md5密文进行传输。这样的加密结果被任何第三方截获都是没有意义的;因为不可能从这样 的密文中分析出原来的密码。

            我认为,传输协议中,密码必须和服务器端协商的一个随机seesion结合,通过不可恢复的加密方式进行加密,传送到服务器,服务器端也是按照session和passowrd进行同样方式的加密,比较加密结果,验证用户的合法性。

             就软硬件系统本身的安全性而言,我认为尽量把系统中不需要的软件和其它模块去除,保留服务器系统运行需要的最小内核;同时一台服务器应该只提供该服务器需 要提供的服务,不开多余的网络端口,对telnet方式禁止,而使用更安全的ssh进行远程管理。



            二、并发服务能力

            服务器的并发服务能力是服务器程序设计的一个重要内容。

            1、在单台服务器上,服务器软件的性能设计应考虑以下问题:

                            数据拷贝

                            内存管理

                            线程间的锁控制

            数据拷贝:

                     通常来说,避免数据拷贝是个非常头疼的问题。我在平时的工作中,尽量把缓冲区的指针使用范围限定在一定的作用域内,如果需要在作用域外使用,我通常会通过 数据拷贝的方式进行,这样可以避免令人头疼的内存泄露问题,一块内存一旦在多个作用域使用或者在分配该内存的作用域之外使用时,很容易搞不清楚何时该释放 该内存。

                    一个比较好的办法是利用在COM里使用的引用计数技术,把该内存的释放时机交给内存自己管理;也就是说把内存封装进一个结构体或者类里,本身对自己被使用进行管理,一旦发现自己没有人使用了,就释放自己。

            内存管理:

             内存的处理也是很需要注意的一部分,频繁的new /delete内存会让内存出现大量碎片,对服务器软件的性能也是有不小的影响的;通常的做法我们可以一开始申请一个比较大的内存区域,然后自己负责管 理,把这块内存划分成很多小块(64B/ 128B/ 256B),然后按照申请内存的需要,分配合适的内存区域。这样可以不用每次都到系统申请内存,也把内存泄露的可能性限制在很小的范围内(内存泄露应该被 解决)。

            另外,对于一些对象,在我们使用完后,可以暂时不把它真正的从内存里释放掉,而是把它挂到一个list上去,下次对于通用的对象,完全可以重用这快内存。这也是减少内存分配次数的一个办法。但是这可能会导致使用很耗的加解锁。

            线程间的锁控制:

            涉及到锁控制的,主要是因为共享问题。共享分为两种:一是代码共享部分;一是数据共享部分。其中做主要的还是数据共享部分。但是没有什么好的解决办法,唯一的办法就是检查这个共享是不是真正必要的,这些数据可不可以分成两部分以形成不是共享的。


        当然,这部分为软老大做了什么我不清楚。


         三、性能的可线性提高

           这主要指服务器群组的服务能力可以通过增加服务器的方式线性提高性能。这就要求服务器的服务能力分担是均衡的,即实现良好的负载平衡。新加入的服务器能均衡的被负载平衡服务器分配服务。

            当然,这也设计到服务器集群、数据库服务器的集群,我想找个时间专门研究这些问题。

            在这方面,微软的设计思想很好的体现了这个原则,能够把负载均衡的交给新服务器。

            msn 的认证服务器、聊天服务器分开的。即每次聊天时,都需要向认证服务器申请一个聊天服务器地址,然后在通过认证服务器邀请对方加入到这个聊天服务器,这就 保证了聊天的人会在同一台服务器上,不用再到数据库服务器查找对方的地址,也避免了头疼的服务器数据同步问题。

            如果新加入一个服务器,那么这太服务器只要在负载平衡服务器注册,就可以和其他服务器不相干的为客户端提供可靠的服务,当然群组的服务能力就线性提升了。

            写文专为与朋友们交流,对于内容中不妥之处,请多多指教:)
posted on 2007-05-27 12:02 谭文政 阅读(1021) 评论(1)  编辑 收藏 引用 所属分类: 网络编程

评论

# re: 微软msn服务器设计思想初步理解 2010-03-31 13:58 re: 微软msn服务器设计思想初步理解
垃圾,浪费时间  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理