摘要:分析Sever/Client方式在實際應用中的重要的作用,使其在p2p發展迅速的網絡應用中依然有一席之地;通過服務器以多線程管理客戶端通信的方式穩定,高效,并且提供了單一或者多方備份與加密的可行性方案;Sever/Client穿透防火墻,路由的方式適用面廣,信息傳遞準確性高,提高了連接效率和安全性.
關鍵詞:Sever/Client;P2P;TCP;UDP;穿透;多線程
前言
隨著P2P與NAT技術的日益發展與成熟,P2P網絡在應用領域獲得了巨大的成功,然而傳統的Sever/Client的互聯方式依然有著重要的實際應用作用――企業的遠程財務管理,企業的可調控視頻會議,學校課程預約,手機短信息定向發送等等方面的工作從應用角度考慮更合適Sever/Client方式互聯.
Sever/Client網絡應用程序的設計都需要考慮路由穿透的問題,而基于UDP,TCP兩種通訊都可以完成穿透工作,本文重點討論TCP/IP穿透路由的技術方案.
一.概述
對于目標用戶來說,管理服務總是可見的,它有一個固定的公網IP,目標用戶可以通過
手動”登陸”或者后臺工作等方式主動訪問管理服務器,建立一個TCP/IP連接.利用這種方式目標用戶可以在自己的終端 — 計算機,手機等等客戶端繞過防火墻,穿過路由器與管理服務器建立一條穩定可靠的”通道”,只至有一方動取消連接為止.
利用這些”通道”,管理服務器可以記錄并管理這些目標用戶的網絡地址,并把即時消息,服務器指令,目標用戶之間的通訊消息,目標用戶的網絡地址發給所有或者指定的目標用戶,從而實現目標用戶與管理服務器之這間的防火墻,路由穿透,目標用戶之間的防火墻,路由目標穿透,達到無障礙阻通訊的目的.
二.目標用戶客戶端的設計
目標用戶客戶端的設計總方向為簡化數據管理,加強數據處理,豐富人機交互.
C++,VC++中已經封裝好的套接字CAsyncSocket, CSOCKET對于網絡通訊編程來說,使用簡單,然而效率和控制卻不及原始套接字SOCKET.下面就以SOCKET為例說明客戶端的設計方案。
對于套接字的阻塞通信方式,客戶端可以啟動一個線程來完成對服務器端口的監聽接收和發送工作,在VC++中可以封裝為一個網絡收發線程類來使用,這樣做可以保證網絡數據的安全與正確,同時還兼顧到數據的實時性,方便擴展。
網絡線程類主要工作分為四個部分:
1.將各模塊對服務器請求指令打包處理
主要將請求內容封裝為網絡數據,即在TCP/IP數據包的基礎上對數據進行二次封裝,便于程序處理。分為包頭,包內容,包結束。包頭一般包括長度,日期,類型等內容;包內容則是請求數據;包結束通常包含數據包的結束標志,或者數據是否分包發送,此為第幾包等等內容。
2.發送對服務器的請求
將封裝好的數據包根據類型,調用不同函數發送至服務器——根據程序內容也可以
調用同一函數發送。
3.監聽接收服務器數據
采用阻塞式通信套接字,線程監聽與服務器通信的端口,實時接收數據內容。
4.將接收到服務器的數據分類發送至處理模塊
根據數據包的類型,將數據包內容分門別類,取出數據包內容后通過消息機制發送給不同的數據處理模塊進行工作。
目標用戶客戶端之間通訊時可以采用服務轉發與直接通訊兩種方式,前者更加方便實現管理記錄功能但加重了管理服務器的工作負擔;后者效率更高卻比較難以管理記錄,各有長短,設計者可以根據具體情況進行設計.
在目標客戶端之間進行直接連接時,可以使用UDP連接,然而由于網關會動態改變UDP的端口映射,即使采用心跳數據包的方式也并不穩定,所以這種方案并不理想.
使用TCP連接由管理服務器中轉發雙方的IP地址,采用管理服務器偽造數據報,實現目標用戶雙手三次握手并連接的等方法.
三.管理服務器的設計
管理服務器的設計設計思路為采用多線程點對點方式強化數據管理。具體思路為創建一個管理線程,此線程的主要工作如下:
1.監聽與客戶端的通訊端口
創建一個線程,在指定的通訊端口上監聽連接,判斷連接是否是的目標客戶端進行連接,就可以得到一個針對此目標客戶端的套接字,并分配與之對應的ID。
2.創建通訊子線程
管理線程創建一個面向該用戶的阻塞式通訊子線程,并向這個子線程分配ID與相應的通訊套接字,這個子線程就可以負責起與用戶進行發接與收接網絡數據的工作,達到實時準確地與目標客戶進行接收發送數據的目的.
3.實時管理通訊子線程組
利用分配ID的方式進行記錄和管理,輕松實現數據組發,定向發送,定向記錄等等的管理功能。
4.結束通訊子線程,釋放資源
一旦目標用戶的連接中斷,可以馬上進行其對應子線程,套接字的銷毀,釋放管理服務器的資源。同時通過時間設置和中斷個數重新管理ID計數,保證管理服務器的正常安全運行。
而通訊子線程的工作內容與客戶端通訊線程工作內容類似,主要負責
#61548;將各模塊對客戶端指令打包處理
#61548;發送對客戶端的指令
#61548;監聽接收客戶端請求
#61548;將接收到客戶端請求的數據分類發送至處理模塊
線程之間的同步與管理已經有了大量的成熟的方法,可以避免目標用戶對同一內存同時修改的問題.
四.總結
1.目標實驗程序已經在WindowXP和Window2000環境下全部運行通過.
2.由于管理服務器的多線程設計,使用各目標用戶,各程序模塊調度自如,進一步實現的防火墻,路由的穿透目的.
3.原始套接字的使用對于程序的管理,移植有著重要的意義.
3.采用基于TCP/IP協議的編程方法,有效的保證了數據傳輸的可靠性.
參考文獻
李倩,陳志剛,《P2P網絡中TCP穿透NAT的解決方案》,
Tim Boyles,Dave Hucaby.Switching[M]. Cisoo Press,2000.
Andrew S Tanebaum, 計算機網絡(第3版)[M]. 北京:清華大學出版社,1998