王 棟
(西安電子科技大學 電子信息攻防對抗與仿真重點實驗室,陜西 西安 710071)
一種簡易Web服務器的設計與實現(xiàn)
王棟
(西安電子科技大學 電子信息攻防對抗與仿真重點實驗室,陜西 西安710071)
摘要文中基于Linux操作系統(tǒng),介紹了在Linux下實現(xiàn)Web服務器的一種方法。通過對HTTP協(xié)議的分析,給出了Web服務器的實現(xiàn)細節(jié)。在一個局域網中,將此Web服務器程序運行在一臺裝有Ubuntu Linux的電腦上,并通過局域網中其他計算機上的瀏覽器正常訪問,驗證了文中所實現(xiàn)的Web服務器的正確性。
關鍵詞Linux;HTTP;Web服務器
Design and Implementation of a Simple Web Server
WANG Dong
(Key Laboratory of Electronic Information Countermeasure and Simulation,Xidian University,Xi’an 710071,China)
AbstractThis paper describes the detailed implementation of a web server under Linux with the HTTP protocol.This web server program running on a computer with Ubuntu Linux can be normally accessed by other computer in the LAN,thus verifying the correctness of this Web server.
KeywordsLinux;HTTP;Web server
Linux操作系統(tǒng)自1991年誕生以來,由于其安全性好且成本低,而被越來越多的服務器、工作站以及個人電腦使用[1]?;贚inux以上優(yōu)點,本文選擇在Ubuntu環(huán)境下實現(xiàn)一個簡單的Web服務器。
1設計流程
本文在一臺裝有Ubuntu的電腦上實現(xiàn)Web服務器。并通過網線將此電腦連接在與其他電腦在一起的局域網中,當此電腦的Web服務器開始運行后,局域網中的其他電腦可以通過各自的瀏覽器訪問服務器的Web頁面,如圖1所示。
圖1 環(huán)境搭建
應用層協(xié)議HTTP是Web的核心。HTTP協(xié)議在Web的客戶端程序和服務器程序中得以實現(xiàn),運行在不同系統(tǒng)上的客戶端程序和服務器程序,通過HTTP得到信息的交流。
HTTP協(xié)議是基于客戶端/服務器之間的請求響應進行交互的。一個客戶端與服務器建立連接后,發(fā)送一個請求給服務器,請求方式的格式為:統(tǒng)一資源標識符、協(xié)議版本號等。服務器接收到客戶端的請求后向客戶端發(fā)送響應的響應信息。如圖2所示,是一個客戶端和服務器之間的HTTP協(xié)議訪問基本過程。
在Internet上,HTTP通信通常發(fā)生在TCP/IP連接之上[2]。默認端口是TCP協(xié)議的80端口,本文的端口號設為8080。HTTP只能在TCP協(xié)議的基礎上進行傳輸。
圖2 客戶端和服務器之間的HTTP請求響應過程
HTTP協(xié)議的C/S模式的信息交換過程分為:建立連接、發(fā)送請求信息、發(fā)送響應信息、關閉連接4個過程。(1)建立連接。連接的建立是通過申請?zhí)捉幼?Socket)實現(xiàn)的;(2)發(fā)送請求。打開一個連接后,客戶端把請求消息送到服務器的監(jiān)聽端口上,完成請求操作。請求常用的方法有GET和POST,GET方法會將請求參數(shù)放在URL中,而POST方法不會放到URL中這樣比較安全;(3)發(fā)送響應。服務器在處理完客戶的請求之后,要向客戶端發(fā)送響應消息。響應頭信息包括:服務程序名、通知客戶請求的URL需要認證、請求的資源核實能使用;(4)關閉連接。客戶和服務器雙方都可以通過關閉套接字來結束TCP/IP對話。
本文設計的Web服務器使用的是并發(fā)服務器,即多個用戶可同時訪問本Web服務器。如圖3所示,主父進程調用函數(shù)Socket()[3]函數(shù)建立套接字文件描述符,調用函數(shù)Bind()綁定地址,調用Listen()函數(shù)來設定偵聽隊列長度。然后主進程進入主處理進程,等待客戶端連接的到來。當客戶端的連接請求到來時,服務器的Accept()[4]成功返回,此時服務器端進行進程分叉,父進程繼續(xù)等待客戶端的連接請求;而子進程則處理客戶端的業(yè)務請求,接收客戶端的數(shù)據(jù),分析數(shù)據(jù)并返回結果。
圖3 服務器結構
(1)Socket()。由于應用層協(xié)議HTTP的傳輸層使用的是TCP協(xié)議,使用Socket(AF_INET,SOCK_STREAM,0)建立套接字;
(2)Bind()。將地址信息和申請的套接字綁定起來,這里使用IP地址為服務器任意IP地址,端口號使用8080。
sin.sin_family=AF_INET;
sin.sin_port=htons(8080);
sin.sin_addr.s_addr=htons(INADDR_ANY);
bzero(&(sin.sin_zero),8);
bind(httpd,(struct sockaddr *)&sin,sizeof(struct sockaddr));
(3)listen()。偵聽端口,這里設置為20;
(4)accept()??蛻舳诉B接到了服務器,這個函數(shù)會返回一個套接字文件描述符,使用這個文件描述符便可與客戶機進行數(shù)據(jù)交互了;
(5)fork()。由于子進程完全復制父進程里的數(shù)據(jù),所以處理數(shù)據(jù)部分交給子進程處理,減輕父進程處理數(shù)據(jù)壓力;
(6)數(shù)據(jù)處理部分。首先客戶機會通過瀏覽器發(fā)送一個GET請求,服務器接收到此數(shù)據(jù)后,首先判斷客戶端請求的是否為GET方法,若是,則進一步判斷請求的文件是否存在;若存在,則根據(jù)客戶端的請求發(fā)送對應的數(shù)據(jù)內容。如圖4所示。
圖4 數(shù)據(jù)處理部分
響應信息是對請求的回應,在HTTP響應信息中包括4個部分:狀態(tài)行、響應頭標、空行和響應數(shù)據(jù)。響應信息的狀態(tài)行格式為[5]:
HTTP-Version Status-Code Reason-Phrase CRLF
其中各個字段的含義如下
HTTP-Version:代表向客戶端表示當前服務器可處理的最高協(xié)議版本。
Status-Code:代表3為的響應代碼,指出本次請求的結果是成功或失敗,如果失敗則指出響應的原因。
Reason-Phrase:為響應代碼作進一步解釋。
例如,在響應信息HTTP/1.1 200 OK中,HTTP/1.1代表服務器端所支持的協(xié)議版本號為HTTP/1.1;200代表請求成功;OK是200的進一步解釋[6]。響應碼信息如表1所示。
表1 響應碼信息
發(fā)送完響應頭信息,便可向客戶端發(fā)送數(shù)據(jù)內容了。若成功,本文發(fā)送的頭的信息為:
HTTP/1.1 200 OK
Server:WDServer
Content-Type:text/html;charset=utf-8
接下來就是HTML文檔了。HTML(Hypertext Marked Language)即超文本標記語言,是一種用來制作超文本文檔的簡單標記語言。在瀏覽網頁時,看到的一些豐富的影像、文字、圖片等內容都是通過HTML表現(xiàn)出來的。用HTML編寫的超文本文檔被稱作HTML文檔,其能獨立于各種操作系統(tǒng)平臺,移植被用作WWW的信息表示語言。在HTML中,每個用來作為標簽的符號都是一條命令、其告訴瀏覽器如何顯示文本。這些標簽均由”<”和”>”符號,以及一個字符串組成。而瀏覽器的功能是對這些標記進行解釋后,顯示出文字、圖像、動畫等效果[7]。而本文只是實現(xiàn)一個Web服務器,故只寫一個簡單HTML[8]文檔來驗證服務器的功能。
本文發(fā)送的HTML文檔內容為:
如上所示,瀏覽器會將此代碼轉化成頁面的標題為wd’ HomePage,內容為“Hello! I’m Web Server”的頁面。若在測試時看到此頁面則說明Web服務器工作正常。
2運行和測試
本文利用在Ubuntu下運行Web Server 服務器端程序,然后在其他客戶端的瀏覽器地址上輸入服務器端的IP地址,通過返回過來的頁面內容判斷其運行的正確性。測試步驟如下:
(1)在服務器端運行服務器端程序,等待客戶端的連接。如圖5所示,可看出Web Server的IP地址為219.245.66.116。
圖5 Web服務器開始運行
(2)由于此服務器設置的端口是8080端口,所以在客戶機瀏覽器中輸入219.245.66.116:8080。如圖6所示,可看出服務器端得到了響應,也能在服務器端看出接進來的服務器的IP地址為219.245.66.83,所使用的端口號分別為58050,58051和58052。并看到瀏覽器顯示的頁面,內容為“Hello! I’m Web Server!”標題為wd’s HomePage,說明此服務器工作正常。
圖6 客戶機通過瀏覽器連接服務器
3結束語
本文通過提出基于Linux的Web服務器的設計思路,采用Linux C語言編程,滿足了實現(xiàn)HTTP請求響應的要求。尤其是其開源特性,使得諸多公司或個人均喜歡將其作為開發(fā)平臺。再加上Linux具有較強的移植性,可將其移植到ARM,PowerPC,MIPS等主流處理器中[9]。所以也可將本文所實現(xiàn)的Web服務器應用到基于這些處理器的嵌入式設備當中。
參考文獻
[1]鳥哥.鳥哥的Linux私房菜:基礎學習篇[M].3版.北京:人民郵電出版社,2010.
[2]宋敬彬,孫海濱.Linux網絡編程[M].2版.北京:清華大學出版社,2014.
[3]RichardStevensW,StephenARago.Unix環(huán)境高級編程[M].3版.戚正偉,張亞英,尤晉元,譯.北京:人民郵電出版社,2014.
[4]NeilMatthew,RichardStones.Linux程序設計[M].4版.陳健,宋健建,譯.北京:人民郵電出版社,2010.
[5]劉冰,趙廷濤,邵文豪,等.LinuxC程序基礎與實例講解[M].北京:清華大學出版社,2009.
[6]DavidGourley,BrianTotty,MarjorieSayer,etal.HTTP權威指南[M].陳娟,趙振平,譯.北京:人民郵電出版社,2012.
[7]高洛峰.細說PHP[M].北京:電子工業(yè)出版社,2009.
[8]JonDuckett.Web編程入門經典-HTML.XHTML和CSS[M].2版.杜靜,敖富江,譯.北京:清華大學出版社,2010.
[9]韋東山.嵌入式Linux應用開發(fā)完全手冊[M].北京:人民郵電出版社,2008.
作者簡介:王棟(1990—),男,碩士研究生。研究方向:Linux系統(tǒng)應用。
收稿日期:2015- 05- 13
中圖分類號TP316.85
文獻標識碼A
文章編號1007-7820(2016)01-121-04
doi:10.16180/j.cnki.issn1007-7820.2016.01.033