摘 要 車站售票程序自動升級是將P2P技術(shù)的文件共享系統(tǒng)理念應(yīng)用于自動升級程序,對車站售票程序的升級文件進(jìn)行下載和管理。其本質(zhì)是P2P文件管理系統(tǒng),借鑒和綜合了Napster和BitTorrent的優(yōu)點。經(jīng)過理論分析和試驗驗證, 該自動升級程序?qū)ι壩募M(jìn)行下載和管理的功能實現(xiàn),證明我們改進(jìn)P2P技術(shù)方案的文件下載調(diào)度算法是合理的和高效率的。該P2P文件下載管理調(diào)度算法既保證了P2P網(wǎng)絡(luò)結(jié)構(gòu)化,也保證了在程序升級過程的中后期,在中心節(jié)點(服務(wù)器)節(jié)點斷開的情況下也能實現(xiàn)某一臺售票主機對中心節(jié)點的接管,保證整個P2P網(wǎng)絡(luò)的所有主機售票程序升級完成。
關(guān)鍵詞 結(jié)構(gòu)化網(wǎng)絡(luò);P2P網(wǎng)絡(luò);調(diào)度算法;MD5;數(shù)據(jù)完整性;socket網(wǎng)絡(luò)編程
背景
現(xiàn)在鐵路車站售票系統(tǒng)是在鐵路局域網(wǎng)絡(luò)中采用C/S技術(shù)架構(gòu)模式,車站售票系統(tǒng)客戶端程序需要頻繁地進(jìn)行升級維護(hù)。當(dāng)車站售票程序的功能增加或改變以及票價調(diào)整時,就需要對車站售票程序的相應(yīng)文件進(jìn)行替換或者增加,即車站售票程序升級。每次升級需要下載的文件數(shù)量有幾個或幾十個不等,下載的文件總共可達(dá)幾百KB至一百多M不等,每個文件幾乎都在1k至15M之間。
為減少車站信息技術(shù)人員的工作量和減少人工在程序升級中的操作失誤,我們開發(fā)自動升級程序來實現(xiàn)車站售票程序的自動升級。為保證車站售票程序自動升級過程中確保文件傳輸?shù)男屎蛯W(wǎng)絡(luò)帶寬等資源的合理利用,以及防止單點故障對程序升級造成影響,決定將對等網(wǎng)絡(luò)(Peer to Peer網(wǎng)絡(luò),即P2P網(wǎng)絡(luò))技術(shù)應(yīng)用于自動升級程序。
1updatefiles.xml和fcopysgetIp.xml文件
(1)在中心節(jié)點主機上進(jìn)行升級文件包解壓,解壓過程中生成updatefiles.xml文件。updatefiles.xml文件包含該升級程序的版本號、中心節(jié)點Ip(服務(wù)器Ip)、提醒程序升級的通知內(nèi)容、解壓后的升級文件名稱、文件路徑,升級完成標(biāo)志等等信息。updatefiles.xml文件格式及內(nèi)容如下:
在中心節(jié)點(服務(wù)器端)給售票主機節(jié)點推送升級信息時,將fcopysgetIp.xml發(fā)送給售票主機。根據(jù)fcopysgetIp.xml,售票主機就知道P2P網(wǎng)絡(luò)中哪些主機節(jié)點擁有該文件的副本,就能夠通過調(diào)度算法從中心節(jié)點或主機節(jié)點中選擇一臺主機下載文件。
文件下載完之后,將下載文件的售票主機節(jié)點(Ip)添加到本機的fcopysgetIp.xml中;將下載文件的售票主機節(jié)點(Ip)添加到中心節(jié)點的fcopysgetIp.xml中;如果是從另一臺主機節(jié)點下載文件(不是從中心節(jié)點主機下載文件),將下載文件的售票主機節(jié)點(Ip)添加到被請求訪問的主機節(jié)點的fcopysgetIp.xml中。這樣就能保證每臺主機能及時更新整個網(wǎng)絡(luò)售票主機的下載文件的備份情況[1]。
2自動升級程序的P2P網(wǎng)絡(luò)架構(gòu)
自動升級程序基于Java socket來構(gòu)建P2P網(wǎng)絡(luò),采用TCP協(xié)議(一種可靠的傳輸協(xié)議)。升級程序使用Java socket編程,java在java.net包中提供了兩個類:ServerSocket和Socket,分別對應(yīng)網(wǎng)絡(luò)連接的服務(wù)端、客戶端。當(dāng)然服務(wù)端和客戶端在P2P網(wǎng)絡(luò)中是相對概念,申請文件下載的主機為客戶端,提供文件下載的主機為服務(wù)器端。ServerSocket和Socket是兩個Java已經(jīng)封裝好的類,其構(gòu)造方法為: ServerSocket(int port);Socket(InetAddress address, int port)。
借鑒Napster軟件的結(jié)構(gòu)化網(wǎng)絡(luò)的優(yōu)點,在P2P網(wǎng)絡(luò)中設(shè)置中心節(jié)點。中心節(jié)點類似于C/S模式架構(gòu)的索引服務(wù)器角色,首先為P2P網(wǎng)絡(luò)提供文件的索引服務(wù)器的功能,同時也提供文件下載服務(wù),其優(yōu)點是實現(xiàn)網(wǎng)絡(luò)結(jié)構(gòu)化,擴展性好,P2P網(wǎng)絡(luò)的主機節(jié)點的加入和離開都很簡單,便于管理。自動升級程序采用結(jié)構(gòu)化P2P網(wǎng)絡(luò)是為了防止純粹的非結(jié)構(gòu)化對等網(wǎng)絡(luò)的廣播造成的消息泛洪而導(dǎo)致網(wǎng)絡(luò)效率低下。
在售票程序自動升級初期,中心節(jié)點在P2P網(wǎng)絡(luò)中推送升級信息時,會將updatefiles.xml文件發(fā)送給每一個售票節(jié)點主機。自動升級程序構(gòu)建的結(jié)構(gòu)化分布式對等網(wǎng)絡(luò)將網(wǎng)絡(luò)中文件的資源索引存儲在fcopysgetIp.xml中。當(dāng)一個車站售票節(jié)點主機在P2P網(wǎng)絡(luò)中搜索相應(yīng)的資源時,從中心節(jié)點獲取fcopysgetIp.xml文件即可。以這樣的方式,fcopysgetIp.xml文件將從中心節(jié)點備份到網(wǎng)絡(luò)中的每一臺車站售票主機。從updatefiles.xml獲取需要下載的文件名和從fcopysgetIp.xml搜索并通過算法隨機獲取擁有該文件副本的主機ip,這樣就可以與對應(yīng)ip節(jié)點主機連接并下載文件。
自動升級程序也借鑒了BitTorrent軟件優(yōu)點。在健壯性方面,在文件下載在中后期,文件下載服務(wù)分散在各個節(jié)點之間,用fcopysgetIp.xml代替分布式哈希表實現(xiàn)文件主機索引的功能,防止單點故障,即使中心節(jié)點斷開也能保證整個網(wǎng)絡(luò)的文件下載,容錯性好。中心節(jié)點失效時,P2P網(wǎng)絡(luò)中的一臺主機會接管中心節(jié)點的功能,并自動調(diào)整網(wǎng)絡(luò)拓?fù)?,保持其他?jié)點的連通性。同時不再像BitTorrent一樣對文件分片傳輸,而是自動升級程序?qū)蝹€文件作為一個單元進(jìn)行傳輸,并對傳輸文件和文件的MD5散列值一起傳輸至客戶端,然后進(jìn)行文件的完整性校驗。
對等網(wǎng)絡(luò)(P2P)減少了C/S模型中對服務(wù)器的資源訪問壓力,資源分布存儲在多個主機節(jié)點上,起到了整個網(wǎng)絡(luò)負(fù)載均衡的作用。
自動升級程序基于P2P網(wǎng)絡(luò)完成升級文件下載的同時,該網(wǎng)絡(luò)需要一個中心節(jié)點(服務(wù)器)保證網(wǎng)絡(luò)的結(jié)構(gòu)化。P2P網(wǎng)絡(luò)的中心節(jié)點既是提供文件下載的節(jié)點,也是一個文件下載的索引服務(wù)器。中心節(jié)點在這里面所起的作用不僅是傳輸文件,更是查找文件的location[2]。
3自動升級程序文件下載的基本過程
自動升級程序基于P2P網(wǎng)絡(luò)的文件下載基本過程描述如下:
(1)在程序升級初期,售票程序的升級文件只能從中心節(jié)點(服務(wù)器端S)下載升級文件,流程如下:
①將升級文件包解壓到服務(wù)器端(對等網(wǎng)絡(luò)的中心節(jié)點),并同時生成兩個XML文件updatefiles.xml和fcopysgetIp.xml文件。
②服務(wù)器端向車站客戶端推送需要升級的信息。
③車站客戶端收到程序升級提醒,售票員退出售票程序,點擊“確定升級”確認(rèn)可以升級。
④服務(wù)器端首先將updatefiles.xml發(fā)送給車站客戶端。
⑤車站客戶端從服務(wù)器端獲取updatefiles.xml和fcopysgetIp.xml文件,覆蓋本機磁盤上的updatefiles.xml和fcopysgetIp.xml文件。
⑥車站客戶端按照updatefiles.xml中記錄的文件名依次向服務(wù)器端請求下載文件。
⑦車站客戶端下載完成某個文件后,在updatefiles.xml中修改該文件名對應(yīng)的該條記錄的下載完成標(biāo)志,并在fcopysgetIp.xml中該文件名對應(yīng)的該條記錄中添加車站客戶端IP。
⑧車站客戶端下載完成某個文件后,向服務(wù)器端發(fā)送一條文件下載完成信息,在服務(wù)器端的fcopysgetIp.xml中該文件名對應(yīng)的記錄中添加車站客戶端IP。
(2)在程序升級的中后期,售票程序的升級的所有文件copies在中心節(jié)點(服務(wù)器端)和一部分車站售票主機節(jié)點上。假設(shè)有m臺車站售票主機已有升級文件xxx.dll,文件下載流程如下:
①假設(shè)車站客戶端主機C1需要下載xxx.dll文件,C1向服務(wù)器S請求獲取fcopysgetIp.xml文件,并從fcopysgetIp.xml中讀取擁有xxx.dll文件copy的m個車站客售票主機Ip。
②C1通過調(diào)度算法選擇從S或者從m臺客戶端主機中的某一臺主機(假設(shè)為客戶端主機C2)下載xxx.dll文件。
③如果XX.dll文件下載成功,C1在自己本機的文件updatefiles.xml中修改XX.dll對應(yīng)的該條記錄的下載完成標(biāo)志。同時,C1、S、C2在自己本機的文件fcopysgetIp.xml中該文件名對應(yīng)的記錄中添加C1的IP。
④如果XX.dll文件下載不成功,C1從fcopysgetIp.xml中通過調(diào)度算法選擇另一臺主機再次下載XX.dll文件,重復(fù)該步驟直至該文件下載完成。
⑤按照updatefiles.xml中記錄的文件名,依次下載文件,重復(fù)以上步驟,直至升級文件全部下載完成[3]。
4結(jié)構(gòu)化P2P網(wǎng)絡(luò)下載文件調(diào)度算法及實現(xiàn)
自動升級程序結(jié)構(gòu)化P2P網(wǎng)絡(luò)下載文件調(diào)度算法非常簡單和易于實現(xiàn)。步驟如下:
(1)上傳升級包至服務(wù)器端(中心節(jié)點),升級包解壓到指定路徑下,并生成updatefiles.xml文件和fcopysgetIp.xml文件。updatefiles.xml記錄了所有升級包文件的文件名和路徑信息。
(2)中心節(jié)點將updatefiles.xml和fcopysgetIp.xml傳送給售票主機節(jié)點。
(3)售票主機節(jié)點按照updatefiles.xml的記錄依次從該P2P網(wǎng)絡(luò)申請訪問下載文件。對應(yīng)表格如下:
對表格中m+1個主機進(jìn)行隨機排序后,向第一個主機申請xxx.vsd文件下載。如果下載成功,然后將新獲取xxx.vsd文件副本的主機IP添加到本地主機、中心節(jié)點主機和提供下載文件副本的主機的fcopysgetIp.xml中并修改xxx.vsd文件的對應(yīng)下載標(biāo)志,重復(fù)以上第三步驟。如果下載不成功將第一個主機放在臨時排序表最后位置,向第二個主機申請文件下載。同理,依次申請下載xxx.vsd文件,直至xxx.vsd文件下載完成。
該算法實際上實現(xiàn)了隨機申請網(wǎng)絡(luò)資源的碰撞回退功能,起到了網(wǎng)絡(luò)負(fù)載均衡的作用。該算法也明顯去掉了中心節(jié)點的數(shù)據(jù)訪問壓力,在此結(jié)構(gòu)化P2P網(wǎng)絡(luò)中,中心節(jié)點的文件訪問壓力只相當(dāng)于C/S模式文件訪問壓力的1/m+1。在整個網(wǎng)絡(luò)文件下載的中后期隨著m值的增加,中心服務(wù)器的文件下載壓力會越來越小,文件下載速度也會越來越快。
(5)在文件下載中后期,如果中心節(jié)點出現(xiàn)故障,只要其中一個車站售票節(jié)點主機擁有所有下載文件的全備份,該節(jié)點主機將接管中心服務(wù)器的功能,并向申請文件下載的售票節(jié)點提供fcopysgetIp.xml,保證整個結(jié)構(gòu)化P2P網(wǎng)絡(luò)中所有升級文件的順利下載。
5MD5進(jìn)行文件完整性校驗
為保證文件傳輸過程中的完整性,對下載的文件進(jìn)行MD5散列值的完整性校驗。假設(shè),請求文件主機為A,提供文件下載主機為B。
(1)在主機B傳輸文件xxx.vsd前,利用MD5算法對xxx.vsd文件編碼,生成128位的哈希值。
(2)主機B將文件xxx.vsd和128位的哈希值一起傳送給主機A。
(3)主機A收到信息后,利用MD5算法對收到的xxx.vsd文件編碼,生成128位的哈希值。再將生成128位的哈希值與從主機B接收到的128位的哈希值進(jìn)行對比,如果相等,證明文件xxx.vsd完整;如果不相等,證明文件xxx.vsd已損壞。從而實現(xiàn)文件完整性校驗。
6結(jié)束語
基于結(jié)構(gòu)化P2P網(wǎng)絡(luò)技術(shù)的改進(jìn)方案,提供了一種簡單新穎的結(jié)構(gòu)化P2P網(wǎng)絡(luò)結(jié)構(gòu)化方式,在局域網(wǎng)中完全能夠?qū)崿F(xiàn)既定功能,還易于編碼實現(xiàn)。通過理論分析和實驗驗證,改進(jìn)后的結(jié)構(gòu)化P2P網(wǎng)絡(luò)技術(shù)方案是合理可行的。
參考文獻(xiàn)
[1] 牛冬.區(qū)塊鏈底層設(shè)計Java實戰(zhàn)[M].北京:電子工業(yè)出版社,2019: 20-96.
[2] 蔡康,唐宏,丁圣勇,等.P2P對等網(wǎng)絡(luò)原理與應(yīng)用[M].北京:科學(xué)出版社,2011:188-198.
[3] 孫立鐫,楊首昂.基于P2P結(jié)構(gòu)的協(xié)同設(shè)計系統(tǒng)的構(gòu)架研究[J].計算機應(yīng)用研究,2009,26(5):1803-1805.
作者簡介
鄧洪波(1980-),男,四川仁壽縣人;學(xué)歷:本科,工程師,現(xiàn)就職單位:中國鐵道科學(xué)研究院集團有限公司,研究方向:軟件開發(fā)。