【正文】
TP的請求通常由幾行文本組成,通過TCP傳送到服務器。Listing 。第一行表明了請求類型(GET),請求對象(/)以及使用HTTP的版本(HTTP/)。請求的第二行客戶端告訴服務器能夠接收什么類型的文件。第三行包括了關于客戶端軟件的信息。請求的第四行也是最后一行通知服務器客戶端的IP地址。依照請求的類型以及應用的客戶端軟件可以寫出更多行。可以用一個空行作為請求的結尾。GET / HTTP/Accept]: image/gif, image/jpeg, */* User selling agent: Mozilla/Host: Listing : HTTP GETrequestHTTP/ 200 OKDate: Mon, 06 Dec 1999 20:55:12 GMT Server: Apache/ (Linux)Contentlength: 82Contenttype: text/htmlhtmlheadtitleTestSeite/title/headbodyTestSeite/body/htmlListing : HTTP response as result of the GETrequest from listing 作為對HTTP請求的回答主要由兩部分組成。首先有一個個別文本行的標題。跟著又一個內容對象(可選擇)。這個內容對象大概由一些文本行組成,假設是一個HTML文件或者二進制文件,這時候可以傳送GIF或JPEG格式的圖像。標題的第一行特別重要。它起著報告狀態(tài)和錯誤信息的作用。如果發(fā)生錯誤,只傳送標題或標題的一部分作為回答。2. 網(wǎng)絡服務器的功能原理簡單化一個網(wǎng)絡服務器可以被設想成像一個特殊類型的文件服務器。Picture 。網(wǎng)絡服務器從網(wǎng)絡瀏覽器接收了一個HTTP的GET請求。通過這個請求,必須有一個明確的文件作為回答(見Picture )。之后,網(wǎng)絡服務器嘗試進入被請求電腦的文件系統(tǒng)。然后嘗試找到一個需要的文件(Step2)。在成功搜尋之后,網(wǎng)絡服務器讀取整個文件(Step3),作為一個回答傳送回網(wǎng)絡瀏覽器(HTTP響應由標題和內容對象組成)。如果網(wǎng)絡服務器不能在文件系統(tǒng)中找到合適的文件,一個錯誤信息(只包含標題的HTTP響應)簡單地作為響應發(fā)送到客戶端。Figure 2: Functional principle from Web server and browser網(wǎng)絡的內容由單獨的文件構建。它的基礎是用HTML頁的靜態(tài)文件構建的。在這些HTML文件里涉及到遠程文件的嵌入。這些文件是GIF或JPEG格式的這些有代表性地圖片。然而也涉及到其它一些對象,例如可能有JAVA程序。在網(wǎng)絡瀏覽器接收到網(wǎng)絡服務器的HTML文件之后,這個文件將被評價然后為外部參考搜索?,F(xiàn)在Picture -4步將為每一個外部參考再一次運行,為了從相應的網(wǎng)絡服務器中請求各自的文件。請注意,這樣一個參考由網(wǎng)絡服務器的名字或IP地址組成(例如“”),需要文件的名字也是如此(例如“”)。所以事實上每一個參考都能夠查閱另一個服務器。換句話說,一個HTML文件能夠定位在服務器“ssv-”上,但通過這個HTML文件外部涉及到的需要的圖像定位在網(wǎng)絡服務器“”上。最后這個分離對象的網(wǎng)絡是萬維網(wǎng)(WWW)得名的原因。所有通過網(wǎng)絡服務器的必須得文件被瀏覽器請求,就像Picture 。通常這些文件被存儲在網(wǎng)絡服務器的文件系統(tǒng)中,網(wǎng)絡管理員有時會更新它們。網(wǎng)絡服務器更進一步的基本功能是我們前面提到的公共網(wǎng)關接口(CGI-Common Gateway Interface , 公共網(wǎng)關接口)。最初這項技術只應用于簡單的嵌入HTML頁的窗體。作為窗體填料結果的數(shù)據(jù)將經(jīng)HTTP-GET或POST-request被傳送到網(wǎng)絡服務器(見Picture )。在這樣一個GET-或POST-的請求中,CGI需要被窗體賦值的程序名已經(jīng)被包括進去。這個程序需要放在網(wǎng)絡服務器上。通常存儲在“/cgi-bin”目錄中。GET-或POST-請求的結果是網(wǎng)絡服務器啟動位于“/cgi-bin”目錄中的CGI程序,根據(jù)參數(shù)傳遞標準的數(shù)據(jù)(Step2)。一個CGI程序的輸出導向到網(wǎng)絡服務器(Step3)。然后網(wǎng)絡服務器把數(shù)據(jù)全部傳送到網(wǎng)絡瀏覽器作為響應(Step4)。3. 動態(tài)產(chǎn)生HTML頁與一個公司通過靜態(tài)頁面和圖片告訴人們有關產(chǎn)品計劃和服務的網(wǎng)頁相反,一個嵌入式的網(wǎng)絡服務器能夠提供動態(tài)產(chǎn)生的內容。它將在首先通過瀏覽器進入的時候產(chǎn)生動態(tài)頁面。如何另外通過Internet檢查系統(tǒng)的實際溫度?靜態(tài)HTML文件對一個嵌入式的網(wǎng)絡服務器來說沒有什么意思。最多關于固件的版本和服務的信息是通過HTML格式存儲的。另外所有其它的任務通常都是由動態(tài)產(chǎn)生HTML完成的。在請求的時刻有兩種產(chǎn)生HTML頁的不同技術:第一種是所謂的服務器方腳本,第二種是CGI設計。在服務器方腳本中,腳本代碼嵌入到HTML頁中。如果需要,這些代碼將在服務器方被執(zhí)行。因此,有許多種可以提供的腳本語言,這些語言在HTML頁中都可用。在Linux團體中主要使用PHP(PHP:一種新型的CGI網(wǎng)絡程序編寫語言。)。微軟中意的是VBScript。在HTML頁中插入JAVA同樣可能。美國的Sun公司將這種技術命名為JSP。用腳本代碼編寫的網(wǎng)頁靜態(tài)地存儲在網(wǎng)絡服務器的文件系統(tǒng)之中。在服務器的文件被傳送到客戶端之前,一段特殊的程序用動態(tài)產(chǎn)生的標準HTML取代整個腳本代碼。而網(wǎng)絡瀏覽器在腳本語言中將什么也看不到。Figure 3: Single steps of the ServerSideScriptingPicture 3展示了服務器方腳本的簡單步驟。第一步中網(wǎng)絡瀏覽器經(jīng)HTTP的GET-request請求一個明確的HTML文件。網(wǎng)絡服務器認可需要文件的明確的擴展名(例如用*.ASP或*.PHP代替*.HTM或*.HTML),然后啟動一個腳本引擎(見Step2)。這段程序得到需要的包括文件系統(tǒng)得到的腳本代碼在內的HTML文件(Step3),執(zhí)行腳本代碼,制造一個新的不用腳本代碼的HTML文件(Step4)。包括的腳本代碼將被動態(tài)產(chǎn)生的HTML所代替。這個新的HTML文件將被網(wǎng)絡服務器讀入(Step5),然后發(fā)送給網(wǎng)絡瀏覽器(Step6)。如果服務器方腳本被期望用于嵌入式網(wǎng)絡服務器,那么你不得不考慮必要的附加資源。一個簡單的例子:為了執(zhí)行在一個網(wǎng)頁中嵌入PHP代碼,必須為服務器附加程序模塊。一個腳本引擎和嵌入式網(wǎng)絡服務器被存儲在嵌入式系統(tǒng)的閃存芯片中。有了這些,執(zhí)行期間需要更多的內存。4. Linux下網(wǎng)絡服務器的運行一旦談起關于網(wǎng)絡服務器在和Linux連接中的問題,大部分人馬上想到了Apache。在Netcraft Survey的調查之后,全世界的網(wǎng)絡服務器主要使用了這種程序。Apache是對傳說中的NCSA服務器的增進。Apache(Apache-美洲印第安人的一種族)的名字與印第安人無關。它是從“A Patchy Server”構造而來,因為第一個版本由不同的代碼和補丁文件裝配起來。此外還有許多其它的網(wǎng)絡服務器——甚至是對于Linux的。這些服務器的大多數(shù)固定在GPL(類似Apache)之下,可以免費使用。更為廣泛的內容可以參見“://”。每一個網(wǎng)絡服務器都有其優(yōu)缺點。一些擁有明確的功能和特殊的性質;一些對同時發(fā)生的請求通過它們的反應速度達到最好的辨別,像它們對配置設定的變化;另外一些設計用于需要最小的資源和提供非常小的設置可能性,像只有一個客戶的連接。對一個嵌入式網(wǎng)絡服務器來說最重要的事情是實際資源的需求。有時嵌入式系統(tǒng)只提供最小的資源,主要與Linux共享。其間有許多高性能的32位386/486微控制器或基于ARM的擁有8M RAM和2M Flash-ROM的嵌入式系統(tǒng)(Picture 4)。從這個ROM(只讀存儲器,例如閃存芯片)將被導入一個完全的Linux,有TCP/IP協(xié)議層和網(wǎng)絡服務器。HTML頁和程序同樣存在ROM中用來產(chǎn)生網(wǎng)頁。一個嵌入式系統(tǒng)的空間需求與一張小的大郵票相似。很好理解它沒有位置給一個像Apache一樣強大的網(wǎng)絡服務器。Figure 4: Embedded Web Server Module with StrongARM and Linux一個Apache的容量幾乎同樣如此。它不需要通過網(wǎng)絡服務器和瀏覽器形象化一個影印機的計數(shù)器或一個過濾器的狀態(tài)。在許多情況下一個單一的網(wǎng)絡服務器就足夠了。兩個典型的代表是boa()和td( )。起初,兩個網(wǎng)絡服務器都用于和運行在Linux下的嵌入式系統(tǒng)連接。boa和td的結構設置比較簡陋,但卻足夠了。順便說一下,它們的源代碼對用戶是開放的。這些服務器上可執(zhí)行的二進制文件總是小于80k,能夠沒有問題的整合到大多數(shù)嵌入式系統(tǒng)中。對于網(wǎng)頁的動態(tài)產(chǎn)生,兩個服務器都只提供了CGI作為增補。更高的技術,像SSI則沒有提供。嵌入式網(wǎng)絡服務器和Apache很大的差別在于,相對有限構造設置,同時發(fā)生請求數(shù)量的最大可能。高性能的服務器像Apache立即為每一個引入的客戶端請求制造一個自己的過程。在這個過程里所有進一步的步驟都將被執(zhí)行。這需要在運行期間擁有一個非常好的規(guī)劃和大量的空余內存資源。但是另一方面,許多網(wǎng)絡瀏覽器能夠同時進入這樣一個網(wǎng)絡服務器中。嵌入式網(wǎng)絡服務器像boa和td只工作于一個單一的過程。如果兩個用戶同時需要進入一個嵌入式網(wǎng)絡服務器,其中之一則不得不等待片刻。但是在嵌入式系統(tǒng)的環(huán)境中這是完全有理由的。這種情況首先是一個遠程保持、遠程配置和相似任務的問題。想來也不會有那么多同時的請求吧。圖的明細表:圖一:TCP/IP層和HTTP設計模型圖二:來自網(wǎng)絡服務器和瀏覽器的功能原理圖三:服務器方腳本的單步圖四:以強大的ARM和Linux的嵌入式網(wǎng)絡服務器清單列表:1. A:HTTP的GET請求1. B:利用嵌入式Linux的數(shù)字集成邏輯(DIL)/網(wǎng)絡計算機(NetPCs)DNP/1110