微軟msn伺服器設計思想初步理解

2021-03-31 08:57:00 字數 2057 閱讀 9301

由於工作需要,我用了近2個月的時間去了解msn的協議,通過長時間的抓包和試圖實現,我將我了解了的msn的伺服器端的部分設計思想總結如下。

1.安全性

2.併發服務能力

3.效能的可線性提高

一、安全性

伺服器的安全性包括兩部分,一是伺服器本身軟硬體配置上的安全性,比如防止系統漏洞;二是伺服器和客戶端通訊協議的安全性設計,防止通過協議本身導致密碼洩露、伺服器被非法攻擊等。

在協議上,msn的密碼是通過ssl傳送到伺服器的;我對ssl的內部細節不是很了解,但是顯然,密碼經過ssl傳輸過程到伺服器端後,是被明文解出的,因此安全性依賴於ssl本身提供。在這方面,我傾向於yahoo的設計,密碼不通過自身的明文或者任何本身的加密後密文傳輸,而是同伺服器返回的session和password結合,進行混合的不可反向解密的md5密文進行傳輸。這樣的加密結果被任何第三方截獲都是沒有意義的;因為不可能從這樣的密文中分析出原來的密碼。

我認為,傳輸協議中,密碼必須和伺服器端協商的乙個隨機seesion結合,通過不可恢復的加密方式進行加密,傳送到伺服器,伺服器端也是按照session和passowrd進行同樣方式的加密,比較加密結果,驗證使用者的合法性。

就軟硬體系統本身的安全性而言,我認為盡量把系統中不需要的軟體和其它模組去除,保留伺服器系統執行需要的最小核心;同時一台伺服器應該只提供該伺服器需要提供的服務,不開多餘的網路埠,對tel***方式禁止,而使用更安全的ssh進行遠端管理。

二、併發服務能力

伺服器的併發服務能力是伺服器程式設計的乙個重要內容。

1、在單台伺服器上,伺服器軟體的效能設計應考慮以下問題:

資料拷貝

記憶體管理

執行緒間的鎖控制

資料拷貝:

通常來說,避免資料拷貝是個非常頭疼的問題。我在平時的工作中,盡量把緩衝區的指標使用範圍限定在一定的作用域內,如果需要在作用域外使用,我通常會通過資料拷貝的方式進行,這樣可以避免令人頭疼的記憶體洩露問題,一塊記憶體一旦在多個作用域使用或者在分配該記憶體的作用域之外使用時,很容易搞不清楚何時該釋放該記憶體。

乙個比較好的辦法是利用在***裡使用的引用計數技術,把該記憶體的釋放時機交給記憶體自己管理;也就是說把記憶體封裝進乙個結構體或者類裡,本身對自己被使用進行管理,一旦發現自己沒有人使用了,就釋放自己。

記憶體管理:

記憶體的處理也是很需要注意的一部分,頻繁的new /delete記憶體會讓記憶體出現大量碎片,對伺服器軟體的效能也是有不小的影響的;通常的做法我們可以一開始申請乙個比較大的記憶體區域,然後自己負責管理,把這塊記憶體劃分成很多小塊(64b/ 128b/ 256b),然後按照申請記憶體的需要,分配合適的記憶體區域。這樣可以不用每次都到系統申請記憶體,也把記憶體洩露的可能性限制在很小的範圍內(記憶體洩露應該被解決)。

另外,對於一些物件,在我們使用完後,可以暫時不把它真正的從記憶體裡釋放掉,而是把它掛到乙個list上去,下次對於通用的物件,完全可以重用這快記憶體。這也是減少記憶體分配次數的乙個辦法。但是這可能會導致使用很耗的加解鎖。

執行緒間的鎖控制:

涉及到鎖控制的,主要是因為共享問題。共享分為兩種:一是**共享部分;一是資料共享部分。其中做主要的還是資料共享部分。但是沒有什麼好的解決辦法,唯一的辦法就是檢查這個共享是不是真正必要的,這些資料可不可以分成兩部分以形成不是共享的。

當然,這部分為軟老大做了什麼我不清楚。

三、效能的可線性提高

這主要指伺服器群組的服務能力可以通過增加伺服器的方式線性提高效能。這就要求伺服器的服務能力分擔是均衡的,即實現良好的負載平衡。新加入的伺服器能均衡的被負載平衡伺服器分配服務。

當然,這也設計到伺服器集群、資料庫伺服器的集群,我想找個時間專門研究這些問題。

在這方面,微軟的設計思想很好的體現了這個原則,能夠把負載均衡的交給新伺服器。

msn的認證伺服器、聊天伺服器是分開的。即每次聊天時,都需要向認證伺服器申請乙個聊天伺服器位址,然後在通過認證伺服器邀請對方加入到這個聊天伺服器,這就保證了聊天的人會在同一臺伺服器上,不用再到資料庫伺服器查詢對方的位址,也避免了頭疼的伺服器資料同步問題。

如果新加入乙個伺服器,那麼這太伺服器只要在負載平衡伺服器註冊,就可以和其他伺服器不相干的為客戶端提供可靠的服務,當然群組的服務能力就線性提公升了。

寫文專為與朋友們交流,對於內容中不妥之處,請多多指教:)

Linux伺服器開發初步

伺服器開發需要考慮的內容很多,比如伺服器的架構 穩定性 效能以及負載能力等等。事實上,在開發伺服器的過程中,需要綜合考慮各種因素,比如就客戶端連線時間較短卻又比較頻繁的伺服器 例如 伺服器 而言,在可選的伺服器結構中,預先派生進 執行緒的結構就要比並髮式結構高效,這一點將在後續的文章中對其進行詳細的...

初步認識迭代伺服器和併發伺服器

迭代伺服器比較原始,它的原型可以描述成 while 1 也就是說,這個程序是乙個乙個處理各個客戶端發來的連線的,比如乙個客戶端發來乙個連線,那麼只要它還沒有完成自己的任務,那麼它就一直會占用伺服器的程序直到處理完畢後伺服器關閉掉這個socket。併發伺服器是最經常用的 1 while 1 2 11 ...

初步認識迭代伺服器和併發伺服器

迭代伺服器比較原始,它的原型可以描述成 while 1 也就是說,這個程序是乙個乙個處理各個客戶端發來的連線的,比如乙個客戶端發來乙個連線,那麼只要它還沒有完成自己的任務,那麼它就一直會占用伺服器的程序直到處理完畢後伺服器關閉掉這個socket。併發伺服器是最經常用的 1 while 1 2 11 ...