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