王鎮威,張 皓,朱命冬
(河南工學院,河南 新鄉 453003)
在通信模式中,單服務器通信架構將服務器作為中轉,采用傳輸控制協議(Transmission Control Protocol,TCP),實時監聽通信端鏈接請求,并完成端到端通信。當通信端向服務器發起通信請求時,實時監聽的服務器會接收通信端的通信請求,采用TCP建立鏈接(3次握手),并且在通信端與服務器之間建立一個套接字(socket)信道[1]。
當通信端向其他通信端發起通信時,服務器作為通信的中轉站,通過與各個服務端之間的socket信道完成信息的交互,達到通信的目的。在單服務器通信模式中不難發現,通信過程沒有任何保密措施,服務器持續監聽,通信端和服務端的身份得不到驗證和授權。服務器端和通信端都可以被偽裝,進而竊取通信信息。
對于分布式系統來說,相關的挑戰主要有7個:異構性、開放性、安全性、可伸縮性、故障處理、并發性、透明性[2]。本文主要關注并發性和透明性對實時通信系統的影響。
多個通信端同時請求訪問一個資源,將導致并發問題的出現。例如,在實時通信系統中,如果多個通信端試圖閱讀當前通信用戶列表,而又有多個通信端同時退出通信。當每個通信端連接到服務器時,服務器中將有一個新線程,線程將遇到并發問題。有些線程的操作可能被其他線程覆蓋,數據存儲室列表可能與預期結果不符。因此,在操作相同的資源時,需要同步線程。
當兩個或多個線程同時訪問一個對象的相同資源時,可以使用同步方法和同步塊。至于同步方法,不同對象實例中的不同同步方法是不相關的,意味著其他線程仍然可以訪問同步方法,即使在同一個類中,只要方法屬于不同的對象。
如果兩個線程需要訪問同一對象中的同一個同步方法,則必須按順序訪問。一個線程將先訪問資源,另一個線程必須等到前一個線程完成任務。使用同步方法也有缺點,同步方法的訪問效率會降低。另一種方法是使用同步塊,可以將塊分配給任何對象,因為可以針對特定的代碼塊,在同時訪問同一資源時線程將按順序執行事務。
對透明性而言,一個分布式系統主要有8個方面的透明性:訪問透明、位置透明、并發透明、復制透明、故障透明、移動透明、性能透明和伸縮透明[2]。在單服務器實時通信中,位置透明是顯而易見的,因為通信端不需要知道服務器在哪里,也不需要知道其他通信端的位置信息,而是需要通過服務器的IP地址連接到服務器。
在系統中,故障透明性是可靠的,因為如果通信系統接收到異常,不會將其拋給通信端,而是處理異常并向通信端提供反饋,用戶仍然可以根據反饋完成任務,而不是退出。還有一些透明度在通信系統中不可用,比如,訪問透明,因為所有的資源都在同一個服務器上。換句話說,服務器不是分布式的,因為只有一個服務器。
分布式多服務端體系結構也基于通信端-服務器模型。然而,多服務器體系結構中的通信端和服務器是分布式的,與基本的通信端和服務器模型有所區別。
如果傳統的通信端和服務器模型中有兩臺服務器,模型如圖1所示。

圖1 分布式服務端通信架構
兩個服務器可以互相交換消息,因為之間有一個鏈接,可以看作是一個簡單的分布式服務器系統。每臺服務器將為一組特定的通信端維護一個數據庫或數據結構,服務器還將保留其他服務器的信息。不同的服務器位于不同的位置,但仍然可以相互通信。例如,如果通信端A需要與通信端C和D通信,首先,向服務器1發送一個請求,當服務器1開始處理該請求時,會在本地通信端列表中搜索通信端C和通信端D。如果不在本地通信端列表中,則服務器1將向服務器2發送一個請求,以進行通信端通信。當服務器2收到請求時,將在處理請求后響應服務器1。通信端A可以與通信端C和通信端D進行通信,而不需要服務器2的端口和地址,信息將由分布式服務器處理。
對于多服務器分布式通信系統的實現,服務器將在不同的地方接入互聯網。通信端將只連接到自己的服務器,因此,服務器的拓撲結構應該是一個網絡映射,如果通信端需要與屬于遠程服務器的其他通信端通信,則為該通信端創建的本地服務器中的線程將向遠程服務器發送請求。
對于本地服務器和遠程服務器之間的通信,可以看作是一個簡單的通信端和服務器模型。本地服務器將扮演通信端的角色,而遠程服務器將接收本地服務器發送的請求。將在本地和遠程服務器的兩個線程之間構建一個socket信道。該模型中的服務器不僅要維護本地通信端信息,還要維護其他服務器的部分或全部信息,如IP地址、端口號以及特定數據結構中其他服務器的通信端列表。當本地通信端需要與遠程通信端建立連接時,本地服務器就可以準確地連接到特定的遠程服務器。
在單服務器模型中,數據將存儲在同一個服務器中,而在多服務器模型中,數據是分布式的。拓撲結構中的每個服務器將只維護屬于本地服務器區域的通信端數據,此外,還將使用一個數據結構來保存其他服務器的信息。數據結構可以輕松幫助本地服務器建立與遠程服務器的連接,就像一個分層的數據管理系統。數據將存儲在不同的地區,并在當地建立索引和索引目錄。
從單服務器系統到多服務器系統,由于多服務器體系結構的高透明度,通信端操作不需要改變。當用戶請求本地或遠程服務器上的資源時,用戶不知道自己訪問的是哪個服務器,從通信端的角度來看,所有服務器都可以看作是一臺服務器。與單服務器系統相比,多服務器系統只改變了服務器的體系結構,使服務器能夠相互通信。對于通信端,架構可以是相通的。當一個通信端運行兩個線程時將連接到服務器,一個讀、一個寫。
使用多服務器體系結構有許多好處,其效率高于單服務器系統。例如,如果一個任務有10個子任務,則每個子任務需要1 h才能完成,所以,使用單服務器系統需要10 h才能完成任務。但是如果系統有10臺服務器,可以同時處理10個子任務。理想狀態下完成任務只需要1 h左右,此外,故障容忍度比單服務器系統更高。例如,如果一個服務器在一個服務器系統中發生故障,那么所有的通信端都將受到影響。如果系統中有多臺服務器,其中,一臺服務器發生故障不會影響其他服務器,用戶就可以在其他服務器上完成自己的任務。此外,多服務器系統的可擴展性很高,因為可以增加或減少多個服務器中的通信端數量,而不會影響系統的體系結構。
多服務器架構也有缺點:首先,不同服務器的維護將花費大量資源。其次,多服務器體系結構的安全性很難保證,因為任何一個服務器都有可能受到攻擊并引發問題。最后,由于服務器的位置和數量的限制,管理和復雜度控制變得困難。
密碼學的基本概念是對信息進行加密和解密。原始數據稱為明文,具體來說,通過使用一些算法和密鑰,可以將明文轉換為一些不規則的數據,數據被稱為“密文”,過程稱為加密,算法稱為加密算法。同理,只要得到密鑰和算法,解密就是加密的相反過程。在實時通信的過程當中,通信的加密大致分為兩種,分別是對稱加密和非對稱加密[3]。
在通信系統中,服務器擁有一個官方證書,可以看作是一個可靠的第三方[4]。服務器將向通信端授予公鑰證書,以便通信端可以獲取服務器的公鑰,然后通信端可以使用公鑰加密發送到服務器的信息。服務器可以使用自己的私鑰來解密信息,使用非對稱加密的方法保證信息準確性。SSL協議為基于TCP/IP協議和通信端-服務器模型的Web應用提供了數據完整性和安全傳輸等安全措施。實際上SSL協議可以看作是開發系統模型(Open System Infrastructure,OSI)中傳輸層和應用層之間的中間件,給信息交互提供一個安全的信道[6]。
基于SSL協議連接的特點:首先,安全連接。當初始握手完成后,SSL使用對稱加密方法協商密鑰。其次,SSL可以使用RSA等非對稱加密(公鑰)方法進行身份驗證。最后,由于數據中含有校驗和以保持數據的完整性,所以,可以保證傳輸的可靠性[7]。
在通信系統中可以使用Java環境下的密鑰和證書管理工具(Key tool)。Key tool可以生成一個密鑰庫來存儲所有的密鑰和證書,此密鑰庫也受密碼保護。通信端和服務器將構建一個安全套接字,以確保傳輸通道是安全的。在構建過程中,服務器的證書將從服務器傳輸到通信端在傳輸層和應用層之間它為信息交換、數據加密和通信端-服務器身份驗證提供了一個安全的傳輸通道。
從分布式服務端通信架構可以看出,首先,服務器會向通信端發送一條消息顯示證書,證書中包含服務器的公鑰和來自可靠第三方的身份驗證。傳輸過程采用RSA算法進行保護。通信端使用服務器的公鑰加密主控密鑰。服務器可以通過密鑰庫中的私鑰對其進行解密。其次,服務器將使用其他算法生成主密鑰作為SSL會話的私鑰。此時一個對稱算法將在傳輸過程中保護信息,因為它需要較少的時間來加密和解密。主密鑰是私鑰,還可以提高通信端與服務器之間的通信效率。加密信息交互的結構如圖2所示。
當通信端將其私有信息傳輸到服務器時,服務器將其放入處理塊中,并使用PBE算法對數據進行加密。

圖2 加密信息交互
然后將這些數據存儲在存儲器中。當服務器需要調用或傳輸這些數據時,它將獲取數據并對其進行解密。基于密碼的加密(Password Based Encryption, PBE)算法是一種基于密碼和“鹽”(“salt”)概念的結合。Salt實際上是內存中生成的一個隨機數[8]。這兩個因素結合后,還將采用其他多種加密算法對這兩個因素進行加密,被認為是對稱加密算法的一個密集版本,因為沒有建立新的加密算法,而是基于AES和DES等算法。因此,在服務器中來加密信息更安全。
顯然,單服務器通信采用關鍵字同步的方式很容易控制并發問題,但還存在透明性、安全性和可擴展性等問題。在單服務器系統中,透明度的某些部分沒有被覆蓋。另外,如果服務器發生故障,所有通信端都將受到影響。一臺服務器的能力也是有限的。對于分布式多服務器體系結構,服務器之間可以通過簡單的通信端-服務器模型進行通信。此外,它還解決了單服務器模型中存在的一些透明性問題。而分布式加密通信也有很多優點。首先,可以使用SSL技術而不是普通的socket來保證傳輸的安全性,還采用RSA算法對算法和私鑰進行了加密,所以在SSL中存在雙重加密。其次,防止了其他人冒充官方服務器的風險,因為在建立SSL的過程中需要驗證服務器。再次,存儲在服務器中的數據也是安全的,因為是通過PBE算法加密的,降低信息泄露的風險。最后,所有的安全功能對用戶是透明的。但是此通信系統仍然有一個局限性。與其他對稱算法相比,PBE算法是安全的,但密碼也存儲在內存中,服務器中的信息仍然存在被非法解密的風險。