[轉(zhuǎn)]微軟msn服務(wù)器設(shè)計思想初步理解
來源不明
由于工作需要,我用了近2個月的時間去了解msn的協(xié)議,通過長時間的抓包和試圖實現(xiàn),我將我了解了的msn的服務(wù)器端的部分設(shè)計思想總結(jié)如下。
作為服務(wù)器設(shè)計,比較重要的幾個問題是:(不妥之處,希望大家修正)
1.安全性
2.并發(fā)服務(wù)能力
3.性能的可線性提高
一、安全性
服務(wù)器的安全性包括兩部分,一是服務(wù)器本身軟硬件配置上的安全性,比如防止系統(tǒng)漏洞;二是服務(wù)器和客戶端通訊協(xié)議的安全性設(shè)計,防止通過協(xié)議本身導(dǎo)致密碼泄露、服務(wù)器被非法攻擊等。
在協(xié)議上,msn的密碼是通過ssl傳送到服務(wù)器的;我對ssl的內(nèi)部細(xì)節(jié)不是很了解,但是顯然,密碼經(jīng)過ssl傳輸過程到服務(wù)器端后,是被明文解出的, 因此安全性依賴于ssl本身提供。在這方面,我傾向于yahoo的設(shè)計,密碼不通過自身的明文或者任何本身的加密后密文傳輸,而是同服務(wù)器返回的 session和password結(jié)合,進(jìn)行混合的不可反向解密的md5密文進(jìn)行傳輸。這樣的加密結(jié)果被任何第三方截獲都是沒有意義的;因為不可能從這樣 的密文中分析出原來的密碼。
我認(rèn)為,傳輸協(xié)議中,密碼必須和服務(wù)器端協(xié)商的一個隨機(jī)seesion結(jié)合,通過不可恢復(fù)的加密方式進(jìn)行加密,傳送到服務(wù)器,服務(wù)器端也是按照session和passowrd進(jìn)行同樣方式的加密,比較加密結(jié)果,驗證用戶的合法性。
就軟硬件系統(tǒng)本身的安全性而言,我認(rèn)為盡量把系統(tǒng)中不需要的軟件和其它模塊去除,保留服務(wù)器系統(tǒng)運行需要的最小內(nèi)核;同時一臺服務(wù)器應(yīng)該只提供該服務(wù)器需 要提供的服務(wù),不開多余的網(wǎng)絡(luò)端口,對telnet方式禁止,而使用更安全的ssh進(jìn)行遠(yuǎn)程管理。
二、并發(fā)服務(wù)能力
服務(wù)器的并發(fā)服務(wù)能力是服務(wù)器程序設(shè)計的一個重要內(nèi)容。
1、在單臺服務(wù)器上,服務(wù)器軟件的性能設(shè)計應(yīng)考慮以下問題:
數(shù)據(jù)拷貝
內(nèi)存管理
線程間的鎖控制
數(shù)據(jù)拷貝:
通常來說,避免數(shù)據(jù)拷貝是個非常頭疼的問題。我在平時的工作中,盡量把緩沖區(qū)的指針使用范圍限定在一定的作用域內(nèi),如果需要在作用域外使用,我通常會通過 數(shù)據(jù)拷貝的方式進(jìn)行,這樣可以避免令人頭疼的內(nèi)存泄露問題,一塊內(nèi)存一旦在多個作用域使用或者在分配該內(nèi)存的作用域之外使用時,很容易搞不清楚何時該釋放 該內(nèi)存。
一個比較好的辦法是利用在COM里使用的引用計數(shù)技術(shù),把該內(nèi)存的釋放時機(jī)交給內(nèi)存自己管理;也就是說把內(nèi)存封裝進(jìn)一個結(jié)構(gòu)體或者類里,本身對自己被使用進(jìn)行管理,一旦發(fā)現(xiàn)自己沒有人使用了,就釋放自己。
內(nèi)存管理:
內(nèi)存的處理也是很需要注意的一部分,頻繁的new /delete內(nèi)存會讓內(nèi)存出現(xiàn)大量碎片,對服務(wù)器軟件的性能也是有不小的影響的;通常的做法我們可以一開始申請一個比較大的內(nèi)存區(qū)域,然后自己負(fù)責(zé)管 理,把這塊內(nèi)存劃分成很多小塊(64B/ 128B/ 256B),然后按照申請內(nèi)存的需要,分配合適的內(nèi)存區(qū)域。這樣可以不用每次都到系統(tǒng)申請內(nèi)存,也把內(nèi)存泄露的可能性限制在很小的范圍內(nèi)(內(nèi)存泄露應(yīng)該被 解決)。
另外,對于一些對象,在我們使用完后,可以暫時不把它真正的從內(nèi)存里釋放掉,而是把它掛到一個list上去,下次對于通用的對象,完全可以重用這快內(nèi)存。這也是減少內(nèi)存分配次數(shù)的一個辦法。但是這可能會導(dǎo)致使用很耗的加解鎖。
線程間的鎖控制:
涉及到鎖控制的,主要是因為共享問題。共享分為兩種:一是代碼共享部分;一是數(shù)據(jù)共享部分。其中做主要的還是數(shù)據(jù)共享部分。但是沒有什么好的解決辦法,唯一的辦法就是檢查這個共享是不是真正必要的,這些數(shù)據(jù)可不可以分成兩部分以形成不是共享的。
當(dāng)然,這部分為軟老大做了什么我不清楚。
三、性能的可線性提高
這主要指服務(wù)器群組的服務(wù)能力可以通過增加服務(wù)器的方式線性提高性能。這就要求服務(wù)器的服務(wù)能力分擔(dān)是均衡的,即實現(xiàn)良好的負(fù)載平衡。新加入的服務(wù)器能均衡的被負(fù)載平衡服務(wù)器分配服務(wù)。
當(dāng)然,這也設(shè)計到服務(wù)器集群、數(shù)據(jù)庫服務(wù)器的集群,我想找個時間專門研究這些問題。
在這方面,微軟的設(shè)計思想很好的體現(xiàn)了這個原則,能夠把負(fù)載均衡的交給新服務(wù)器。
msn 的認(rèn)證服務(wù)器、聊天服務(wù)器分開的。即每次聊天時,都需要向認(rèn)證服務(wù)器申請一個聊天服務(wù)器地址,然后在通過認(rèn)證服務(wù)器邀請對方加入到這個聊天服務(wù)器,這就 保證了聊天的人會在同一臺服務(wù)器上,不用再到數(shù)據(jù)庫服務(wù)器查找對方的地址,也避免了頭疼的服務(wù)器數(shù)據(jù)同步問題。
如果新加入一個服務(wù)器,那么這太服務(wù)器只要在負(fù)載平衡服務(wù)器注冊,就可以和其他服務(wù)器不相干的為客戶端提供可靠的服務(wù),當(dāng)然群組的服務(wù)能力就線性提升了。
寫文專為與朋友們交流,對于內(nèi)容中不妥之處,請多多指教:)