


摘要:為了計算源主機到目的主機的端到端的時延,該文設計了一種基于JSP的計算網絡時延程序。首先通過使用MINA框架的IoHandler接口進行服務端和客戶端的搭建;然后使用IoService接口來封裝數據;用SSM框架中的Mybatis用來持久層與數據庫的交互;日志的記錄采用了基于Java的Apache Log4j組件;最后利用SSL的密碼處理技術保證了TCP連接中的網絡安全通信。測試結果表明,本程序計算的端到端的時延是準確的,符合實際的。
關鍵詞:JSP;網絡時延;TCP;SSL
中圖分類號:TP311" " " 文獻標識碼:A
文章編號:1009-3044(2022)33-0071-03
1 引言
隨著計算機網絡的迅速發展,許多因特網應用,如搜索、Web瀏覽、電子郵件、地圖、及時信息和IP語音,它們的性能受網絡時延的影響很大。很多時候我們在微信聊天,打游戲或看視頻會遇到卡頓情況,網絡時延便是導致卡頓的一個非常重要的因素。而很多同步應用對網絡時延的要求是非常高的,網絡時延不穩定可能會導致丟包從而使其不能使用。而且不同的服務類型在相同的延時下,給人的主觀感受也是不一樣的。例如,當視頻加載時,10s的初始化時延是能忍受的,但當我們即時通信時,5s的時延就會很糟糕。這時候就需要一個專門的程序來幫我們測試在不同情況下我們請求服務的時延[1]。
延遲時間長的設備都將使網絡速度慢下來,無論其利用率是多少。我們可能會認為高速以太網的毫秒級延遲不會對應用造成影響。其實不然,在高速以太網中,即使幾毫秒的時延也會極大地降低TCP性能。而80%以上的Internet通信使用的是TCP,延時便成了一個我們不得不考慮的問題。通過研究時延,可以讓我們的系統更加流暢,讓用戶擁有更好的體驗,讓系統的研究維護成本大大降低。尤其對一些需要實時更新、實時通信的應用來說,研究時延就變得非常重要。因此,計算網絡時延程序的實現有著重要的意義。
2 技術要求
2.1 主要技術
本項目是基于JSP實現的Java小程序。前端是一個VUE框架實現的可視化圖形界面。后端則以MINA,SSM兩大框架為主體,Apache Log4j組件和JSEE技術為輔助,實現計算網絡時延的功能。
網絡編程抽象地來說,就是信息的交互。在發送端按照協議對信息進行封裝,通過物理媒介傳輸到接收端。在接收端同樣按照協議對消息進行解析,提取出信息,實現信息的交互。網絡上的兩個程序通過一個雙向的通信連接實現數據的交換。這個連接的端點由IP地址和端口號共同組成,叫作Socket。因此,網絡編程也叫作Socket編程。本程序主要使用的是Socket的TCP連接。Socket可以看作是應用層與TCP/IP協議族通信的中間軟件抽象層,它就是一組接口[2]。
MINA框架是一個網絡通信應用框架,可以快速地開發性能優良,擴展性高的網絡通信應用。其核心是IoSession接口,服務端和客戶端交互的信息便封裝在其中。在客戶端與服務端可以通過繼承MINA框架中的IoHandlerAdapter類來獲取IoSession接口中的信息。在服務端也可以用來表示客戶端,在服務端通過IoSession接口對客戶端進行操作。MINA框架也可以遠程搭建服務器并遠程控制服務器。服務端和客戶端的端口號和IP地址,可以自動指定也可以用戶定義。
SSM就是三個框架的集合。其中Spring包括SpringMVC。是整個項目中用來與數據庫動態交互的框架。通過使用SSM可以極大地簡化連接數據庫的過程與代碼,使開發更加高效便捷。其核心思想是控制反轉。
Spring是一個開源的框架,更準確地說它就是一個容器。容器中的每一個Bean都是一個抽象的方法。Spring通過建立Bean工廠來管理這些Bean。雖然Spring有很多的Bean,但是它是模塊化的,它的Bean是單獨的,只需利用有用的即可。
和Spring一樣,MyBatis也是一個開源的框架。文檔與代碼的結合使用是其最鮮明的特點。MyBatis的核心是XML文件的配置。通過XML配置或者注解的使用,我們幾乎不需要JDBC代碼。它實現了SQL語句與代碼的分離,降低了代碼的耦合性,使程序便于維護與測試。SSM動態連接數據庫的方便與快捷便體現在MyBatis上。
Apache Log4j是當前在J2EE和J2SE開發中用的最多的日志框架,它具有出色的性能和靈活的配置以及豐富的功能,并且可以使用自定義組件來代替框架中組件來滿足要求。如果說MyBatis是文檔與代碼的結合。那Apache Log4j完完全全就是文檔編程。通過Apache Log4j框架,在編寫配置文件時就可以與數據庫進行交互,不需要再另寫代碼。
JSEE技術實現了SSL協議和TSL協議。在網絡編程中,一個非常重要的問題就是數據傳輸的安全性。本項目使用的SSL證書數據安全加密的方式遵守SSL協議,是數字證書的一種,類似于日常生活中的數字簽名。
使用SSL加密,要向數字證書頒發機構申請。申請通過后會有一份具有數據傳輸加密和服務器身份驗證功能的SSL證書。通過SSL證書我們可以對信息進行加密解密。同樣SSL也會保證信息的完整性和一致性,防止信息被篡改。
SSL協議位于應用層協議和傳輸層協議之間,主要是用來對TCP通道進行加密。而SSL協議又可以分為兩層:SSL記錄協議和SSL握手協議。記錄協議主要是對數據進行封裝、壓縮、加密。握手協議顧名思義就是服務端和客戶端進行握手,進行一些信息交互前的操作,例如身份驗證、交換密鑰等。
Vue框架是一個只關注視圖層的前端框架,它具有靈活的組件和高效的數據綁定,同時它封裝了大量前端頁面常用的功能。前端的代碼往往是繁雜的,冗余的,Vue框架通過代碼復用,功能封裝,極大地減少了代碼量。
2.2 主要實現過程
通過MINA框架在目標服務器上再搭建一個服務端,然后運行在本地的客戶端通過socket與搭建的服務器端進行TCP連接[3]。客戶端通過服務端遠程控制目標服務器執行ping命令,并將獲得的數據儲存在LOG日志中,然后再通過MINA的IoSession返回數據給客戶端。客戶端通過SSM框架來與數據庫進行交互,并對數據進行相應的處理之后生成URL地址。前臺頁面通過axios訪問URL地址獲得數據。JSSE通過生成clientkeystore和serverkeystore加密證書來保證數據的安全性。圖1為實現過程圖。
3 系統功能設計
3.1 服務端與客戶端的搭建
首先,建立兩個處理器類PingServerIoHandler和PingClientIoHandler繼承MINA框架的IoHandlerAdapter類來分別作為服務端和客戶端的處理器。在服務端處理器中通過System的getProperty方法獲得操作系統的OsName,通過OsName選擇合適的命令。遠程調用目標服務器的cmd執行ping命令,通過MessageFormat來格式化命令字符串。客戶端連接服務端,通過服務端的Runtime來遠程控制目標服務器執行命令獲得數據,并將獲得的數據一行行寫入IoSession中,IoSession是客戶端和服務端的特定連接,以鍵值對的形式保存數據。
與PingServerIoHandler相對的是PingServer服務端。在服務端創建一個非阻塞的Socket,通過NioSocketAcceptor來實現。消息的傳送會經過一系列的過濾器。自定義過濾器使數據、操作和狀態存儲在日志中。然后使用MINA框架提供的文本換行符編解碼器來轉化文本為UTF-8類型。最后為接收器設置管理服務并綁定端口。這一系列過程通過Acceptor來實現。
同樣與PingClientIoHandler相對的是PingController客戶端,也是SSM的控制器。類似地,客戶端也需要創建一個非阻塞的Socket,并綁定一個與服務端相同的端口。不同的是需要給客戶端一個固定IP地址,而服務端的IP地址則作為數據輸入。因為我們的服務端是在目標服務器上搭建的服務器,所以服務端的IP地址和目標服務器的IP地址不一樣,這從某種程度上保證了一定的安全性。這個數據的輸入是在客戶端完成的,輸入數據也會寫入IoSession中。同樣的客戶端也能從IoSession中獲得服務端寫入的數據。數據也會經過一系列的過濾器。同時客戶端需要一個計時機制來提前結束獲取數據超時的連接。
3.2 數據的安全傳輸
遠程連接服務器和網絡中數據的傳輸是本程序的核心。通過事件驅動,異步操作的編程模型使程序高性能,高擴展性地遠程控制服務器;利用控制反轉來降低代碼之間的耦合性;設置一系列的攔截器,過濾器,控制器來與數據庫進行交互;I/O流來進行數據的讀寫;Socket去組織數據,以符合指定的協議。
在客戶端和服務器之間通過TCP/IP協議傳輸數據時,數據并不是安全的。為了保證數據傳輸的安全性,我們采用了JSSE技術[4]。在這里我們使用了JAVA自帶的keytool命令去生成證書文件。在編寫SSL相關類時通過調用getInstance工廠方法創建SSLContext對象。在客戶端和服務端還需要分別添加Ssl Filter安全加密過濾器。需要注意的是要確保注入SslFilter到過濾器鏈中的第一位置。目的負責管理數據的加密和解密通過安全連接。圖2是SSL相關文件目錄:
3.3 數據的存儲與日志的處理
在存儲數據時則采用了SSM框架。SSM框架的核心是web.xml文件,用來初始化Spring核心,配置攔截器,配置過濾器。Jdbc.properties配置連接數據庫的各種信息。applucationContext.xml加載jdbc.properties,連接數據庫,掃描包下面的注解,配置映射對象,配置聲明式事務管理器,視圖解析,json轉換器等功能。自定義Apache Log4j組件對日志進行格式化處理與輸出,同時還需要在前臺設置過濾器來對輸出的日志數據進行過濾。Apache Log4j框架的核心的log4j.properties,其通過使用Log4j的三個主要組件:Logger,Appender和Layout來分別完成客戶端代碼調用,日志的輸出以及日志信息格式化[5]。
3.4 實驗數據
本程序獲得的數據:
4 結束語
本程序的主要功能就是為了測試網絡中存在的時延。雖然隨著技術的更新換代,時延越來越小,不再像以前一樣不能忍受,但是時延是不可避免的,無論是打游戲時的卡頓還是看視頻時的加載,都會影響我們的主觀感受和應用的性能。在理想情況下,希望時延能在現有的技術下達到最小,改善用戶的體驗,提高應用的性能。本程序通過一系列的框架和算法實現初步達到了測試時延的目的。通過運行本程序可以獲得一系列相關的時延數據。通過分析實驗數據,得到一般性結論,再反復實驗進行驗證,對改善網絡時延,提高應用性能具有重要意義。
參考文獻:
[1] James F.Kurous,Keith W.Ross.Computer Networking A Top-Down Approach[M].陳鳴,譯.7版. 北京:機械工業出版社,2018.
[2] 蘇鵬飛,徐松毅,于曉磊.基于WOA-LSTM的窄帶通信網網絡時延預測算法[J].河北工業科技,2022,39(1):9-15.
[3] 張民忠.Apache Mina中TCP服務器集群功能擴展研究[D].武漢:武漢理工大學,2018.
[4] 周明華,楊海云,吳鑫哲,等.國密算法JSSE密碼套件的設計與實現[J].網絡安全技術與應用,2019(7):34-36.
[5] 夏文忠.Log4J在學生管理系統中的開發與應用[J].電腦編程技巧與維護,2009(10):34-36.
【通聯編輯:梁書】