史孝波周松斌黃東運(yùn)程韜波
(1.廣東工業(yè)大學(xué) 2.廣東省自動(dòng)化研究所)
一種基于UDP的文件獲取協(xié)議的實(shí)現(xiàn)*
史孝波1,2周松斌2黃東運(yùn)2程韜波2
(1.廣東工業(yè)大學(xué) 2.廣東省自動(dòng)化研究所)
文件傳輸協(xié)議(file transfer protocol,F(xiàn)TP)是網(wǎng)絡(luò)傳輸文件的常用協(xié)議,內(nèi)容較復(fù)雜。由于采用了傳輸控制協(xié)議(transport control protocol,TCP)提供的可靠傳輸服務(wù),使用FTP傳輸文件時(shí)經(jīng)常出現(xiàn)數(shù)據(jù)延遲問(wèn)題。為此提出一種文件獲取協(xié)議(file obtain protocol,F(xiàn)OP)。FOP底層傳輸使用用戶(hù)數(shù)據(jù)報(bào)協(xié)議(user datagram protocol,UDP),無(wú)需非常復(fù)雜的傳輸模型即可實(shí)現(xiàn)在網(wǎng)絡(luò)上傳輸包括音視頻在內(nèi)的多類(lèi)型文件。同時(shí)介紹了FOP的工作原理和實(shí)現(xiàn)方法,編寫(xiě)了基于FOP協(xié)議的客戶(hù)和服務(wù)器軟件。
FOP;文件傳輸;UDP;傳輸協(xié)議
21世紀(jì)人類(lèi)社會(huì)已經(jīng)進(jìn)入了一個(gè)以計(jì)算機(jī)網(wǎng)絡(luò)為核心的信息化時(shí)代[1]。使用Internet提供的服務(wù),人們能夠方便地訪(fǎng)問(wèn)大量的信息。FTP是網(wǎng)絡(luò)文件傳輸?shù)某S脜f(xié)議,通過(guò)兩個(gè)并發(fā)的TCP連接來(lái)完成網(wǎng)絡(luò)通信。FTP內(nèi)部協(xié)議命令數(shù)目繁多,實(shí)現(xiàn)起來(lái)較為復(fù)雜?;赥CP的應(yīng)用程序必須使用TCP所提供的可靠性、順序交付等服務(wù),應(yīng)用程序不能要求TCP去關(guān)閉某些不需要的功能,無(wú)論應(yīng)用程序是否需要,TCP都要強(qiáng)制使用。在效率高于可靠性的應(yīng)用中,要求數(shù)據(jù)盡量在主機(jī)之間流動(dòng),允許偶爾的數(shù)據(jù)丟失,但無(wú)法容忍由于可靠性帶來(lái)的延遲。對(duì)這些程序,TCP提供的可靠性、順序交付等不僅毫無(wú)價(jià)值,而且還會(huì)影響程序的正常行為。
基于以上問(wèn)題,本文提出了一種文件獲取協(xié)議FOP。該協(xié)議具有易于實(shí)現(xiàn)、安全穩(wěn)定的特點(diǎn),適合于傳輸多種類(lèi)型的文件。以Visual Studio 2005為平臺(tái),編寫(xiě)基于FOP協(xié)議的客戶(hù)和服務(wù)器軟件。通過(guò)網(wǎng)絡(luò)通信實(shí)例,進(jìn)一步闡述FOP協(xié)議的原理、特點(diǎn)和實(shí)現(xiàn)方法。
1.1 UDP客戶(hù)/服務(wù)器程序模型
與FTP采用TCP連接來(lái)完成數(shù)據(jù)傳輸?shù)姆绞讲煌?,F(xiàn)OP在傳輸層采用UDP協(xié)議。UDP為FOP的設(shè)計(jì)提供了基本的數(shù)據(jù)報(bào)傳輸機(jī)制。
UDP客戶(hù)/服務(wù)器程序模型如圖1所示。
圖1 UDP客戶(hù)/服務(wù)器程序模型
服務(wù)器創(chuàng)建socket之后,調(diào)用bind綁定本地地址,接收數(shù)據(jù)時(shí)調(diào)用函數(shù)recvfrom。recvfrom可以接收到達(dá)本地端口的任何數(shù)據(jù),并保存數(shù)據(jù)發(fā)送方的地址。服務(wù)器把應(yīng)答數(shù)據(jù)通過(guò)這個(gè)地址發(fā)送給客戶(hù)端??蛻?hù)端與服務(wù)器通信之前不需要建立連接,直接調(diào)用函數(shù)sendto發(fā)送數(shù)據(jù),函數(shù)sendto在參數(shù)中已經(jīng)指明了數(shù)據(jù)接收地址。
采用UDP模型的應(yīng)用程序發(fā)送數(shù)據(jù)之前,不需要建立連接。數(shù)據(jù)發(fā)送完成后,也不用終止連接。只要應(yīng)用程序有數(shù)據(jù),就直接發(fā)送,沒(méi)有連接建立、維護(hù)、終止所帶來(lái)的開(kāi)銷(xiāo)。由此給程序的設(shè)計(jì)帶來(lái)了靈活性和效率的提升。但是UDP也是不可靠的,對(duì)發(fā)送的數(shù)據(jù),并不保證對(duì)方一定會(huì)收到,即使收到了也沒(méi)有確認(rèn)。FOP的消息傳遞過(guò)程被設(shè)計(jì)為兩個(gè)階段來(lái)保證數(shù)據(jù)的重傳及確認(rèn),解決可靠性問(wèn)題。第一階段,由客戶(hù)發(fā)出“內(nèi)容發(fā)起請(qǐng)求”消息,服務(wù)器收到客戶(hù)消息后,向客戶(hù)發(fā)出“內(nèi)容發(fā)起請(qǐng)求回應(yīng)”消息;第二階段,客戶(hù)向服務(wù)器發(fā)出“請(qǐng)求進(jìn)行內(nèi)容傳送”消息,服務(wù)器收到客戶(hù)消息后,發(fā)出“進(jìn)行內(nèi)容傳送”消息。FOP消息傳遞流程如圖2所示。
圖2 FOP消息傳遞流程圖
1.2 FOP消息結(jié)構(gòu)定義
FOP消息結(jié)構(gòu)包括:FOP消息頭和FOP消息體兩部分。消息頭包括協(xié)議標(biāo)識(shí)、應(yīng)用標(biāo)識(shí)、命令標(biāo)識(shí)、內(nèi)容類(lèi)型等多個(gè)字段,固定為4個(gè)字節(jié)長(zhǎng)度;消息體為傳輸數(shù)據(jù)的具體內(nèi)容。每個(gè)字段的描述如表1所示(消息體只列舉了許可碼和數(shù)據(jù)包數(shù)量的定義)。
表1 FOP消息結(jié)構(gòu)定義
FOP使用UDP作為底層傳輸協(xié)議。UDP位于網(wǎng)絡(luò)通信協(xié)議族的第三層,默認(rèn)使用IP作為下一層的傳輸協(xié)議。網(wǎng)絡(luò)傳輸?shù)倪^(guò)程中,F(xiàn)OP消息被封裝在IP數(shù)據(jù)報(bào)中,如圖3所示。
圖3 封裝了FOP消息的IP數(shù)據(jù)報(bào)
消息體裝載客戶(hù)請(qǐng)求的數(shù)據(jù)內(nèi)容,長(zhǎng)度不定。數(shù)據(jù)內(nèi)容由各種類(lèi)型的字段組成,每個(gè)字段用來(lái)表示不同的內(nèi)容。例如表1中的許可碼和數(shù)據(jù)包數(shù)量。字段標(biāo)記占用1個(gè)字節(jié),每個(gè)字段開(kāi)始必須由對(duì)應(yīng)的1個(gè)字段結(jié)束。消息體的內(nèi)容長(zhǎng)度分為定長(zhǎng)和不定長(zhǎng)兩種。當(dāng)消息體的內(nèi)容是不定長(zhǎng)時(shí),還有長(zhǎng)度標(biāo)記,長(zhǎng)度標(biāo)記占2個(gè)字節(jié)。
1.3 FOP傳輸數(shù)據(jù)表示
通過(guò)對(duì)不同數(shù)據(jù)類(lèi)型的編解碼,F(xiàn)OP實(shí)現(xiàn)了傳輸數(shù)據(jù)類(lèi)型的多種選擇??蛻?hù)從服務(wù)器下載文件時(shí),既可使用默認(rèn)的文本類(lèi)型,也可選擇其它文件類(lèi)型。FOP支持文本、富文本、圖像、動(dòng)畫(huà)、音視頻這5種文件類(lèi)型。
目前FOP協(xié)議只支持文件式結(jié)構(gòu),即傳輸?shù)奈募袥](méi)有內(nèi)部結(jié)構(gòu),文件的數(shù)據(jù)內(nèi)容以二進(jìn)制流的方式傳輸。FOP支持多包發(fā)送,如果客戶(hù)請(qǐng)求的內(nèi)容在編碼后的長(zhǎng)度大于一個(gè)數(shù)據(jù)包所許可的最大長(zhǎng)度,將拆分傳送。在文件的傳輸過(guò)程中,F(xiàn)OP一次支持傳送的數(shù)據(jù)包大小為1kb,最大數(shù)據(jù)包數(shù)量為65535個(gè)。
1.4 FOP的安全策略
FOP的安全策略是通過(guò)采用UDP作為底層傳輸協(xié)議,設(shè)置客戶(hù)的操作權(quán)限以及增加許可碼功能來(lái)實(shí)現(xiàn)的。
FOP底層的傳輸協(xié)議使用UDP。在開(kāi)始傳輸數(shù)據(jù)之前不需要建立TCP連接,避免了連接模式帶來(lái)的安全隱患。連接模式的安全隱患體現(xiàn)在:連接一旦被黑客攻擊,防火墻將不會(huì)有任何動(dòng)作去處理這個(gè)連接。因?yàn)檫B接是由服務(wù)器本身向外發(fā)出的。
通過(guò)軟件設(shè)計(jì),可以指定用戶(hù)對(duì)FOP服務(wù)器文件的操作權(quán)限。例如設(shè)置用戶(hù)“只讀”權(quán)限,即用戶(hù)只能從服務(wù)器下載文件,從而限制非法用戶(hù)對(duì)服務(wù)器文件的篡改。
FOP服務(wù)器在接收客戶(hù)的文件獲取請(qǐng)求時(shí),要求客戶(hù)提供許可碼。許可碼是服務(wù)器隨機(jī)生成的一組16位字符串,內(nèi)容包括大小寫(xiě)字母和數(shù)字,如圖4所示。在每次傳輸數(shù)據(jù)前,客戶(hù)通過(guò)第三方途徑(如手機(jī)短信、QQ等)得到服務(wù)器的許可碼。收到客戶(hù)的獲取文件請(qǐng)求時(shí),F(xiàn)OP服務(wù)器驗(yàn)證客戶(hù)的許可碼。對(duì)許可碼不正確的客戶(hù),服務(wù)器將認(rèn)為是非法客戶(hù),其請(qǐng)求不做處理。
圖4 FOP服務(wù)器生成的16個(gè)許可碼
依照FOP協(xié)議規(guī)范,以Visual Studio 2005為平臺(tái),編寫(xiě)了基于FOP協(xié)議的客戶(hù)與服務(wù)器軟件。
2.1 軟件設(shè)計(jì)流程
FOP的軟件設(shè)計(jì)分為客戶(hù)程序設(shè)計(jì)和服務(wù)器程序設(shè)計(jì)兩個(gè)部分,如圖5所示。
圖5 FOP軟件設(shè)計(jì)流程圖
客戶(hù)程序的主要任務(wù)是從服務(wù)器下載資源文件。首先客戶(hù)端初始化,創(chuàng)建socket套接字。初始化成功后,向服務(wù)器發(fā)送預(yù)請(qǐng)求命令“CMD_PRE_CONTENT_REQUEST”。由于FOP使用Winsock編程,如果程序不確定有數(shù)據(jù)到來(lái)就調(diào)用recvfrom,則該套接字線(xiàn)程就會(huì)進(jìn)入阻塞狀態(tài)。解決套接字線(xiàn)程阻塞的辦法是調(diào)用select,select在監(jiān)測(cè)緩沖區(qū)后,會(huì)立刻返回,然后給出返回值。這樣程序就可以繼續(xù)其它操作,而不會(huì)陷入阻塞狀態(tài)。當(dāng)客戶(hù)收到服務(wù)器的響應(yīng)后,發(fā)送數(shù)據(jù)請(qǐng)求命令“CMD_REQUEST_DELIVERY”,繼續(xù)進(jìn)入監(jiān)測(cè)狀態(tài),直到有數(shù)據(jù)到來(lái),將數(shù)據(jù)保存到指定的位置。
服務(wù)器程序的主要任務(wù)是為客戶(hù)提供下載資源,響應(yīng)客戶(hù)程序的命令,傳輸數(shù)據(jù)。服務(wù)器程序也使用Winsock編程,程序流程與客戶(hù)程序的流程類(lèi)似。服務(wù)器初始化成功后,開(kāi)始等待客戶(hù)的命令。當(dāng)收到客戶(hù)的預(yù)請(qǐng)求命令后,發(fā)送命令“CMD_PRE_CONT ENT_REQUEST_ACK”來(lái)響應(yīng)客戶(hù)的請(qǐng)求,否則調(diào)用select函數(shù)來(lái)繼續(xù)等待客戶(hù)發(fā)送的命令。當(dāng)服務(wù)器收到客戶(hù)的數(shù)據(jù)請(qǐng)求命令后,將數(shù)據(jù)發(fā)送給客戶(hù),發(fā)送完成后,關(guān)閉套接字。
2.2 通信測(cè)試實(shí)驗(yàn)
通信測(cè)試實(shí)驗(yàn)在Windows XP Professional操作系統(tǒng)上進(jìn)行,硬件基本配置:Intel(R) Core(TM)i3 CPU 2.39 GHz,1.92 GB內(nèi)存。通過(guò)從FOP服務(wù)器下載一個(gè)音視頻文件來(lái)說(shuō)明通信測(cè)試過(guò)程。
在服務(wù)器窗口,點(diǎn)擊“運(yùn)行”按鈕,“運(yùn)行”兩字變?yōu)椤胺?wù)器已經(jīng)運(yùn)行”,表明服務(wù)器成功啟動(dòng)。為服務(wù)器加載文本、圖像、動(dòng)畫(huà)等資源文件,F(xiàn)OP服務(wù)器加載資源文件后如圖6所示。
圖6 加載了資源文件的FOP服務(wù)器
創(chuàng)建服務(wù)器成功后,啟動(dòng)客戶(hù)端。在客戶(hù)端IP地址欄輸入服務(wù)器的地址“192.168.0.100”,端口號(hào)選擇“9158”,下載的文件類(lèi)型選擇“音視頻”。點(diǎn)擊“請(qǐng)求資源”按鈕,此時(shí)會(huì)彈出“另存為”的窗口。把文件保存在指定位置,這時(shí)音視頻文件playgame.flv便成功地從FOP服務(wù)器下載到了客戶(hù)端。
打開(kāi)從FOP服務(wù)器下載的音視頻文件,文件內(nèi)容完整清晰。選擇不同的下載文件類(lèi)型,進(jìn)行了文本、圖像等其它類(lèi)型文件的通信實(shí)驗(yàn)。并調(diào)用TRACE函數(shù),跟蹤了數(shù)據(jù)包的傳送情況,結(jié)果統(tǒng)計(jì)如表2所示。
表2 FOP傳送各類(lèi)文件統(tǒng)計(jì)表
由于FOP一次支持傳送的數(shù)據(jù)包大小為1kb,最大數(shù)據(jù)包數(shù)量為65535個(gè)。觀察表2中的數(shù)據(jù)可以看出,在文件傳輸過(guò)程中,沒(méi)有出現(xiàn)丟包狀況,證明使用FOP協(xié)議傳輸文件是可靠的。
與傳統(tǒng)的用FTP實(shí)現(xiàn)網(wǎng)絡(luò)文件傳輸?shù)霓k法相比,F(xiàn)OP文件獲取協(xié)議更易理解和掌握。基于FOP協(xié)議的應(yīng)用程序無(wú)需建立復(fù)雜的傳輸模型即可實(shí)現(xiàn)互相交換消息,而且其底層使用UDP作為數(shù)據(jù)傳輸協(xié)議,沒(méi)有連接建立、維護(hù)、終止所帶來(lái)的開(kāi)銷(xiāo),能夠達(dá)到較高的通信效率,適合于對(duì)效率要求較高的場(chǎng)合,如圖像傳送和廣播消息等。FOP協(xié)議同樣對(duì)開(kāi)發(fā)實(shí)時(shí)的語(yǔ)音傳輸、多媒體應(yīng)用等具有一定的借鑒意義。
[1] 趙強(qiáng).基于FTP協(xié)議的文件傳輸服務(wù)器的研究[D].大連:大連海事大學(xué),2008.
[2] 孫韓林,金躍輝,高雪松,等.FTP協(xié)議的測(cè)試及分析[J].計(jì)算機(jī)工程,2008,34(23):133-138.
[3] 張會(huì)勇.WinSock網(wǎng)絡(luò)編程經(jīng)絡(luò)[M].北京:電子工業(yè)出版社,2012:41-51.
[4] 李祥.基于Web的網(wǎng)絡(luò)文件管理系統(tǒng)的研究與實(shí)現(xiàn)[D].蘭州:蘭州大學(xué),2010.
A Realization of File Obtain Protocol Based on UDP
Shi Xiaobo1,2Zhou Songbin2Huang Dongyun2Cheng Taobo2
(1.Guangdong University of Technology 2.Institute of Automation, Guangdong)
The File Transfer Protocol is a common protocol for file transfer in network, but the contents of FTP is complicated. FTP has often data transmission delay problem when transferring files, this is due to FTP uses the service provided by Transport Control Protocol. Therefore this paper presents a File Obtain Protocol. FOP uses User Datagram Protocol as the underlying transport protocol, FOP can transfer multiple types of files without complicated transmission model, these files include audio, video and so on. This paper introduces the working principle and realization method of the FOP,and the client software and server software based on FOP.
FOP; File Transfer; UDP; Transfer Protocol
史孝波,男,1986年生,研究生,研究方向:網(wǎng)絡(luò)化測(cè)控。E-mail: shixiaobo987@126.com
周松斌,男,1978年生,副研究員,研究方向:網(wǎng)絡(luò)化測(cè)控。
黃東運(yùn),男,1975年生,碩士,研究方向:機(jī)器視覺(jué)、圖像識(shí)別。
程韜波,男,1964年生,研究員,研究方向:復(fù)雜系統(tǒng)和智能控制。