0 引言
隨著嵌入式設備的不斷發(fā)展,其對通信也提出了越來越高的要求。FTP(File Transfer Protocol)作為internet上最早提供的服務之一,至今仍然被人們廣泛使用,F(xiàn)TP是實現(xiàn)文件傳輸服務的最主要的規(guī)范。當需要考慮到文件傳輸安全、傳輸質量、訪問控制等諸多因素時,FTP服務器就成了解決文件傳輸問題的關鍵所在。
然而,有時嵌入式系統(tǒng)的開發(fā)環(huán)境并不支持FTP協(xié)議(如ADSP的集成開發(fā)環(huán)境Visual DSP++),在這種情況下,利用已有的LWIP堆棧中的一些基礎函數(shù)來構建一個FTP服務器,正是本文要詳細探討的話題。
1 文件傳輸過程
FTP協(xié)議與一般的Intemet協(xié)議不同。Intemet協(xié)議通常采用一個TCP連接來傳送信息(如HTTP協(xié)議);而FTP協(xié)議則采用兩個TCP連接來實現(xiàn)文件的傳輸,其中一個用來為文件傳輸下命令,另一個則實現(xiàn)真正的傳輸過程。圖1所示是FTP文件傳輸?shù)脑韴D。
客戶端想要獲取存放在服務器上的文件時,應先通過一個預定義的端口號21主動與服務器建立連接,服務器收到請求后,通過3次握手,就可在進行FTP命令處理的用戶協(xié)議解釋器(PI)和服務器協(xié)議解釋器之間建立一條TCP連接。該連接始終等待用戶和服務器之間的通信,并傳輸用戶輸入的所有FTP命令和服務器的應答,即FTP傳輸中的命令連接。
當客戶通過交互式用戶界面向FTP服務器發(fā)出要下載服務器上某一文件的命令時,該命令即被送到用戶協(xié)議解釋器,并由用戶協(xié)議解釋器進行處理。FTP將在服務器端口號20上打開一個數(shù)據TCP連接。在數(shù)據連接上傳送完本次請求需傳送的文件之后,它將關閉數(shù)據連接,直到再有文件傳送請求時再重新打開。因此,在FTP中,控制連接在整個用戶會話期間一直打開著,而數(shù)據連接則是一條臨時連接,當且僅當執(zhí)行文件傳輸過程時才被創(chuàng)建。
FTP服務器的內部結構可根據不同的需求,選擇不同的服務器模式。因為服務器模式決定著設計結構,而不同的設計結構又很大程度地影響著FTP服務器的性能。服務器的模式主要有循環(huán)服務器和并發(fā)服務器。
1.1 循環(huán)服務器
循環(huán)服務器只適應于最簡單的應用協(xié)議,它采用客戶輪流等待的工作方式。但它的設計、編程、調試和修改都比較簡單,在其響應時間可以滿足需求的條件下(這個時間可以在本地或全局網絡中進行測試),可以采用循環(huán)服務器模式。
1.2 并發(fā)服務器
如果構建一個響應需要大量的I/O操作,且各個請求所需要的處理時間差別非常大,或服務器在一臺多處理器的計算機上運行,則可引入并發(fā)性方法來縮短響應時間。大多數(shù)并發(fā)服務器使用多個進程以及多個線程。其線程可分為兩類:主服務器線程和從服務器線程。然而,在有些情況下,一些操作系統(tǒng)創(chuàng)建一個線程的開銷很大,服務器無法承擔為每個請求或每個連接都創(chuàng)建一個線程的重負時,可采用單線程的并發(fā)模式。
2 嵌入式FTP服務器的實現(xiàn)
圖2所示是以ADSP-BF537為核心的嵌入式系統(tǒng)的硬件組成框圖。圖中,基于Blackfin處理器的ADSP--BF537具有接口豐富,性能優(yōu)良,價格低廉等特點,并具有強大的多媒體數(shù)據處理能力。ADSP的集成開發(fā)環(huán)境Visual DSP++中嵌入了實時操作系統(tǒng)內核VDK,適合于多任務多線程的嵌入式操作。此外,ADI還提供了一個用于Blackfin系列嵌入式處理器的LwIP協(xié)議棧端口,利用它可以快速將一個獨立的嵌入式應用聯(lián)網。圖2中的BF537可通過網絡芯片LAN8187實現(xiàn)與上位機之間的網絡通信,同時利用自身的PPI口實現(xiàn)與存儲陣列的通信和管理。
由于系統(tǒng)中的服務器和客戶端在同一個局域網內,考慮到硬件芯片本身的特點,在文件下載時,與存儲陣列的通信只能通過同一套PPI總線,因此,較好的方式是一次只接受一個用戶的下載請求,于是可構建一個循環(huán)服務器來滿足需求。
出于安全性考慮,服務器通常只接受用戶名/密碼的登錄方式。登錄時所需的用戶名和密碼存放在存儲板中。每次收到用戶請求信息后,先從存儲板處獲得已有的用戶信息并比較,若與其中任何一個相符合,則發(fā)送接受請求信息,否則,回送拒絕信息。用戶登陸成功后,服務器會響應它的各種操作。圖3所示是FTP服務器的操作流程圖。
當用戶需要下載文件時,需先獲取文件列表。文件列表存放于存儲板中,可先由服務器向存儲板發(fā)送回送文件列表的請求,在得到響應后。再通過網絡回送給用戶,由用戶從中選擇所需下載文件的文件名,并發(fā)送給服務器。服務器收到文件名后,先判斷其所屬的文件夾,再由此向對應存儲板發(fā)送下載該文件的命令。存儲板通過PPI向管理板回送信息(在此每包數(shù)據的大小為64KB),管理板每緩存完十包數(shù)據后,將通過網絡回送給用戶。需要指出的是,一開始,在實際的下載過程中,有時文件會出現(xiàn)丟幀現(xiàn)象,而且跟網絡狀況有關。經過分析其原因是網絡速度與PPI傳輸相比過慢而導致接收緩存溢出,從而引起下載過程中的數(shù)據丟失。于是,可采取流控的下載方式。事實上,存儲板并不會一下將所有數(shù)據都連續(xù)地發(fā)送過來,而是每發(fā)送完十包以后,再等待控制板的確認包??刂瓢逯挥性趯⑺袛?shù)據都通過網路發(fā)送完畢后,才給存儲板發(fā)送確認包,以等待接收下一次的十包數(shù)據。以此循環(huán),直至下載完成。其命令處理流程圖如圖4所示。
3 結束語
在嵌入式系統(tǒng)中,依靠通信技術可以創(chuàng)造出很多十分有用的產品,本文重點介紹了一個以DSP為核心所構建的嵌入式FTP服務器的實現(xiàn)方法。且經實際檢驗,運行狀況良好。本方法對其它形式的嵌入式系統(tǒng)的FTP下載功能,也有很強的借鑒意義。