閆培哲
(忻州師范學(xué)院,山西 忻州 034000)
?
網(wǎng)絡(luò)文件傳輸技術(shù)的研究與實現(xiàn)*
閆培哲
(忻州師范學(xué)院,山西 忻州 034000)
在現(xiàn)代信息社會中,信息的交換、共享顯現(xiàn)的尤為重要。局域網(wǎng)作為計算機(jī)網(wǎng)絡(luò)中的終端成員,在企事業(yè)單位中起著至關(guān)重要的作用。本文介紹了計算機(jī)網(wǎng)絡(luò)中文件的傳輸實現(xiàn)技術(shù),并針對局域網(wǎng)特點,設(shè)計了一種較為高效安全的局域網(wǎng)文件傳輸系統(tǒng)設(shè)計方案,實現(xiàn)了網(wǎng)絡(luò)發(fā)現(xiàn),數(shù)據(jù)的實時壓縮、實時加密,流量控制等功能。
局域網(wǎng)發(fā)現(xiàn);文件傳輸;網(wǎng)絡(luò)流量控制
基于局域網(wǎng)的文件傳輸系統(tǒng)能夠讓局域網(wǎng)內(nèi)部資料實現(xiàn)快捷,準(zhǔn)確,安全的共享。文件傳輸系統(tǒng)主要功能是自動獲取局域網(wǎng)內(nèi)用戶的主機(jī)名,IP地址以及其他信息,最終通過TCP/IP協(xié)議和UDP協(xié)議實現(xiàn)點到點文件傳輸功能。
在目前的局域網(wǎng)中信息的傳輸是開放的,所以任何人都可以借助一些特殊的工具(如抓包工具)實現(xiàn)對這些信息的獲取,這樣就大大的降低了信息的安全性,甚至可能會帶來巨大的經(jīng)濟(jì)損失。另外,雖然目前局域網(wǎng)的帶寬已經(jīng)達(dá)到10 M/s到100 M/s,甚至出現(xiàn)了千兆以太網(wǎng),但是可用帶寬作為一種資源,它的不足會嚴(yán)重影響到整個局域網(wǎng)的服務(wù)質(zhì)量,使得人們的工作效率大幅度下降。
設(shè)計基于自身局域網(wǎng)特點的文件傳輸工具顯得尤為重要。
計算機(jī)與計算機(jī)之間的網(wǎng)絡(luò)通訊實際上是運(yùn)行在這兩個計算機(jī)上的進(jìn)程之間的通訊,如圖1所示。
圖1 網(wǎng)絡(luò)通訊示意圖
網(wǎng)絡(luò)中使用一個三元組來標(biāo)識全局中的唯一進(jìn)程:
(協(xié)議,本地地址,本地端口號)
這樣一個三元組稱作半相關(guān)(half-association),它指定的是連接的一端,如果需要確定一個完整的網(wǎng)絡(luò)通訊,則需要確定兩個進(jìn)程,并且只能使用一種高層協(xié)議,這就需要下面的五元組,稱為全相關(guān)(association):
(協(xié)議,本地地址,本地端口號,遠(yuǎn)程地址,遠(yuǎn)程端口號)
Heartbeat服務(wù)的目的就是收集和維護(hù)這些信息。
在本文中,協(xié)議主要用到TCP和UDP兩種協(xié)議,用于發(fā)送和接受控制數(shù)據(jù)的Socket使用UDP協(xié)議,而用于文件傳輸?shù)腟ocket使用TCP協(xié)議。
根據(jù)SOCK_STREAM和SOCK_DGRAM兩種類型的Socket的工作模式,可以知道,應(yīng)用程序可以在整個生命周期中重復(fù)使用一個SOCK_DGRAM類型的Socket來向任意客戶端發(fā)送數(shù)據(jù)包形式數(shù)據(jù),而利用一個SOCK_STREAM類型的Socket在請求連接或接受連接時返回的Socket來進(jìn)行所需的流式數(shù)據(jù)通訊。
另外,考慮到安全性和穩(wěn)定性等因素,客戶端可以設(shè)置三種端口用于整個生命周期中的網(wǎng)絡(luò)通訊,分別為Heartbeat Service Port(每個HeartbeatService 設(shè)置需要一個端口,以適應(yīng)不同Heartbeat Service Port的客戶端群),TCP Port(唯一)和UDP Port(唯一)。其中,TCP Port和UDP Port隨機(jī)創(chuàng)建,然后通過端口固定的Heartbeat服務(wù)來通知其他客戶端自己的TCP Port和UDP Port信息。
2.1Heartbeat服務(wù)的實現(xiàn)
HeartbeatService主要是以計時器為驅(qū)動的服務(wù),其中包含一個Heartbeat Info List,存儲了所有Heartbeat服務(wù)節(jié)點。
在客戶端啟動后,Heartbeat服務(wù)便開始運(yùn)行。初始化過程將遍歷 Broadcast List,對每一個CHeartbeatNode做如下處理。
1) 讀取其中的Heartbeat服務(wù)設(shè)置,通過CommManager為其創(chuàng)建CommNode數(shù)據(jù),并將此數(shù)據(jù)指針填入其中;
2) 使創(chuàng)建的CommNode中的Socket開始監(jiān)聽;
3) 將此CHeartbeatNode注冊到HeartbeatService中,開始廣播Heartbeat數(shù)據(jù)。
至此開始,HeartbeatService將伴隨著客戶端的整個生命周期,定時廣播HeartbeatData,并監(jiān)聽其他客戶端廣播的HeartbeatData,并根據(jù)前文中的處理方法處理對應(yīng)的Buddy。
當(dāng)BuddiesList更改了自身的數(shù)據(jù)后,會同時更新一個時間戳,UI部分在定時檢查BuddiesList時會檢查這個時間戳,以確定是否更新界面。
2.2數(shù)據(jù)加密
目前,網(wǎng)絡(luò)安全傳輸方案中經(jīng)典的加密方法分為對稱加密和非對稱加密兩種。對稱加密運(yùn)算速度快但容易被攻擊和破解;非對稱加密算法復(fù)雜,不易被破解,但加密速度慢,不適宜傳輸大量的安全數(shù)據(jù)。由于考慮到文件傳輸?shù)奶攸c,本文使用的是對稱加密算法。
由于本文所使用的加密算法屬于對稱加密算法,所以便需要一套較為健壯的密鑰生成算法。密鑰的生成需要以下信息:接收方IP地址:peer_ip;接收方端口:peer_port;發(fā)送方userhash:userhash;一個16位隨機(jī)數(shù):randomkey。這里用到了發(fā)送方和接收方雙方的信息,保證了信息的分散;另一方面,在一定程度上也防止了虛假Package的干擾(如果無法利用擁有的userhash正確解密Package數(shù)據(jù),則這個Package可能屬于虛假Package)。
創(chuàng)建函數(shù)首先會創(chuàng)建一個長度為18的緩沖區(qū)key_data,緩沖區(qū)將被分為三部分:
A0(13Bytes)A1(2Bytes)A2(3Bytes)
圖2緩沖區(qū)示意圖
各部分按照如下規(guī)則填充數(shù)據(jù):A0:userhash中從第3字節(jié)開始的13字節(jié)數(shù)據(jù);A1:peer_port與randomkey異或的結(jié)果;A2:peer_ip的結(jié)尾3字節(jié)數(shù)據(jù);填充完畢后生成其md5值,并根據(jù)此md5值利用RC4初始化算法KSA最終產(chǎn)生加密密鑰。
解密過程與加密過程相反,是將加密時用于創(chuàng)建密鑰的隨機(jī)數(shù)和原始數(shù)據(jù)的md5值從加密數(shù)據(jù)中獲取出來,然后根據(jù)隨機(jī)數(shù)和相關(guān)信息創(chuàng)建密鑰解密加密數(shù)據(jù),再取得解密后數(shù)據(jù)的md5值,并與原始數(shù)據(jù)的md5值比較,判斷解密過程是否成功,成功則返回解密數(shù)據(jù)。
壓縮過程和解壓縮過程是在Package中完成的,Package中設(shè)計了三個函數(shù)用于壓縮和解壓,分別是:void CPacket::PackPacket(void);bool CPacket::UnPackPacket(UINT nUnPackSize);bool CPacket::UnPackPacket(void)。壓縮過程指的是Package在發(fā)送之前將會被壓縮,當(dāng)壓縮之后的長度小于原始數(shù)據(jù)長度時,發(fā)送壓縮數(shù)據(jù),否則依然發(fā)送原始數(shù)據(jù)。解壓縮過程使用Package的兩個成員函數(shù),UnPackPacket(UINT nUnPackSize)解壓當(dāng)前Package,nUnPackSize限制了解壓后數(shù)據(jù)的最大長度,如果超過這個長度,則認(rèn)為解壓失敗。此函數(shù)同樣為解壓當(dāng)前Package,解壓方法大致相同,與上一個函數(shù)不同的是它忽略了解壓后最大長度的限制。
在對壓縮功能做測試時,使用了上述的函數(shù)對Regedit.exe進(jìn)行了壓縮和解壓,結(jié)果如下:
圖3 Regedit.exe壓縮解壓效果圖
其中,regedit_compressed.exe為regedit.exe壓縮后得到的文件,regedit_uncompressed.exe為將regedit_compressed.exe解壓后得到的文件,壓縮率約為17.22%,壓縮結(jié)果較為理想。
流量的控制目的是為了限制網(wǎng)絡(luò)傳輸時傳輸速率的上限,保證有限地使用網(wǎng)絡(luò)帶寬,防止帶寬耗盡,影響其他需要占用網(wǎng)絡(luò)帶寬的應(yīng)用程序或主機(jī)。
流量控制可以在硬件層、驅(qū)動層或者在應(yīng)用程序?qū)又型瓿伞_@里將流量控制處理放在應(yīng)用程序?qū)又?,以時間片調(diào)度的方式來實現(xiàn)。在每個時間片中,完成一組TransferTask的處理。
前文中提到當(dāng)應(yīng)用層需要發(fā)送一個Package時,它并不直接將這個Package通過相應(yīng)的受控Socket發(fā)送出去,而是將其放入BandThrottler中的任務(wù)隊列,這種任務(wù)被稱作TransferTask,通常為發(fā)送或接受一個Package。
一個TransferTask的處理流程如圖4所示。
圖4 TransferTask的處理流程
當(dāng)一個TransferTask創(chuàng)建并放入任務(wù)隊列之后,它將開始等待獲得傳輸權(quán),當(dāng)獲得了傳輸權(quán)后,它便被Task Processor從TaskQueue中提取出來進(jìn)行處理。
TaskQueue中包含兩個隊列,如圖5。
圖5 TaskQueue隊列圖
Temp Queue用于暫時存放新添加的TransferTask,相當(dāng)于應(yīng)用層和Task Queue之間的一個緩沖區(qū)。Temp Queue 和Process Queue各有一個互斥鎖,保證了各線程在同時訪問這兩個隊列時的數(shù)據(jù)安全。當(dāng)應(yīng)用層各個線程希望添加自己的任務(wù)到TaskQueue時,由于Temp Queue的互斥鎖,可以依次完成添加任務(wù);當(dāng)Process Queue由于Task Processor提取任務(wù)鎖閉時,應(yīng)用層仍可以將任務(wù)提交到Temp Queue,而不必等待Process Queue解鎖;當(dāng)Process Queue中無任何任務(wù)時,將執(zhí)行一次從Temp Queue中提取所有任務(wù)到自身的過程。
為了控制整個傳輸過程,這里將時間劃分為一個個長度相同的時間片,并為當(dāng)前的時間片計算出可以用于傳輸?shù)淖畲罅髁恐担诿總€時間片內(nèi),BandThrottler如果發(fā)現(xiàn)TaskQueue中有任務(wù),將開始執(zhí)行一個循環(huán),不斷提取TaskQueue中的每個任務(wù)并進(jìn)行處理,每次處理將會從單位時間片的最大傳輸流量值中減去此次任務(wù)執(zhí)行所需的流量,當(dāng)流量耗盡時,將停止處理并在剩余的時間內(nèi)進(jìn)入休眠,以等待下一個時間片。
為了獲得精確的系統(tǒng)時間,這里使用了timeGetTime()。經(jīng)反復(fù)測試,每個時間片(即TIME_BETWEEN_UPLOAD_LOOPS)設(shè)置在200毫秒較為適宜。
通過上面的設(shè)計,流量控制基本實現(xiàn)了其功能。
至此,主要功能的實現(xiàn)大致完成。
本文提出一種結(jié)合了加密、壓縮和流量控制的文件傳輸系統(tǒng)。使用加密來提高數(shù)據(jù)的安全性,使用壓縮來減小傳輸流量,并通過一套算法來控制傳輸過程。針對文件傳輸?shù)奶攸c,本文使用的是對稱加密方式,采用RC4算法;壓縮使用了目前較為成熟的zlib壓縮函數(shù)庫。
[1]齊治昌,譚慶平,寧洪.軟件工程[M].第2版.北京:高等教育出版社,2004.
[2]Steve McConnell.代碼大全[M].金戈,湯凌,等譯.北京:電子工業(yè)出版社,2006.
[3]謝希仁.計算機(jī)網(wǎng)絡(luò) [M].第2版.北京:電子工業(yè)出版社,1999.
[4]韓希義.計算機(jī)網(wǎng)絡(luò)基礎(chǔ) [M].北京:高等教育出版社,2004.
[5]Dr. International.國際化軟件開發(fā)[M].北京:機(jī)械工業(yè)出版社,2003.
[6]Schneier B.Applied Cryptography,Protocols.Algorithms and Source Code in Co[M].New York:John Wiley & Sons,1996.
[7]孟慶樹,王麗娜,傅建明,等.密碼編碼學(xué)與網(wǎng)絡(luò)安全原理與實踐[M].北京:電子工業(yè)出版社,2006.
[8]馬永勤,李正文,汪劉艷.基于Winsock的文件互傳[J].重慶大學(xué)學(xué)報,2004,28: 49-52.
[9]侯俊杰.深入淺出MFC[M].武漢:華中科技大學(xué)出版社,2001.
[10]孫鑫.VC++深入詳解[M].北京:電子工業(yè)出版社,2006.
[11]孔鵬.Visual C++技術(shù)手冊[M].北京:機(jī)械工業(yè)出版社,2007.
[12]王曉鵬.TCP/IP下的Socket及Winsock通信機(jī)制[J].航空計算技術(shù),2004,34: 126-128.
[13]Dana Moore,John Hebeler.對等網(wǎng)[M].北京:清華大學(xué)出版社,2003.
[14]Microsoft.Microsoft Visual C++分布式應(yīng)用程序開發(fā)(英文版)[M].北京:北京大學(xué)出版社,2001.
[15]黃強(qiáng).WINDOWS網(wǎng)絡(luò)編程[M].北京:人民郵電出版社,2003.
Research and Implementation on Network File Transmission Technology
Yan Peizhe
(XinzhouTeachersUniversity,XinzhouShanxi034000,China)
In the modern information society, information exchange and sharing appears particularly important. LAN, as a computer network terminal member, plays a crucial role in enterprises and institutions. This paper introduces the transmission technology of files in the computer network, and according to the characteristics of the local area network, it designs a more efficient and safe network file transmission system; realizes the network discovery, data real-time compression, real-time encryption, flow control and other functions.
LAN discovery; file transmission; network flow control
2016-07-05
忻州師范學(xué)院院級科研基金資助項目(201111)
閆培哲(1981- ),男,碩士,忻州師范學(xué)院計算機(jī)助教,主要研究方向為網(wǎng)絡(luò)開發(fā)、教育管理。
1674- 4578(2016)04- 0092- 03
TP 393.093
A