袁永勝YUAN Yong-sheng;趙魁元ZHAO Kui-yuan;肖崢瑜XⅠAO Zheng-yu;趙搏ZHAO Bo;王春艷WANG Chun-yan
(河南科技大學軟件學院,洛陽 471000)
隨著互聯(lián)網(wǎng)技術的不斷發(fā)展,人們對網(wǎng)絡服務的要求也在不斷提高。在傳統(tǒng)的C/S 或B/S 模式中,網(wǎng)絡服務主要由服務器提供,用戶的一切交互行為都要經(jīng)過服務器。隨著用戶的大量增加,這種模式不僅加重了服務器所需要的資源,而且用戶在交互過程中產(chǎn)生的一切個人信息也都可能會保存到服務器中,尤其是在通訊領域中,我們的信息都有可能在不經(jīng)意間泄露。因此,本文提出了P2P 內(nèi)網(wǎng)穿透技術在通訊領域的研究,相比于傳統(tǒng)的C/S 架構,P2P模式不依賴于中心服務器,各個節(jié)點之間都是平等的,有著較高的容錯性和節(jié)點可擴展性,能夠極大緩解傳統(tǒng)架構中服務器端的壓力過大,單點失效等問題,同時更好地保護了用戶的信息安全。
本文主要對P2P 技術在通訊領域中的應用展開研究。當前互聯(lián)網(wǎng)中的應用普遍采用的是B/S 或C/S 模式。在這種傳統(tǒng)的模式中,信息的資源共享都是以一個服務器為中心,用戶之間的所有通信都需要中心服務器進行請求轉發(fā)。這種方式對于共享資源的查找、更新較為容易,但是會加重服務器的負載量,因為用戶的上行寬帶在大部分時間中都是空閑的,這不僅造成了資源的浪費而且速度也會降低。另外,這種方式應用在通訊領域中,由于所有數(shù)據(jù)都要經(jīng)過中心服務器進行存儲轉發(fā),因此會對用戶的信息安全造成極大威脅,極有可能造成用戶數(shù)據(jù)泄露。而在P2P 體系結構中,中心服務器的作用得到了淡化,每個用戶既可以是客戶端也可以是服務端。在這種模式中,系統(tǒng)會將用戶端也當做服務端,利用終端用戶的上行寬帶來輔助數(shù)據(jù)的轉發(fā)、交換。通過這種方式,用戶之間可以直接進行通信而不需要依賴于同一個中心服務器,速度得到了很大提升,也充分利用了網(wǎng)絡資源。其次,采用這種方式,用戶的數(shù)據(jù)都保存在本地而不是服務器,因此用戶的信息安全性得到了極大的改善。但是,這種方式在打洞時通常都是基于UDP 的,由于UDP 是一種不可靠的傳輸協(xié)議,因此需要在數(shù)據(jù)傳輸過程中解決不可靠傳輸問題,使數(shù)據(jù)能夠安全傳輸。另外,除卻在用戶信息交流方面的應用,P2P 還可以應用于目前比較流行的音視頻類的物聯(lián)網(wǎng)中,例如車機系統(tǒng)、智能攝像頭、可視化門鎖、門鈴等,利用這種技術會極大地節(jié)省云端服務器所消耗的巨大成本,并使用戶得到快速、安全的體驗。
NAT(網(wǎng)絡地址轉換)是為了解決IP 地址不夠用而產(chǎn)生的一種路由器解決方案。它可以給用戶分配本地網(wǎng)絡IP,在用戶上網(wǎng)時NAT 路由器會自動將用戶本地IP 轉換成公網(wǎng)IP 與外部通信。NAT 端口主要分為兩大類:錐型NAT 和對稱型NAT。而錐形又分為全錐形、受限錐形和端口受限錐形。對于處于不同端口類型后的網(wǎng)絡,其穿透方式也不盡相同。
ICE 全稱為交互式連接建立,它主要集成了STUN[1]和TURN[2]協(xié)議。因為用戶網(wǎng)絡基本上都位于不同的內(nèi)網(wǎng)之中,如果采用P2P 技術的話,就必須以某種方式讓兩端用戶能夠互相發(fā)現(xiàn)對方,因此ICE 穿透技術便是整個系統(tǒng)能夠正常工作的核心。其工作原理如圖1 所示。其中,TURN服務器是STUN 服務器的備用。

圖1 穿透服務器工作原理
然而在日常生活中,用戶網(wǎng)絡所處的NAT 設備類型多種多樣,因此ICE 在工作之初會先對用戶雙方的NAT類型進行判定。對于處于非對稱型NAT 設備后的用戶,STUN 服務器將會檢查用戶所請求的IP 地址(位于端口后的用戶應用程序所發(fā)出的請求IP),并將這個地址通過信令服務器傳遞給位于另外一個端口后的客戶端從而使兩個客戶端直接建立連接。而對于存在對稱型設備的網(wǎng)絡,有兩種情況STUN 協(xié)議將不能進行NAT 穿越,一種是用戶分別處于端口限制型NAT 和對稱型NAT 后,一種是雙方都處于對稱型NAT 后,因為每當客戶機發(fā)出一次請求,對稱型NAT 都會重新給用戶分配一個端口。那么此時ICE 會使用TURN 服務器進行中繼轉發(fā)[3]。值得一提的是,在穿透的幾種類型中,ICE 會優(yōu)先使用STUN 建立一個基于UDP 的連接,如果建立失敗,將會去嘗試進行TCP 連接,仍然打洞失敗時才會使用TURN 服務器進行中繼轉發(fā)。因此,TURN 服務器所產(chǎn)生的relay 候選地址的優(yōu)先級是最低的,因為中繼雖可靠但是也是效率最低的一種P2P通信方式,ICE 協(xié)議會在多個candidate 中選取最合適的地址進行通訊[4]。其工作流程如圖2 所示。

圖2 ⅠCE 框架工作流程
本系統(tǒng)前端采用安卓端的原生開發(fā)策略,后端采用Spring Boot 開發(fā),保證了數(shù)據(jù)的安全可靠性,運行速度快、性能高,用戶體驗最佳。
3.1.1 注冊與登錄
客戶端將用戶名以及輸入的密碼進行加密,發(fā)送給服務器,以用戶名為主鍵在數(shù)據(jù)庫中搜索用戶的信息,如果沒有搜索到將會返回給客戶端登錄失敗信息,搜索到后,系統(tǒng)會對密碼進行二次加密,再進行密碼的校驗,放入數(shù)據(jù)庫的密碼進行了兩次加密(注冊也是如此),即使數(shù)據(jù)庫的權限被盜取也很難破解出密碼,校驗成功后將token 返回給客戶端進行登錄后的權限驗證。注冊用郵箱作為賬號,輸入郵箱,點擊獲取驗證碼,服務器端隨機生成驗證碼并保存,一定時間后會自動刪除,將驗證碼發(fā)送到注冊的郵箱中,點擊登錄按鈕,后臺先進行驗證碼的校驗,通過校驗,將注冊信息存入數(shù)據(jù)庫,注冊成功。
3.1.2 消息同步
網(wǎng)絡通訊的主要是在兩端進行的,消息同步機制在兩端之間交互。消息分為索引和內(nèi)容兩部分進行存儲,雙端在進行同步時將會對比雙方持有的索引鏈表,并將對方需要的消息內(nèi)容根據(jù)索引發(fā)送給對方,從而使雙方的消息記錄保持一致。在消息發(fā)送時,發(fā)送方將會向信令服務器發(fā)送一個請求,請求中僅包含接收方的用戶ID 和發(fā)送方用戶ID,然后信令服務器會向接收方發(fā)送一個消息提醒,并將其存儲在緩存中,如果接收方離線,接收方上線后會主動向信令服務器發(fā)起詢問是否有新的消息,信令服務器會將緩存中的數(shù)據(jù)重新發(fā)送給接收方并清理緩存。
3.1.3 局域網(wǎng)中的數(shù)據(jù)傳輸
如果用戶處于同一局域網(wǎng)內(nèi),則不需要通過穿透服務器進行內(nèi)網(wǎng)穿透,用戶登錄后向局域網(wǎng)廣播用戶信息,局域網(wǎng)內(nèi)其他在線用戶可同步收到該廣播信息并將其加入在線用戶。如果用戶A 要和用戶B 通信,用戶A 會向用戶B 發(fā)送一個Socket 請求,用戶B 收到A 發(fā)來的Socket 請求后會將其暫存并向A 也發(fā)送一個Socket。雙方都擁有一個對方的Socket 后就建立起了局域網(wǎng)內(nèi)的連接,可進行文件傳輸、信息交流。其中Socket 會保存一段時間,下一次通信時則不需要重新建立連接而直接進行信息傳輸。
3.1.4 不同內(nèi)網(wǎng)間數(shù)據(jù)傳輸
當兩個客戶端處于非轉發(fā)方案中的情況時,用戶首先要連接服務器,注冊自己的信息,這個信息包括用戶公網(wǎng)映射IP 地址和端口以及用戶的信息,以供客戶端A 和B在自行連接的時候在公網(wǎng)上找到對方進行信息的傳輸,當客戶端A 想要和某個用戶(已經(jīng)在服務器端注冊的用戶)進行連接時,點擊注冊用戶列表中的用戶就可以實現(xiàn)兩端的信息交互。注冊后,客戶端命令服務器呼叫客戶端B,驗證網(wǎng)絡連接是否暢通,如果此時用戶已經(jīng)下線,服務器端會給客戶端A 回復客戶端B 不在線,否則客戶端會根據(jù)注冊的IP 和端口自行連接,實現(xiàn)端到端的通訊,但當一方下線時,會給服務器發(fā)送下線消息,服務器會通知對方下線,通訊回話結束。
3.1.5 安全傳輸
為了加強端對端傳輸之間的安全性,采用證書以及非對稱加密算法對通訊雙方的內(nèi)容進行加密,以防止中間人攻擊。通訊雙方在通訊建立時將會向對方發(fā)送自己的證書以驗證身份,然后會使用證書中的公鑰加密一個隨機數(shù)并返回對方。雙方在收到隨機數(shù)后使用自己的私鑰解密,并用對方的公鑰重新加密后重新發(fā)送給對方。雙方接收到后用自己的私鑰解密,然會對比是否為自己之前生成的隨機數(shù),若正確,則可以保證雙方之間的通訊沒有被第三人篡改,而后再使用對方的公鑰進行通訊。證書是由信令服務器提供方頒發(fā),雙方可以通過信令服務器方驗證證書的合法性。
Coturn 服務器是一個開源的穿透服務器,它完整地集成了STUN/TURN/ICE 協(xié)議并支持P2P 防火墻穿透技術。在本次研究測試中,穿透服務器采用的是在Ubuntu 云服務器中安裝Coturn,在安全組中開放了3478 等相關端口,并在Trickle ICE 中測試通過,能夠成功收集到STUN 協(xié)議獲得的srflx 地址和TURN 協(xié)議獲得的relay 地址(統(tǒng)稱為候選列表)。
信令服務器使用了SpringBoot 框架[5]進行開發(fā),采用WebSocket 通訊協(xié)議與客戶端交互。
3.3.1 信令協(xié)議
信令服務器與客戶端之間的通訊使用了自定義的WSTP(WebSocket Signaling Transport Protocol)信令傳輸協(xié)議,協(xié)議規(guī)定了一個信令是由一個20 字節(jié)的信令頭以及數(shù)據(jù)組成。信令頭的組成如表1 所示。

表1 信令頭設計
版本號根據(jù)高低4 位分為不兼容版本號和兼容性版本號,代表當前協(xié)議數(shù)據(jù)包服務器可處理程度;魔數(shù)是一個用于保證完整性的簡易校驗方式,是一個固定的數(shù);標識位用于控制一些選項(IE、CT、HB、BIN、RESP 等);類標識符是用于指示該協(xié)議包要訪問哪個信令類;數(shù)據(jù)長度即為攜帶數(shù)據(jù)的總長度。信令協(xié)議可攜帶的數(shù)據(jù)有兩種,JSON 和二進制。
3.3.2 信令管理器
信令服務器中的所有信令都定義在信令類中,服務器在啟動時, 信令管理器會使用SpringBoot 中的ResourceLoaderAware 掃描特定的包,并將所有擁有@Signaling 注解的信令類注冊到管理器中,并由信令管理器管理它們的生命周期,此后,信令管理器將會根據(jù)信令類中帶有Mount 的注解的屬性類型從Spring Bean 管理器中獲取Bean,并掛載在這些屬性中。當WebSocket 服務器接收到數(shù)據(jù)時,會先將數(shù)據(jù)按照WSTP 協(xié)議處理為Protocal 對象,并傳入到信令管理器中,信令管理器會根據(jù)Protocal 對象中的標識符以及數(shù)據(jù)訪問對應得信令方法執(zhí)行,并取得結果封裝為ResponseProtocal 返回給客戶端。
本系統(tǒng)最終在安卓端完成編寫與測試,使用Android Studio 進行開發(fā),使用了開源的原生UI 框架XUI 進行界面開發(fā),采用WebSocket 通信協(xié)議與后端進行交互,調用信令服務器提供的各接口以實現(xiàn)整體功能。其中主要使用了重寫后的WebSocketClient,使其可以直接發(fā)送信令數(shù)據(jù),并且可以直接發(fā)送Java 對象。 重寫后的WebSocektClient 需要在發(fā)送時設置一個回調,在執(zhí)行成功、失敗、超時時會自動調用回調。重寫后的WebSocketClient 可以自管理Token 信息。
綜上所述,在如今互聯(lián)網(wǎng)高速發(fā)展的時代,大量的網(wǎng)絡資源造成浪費,人們的信息安全也亟需加強。本文通過對基于ICE 框架的P2P 技術的原理分析,闡述了P2P 技術在如今互聯(lián)網(wǎng)中的發(fā)展方向和潛力,尤其在通訊領域中,P2P 技術就顯得尤為重要。本文提出了P2P 技術在通訊領域的研究應用,旨在為通訊領域提供一個不同于傳統(tǒng)C/S 模式的方法,能夠讓用戶更加重視自己的信息安全,具有一定的參考價值。