Mongoose源碼剖析:外篇之web服務(wù)器 收藏
引言 在深入Mongoose源碼剖析之前,我們應(yīng)該清楚web服務(wù)器是什么?它提供什么服務(wù)?怎樣提供服務(wù)?使用什么協(xié)議?客戶端如何唯一標(biāo)識(shí)web服務(wù)器的資源?下面我們拋開(kāi)Mongoose,來(lái)介紹一個(gè)web服務(wù)的這些通性。 web服務(wù)器:通常是指一個(gè)計(jì)算機(jī)程序(web服務(wù)器是什么?),在World Wide Web上提供諸如web頁(yè)面的服務(wù)(提供什么服務(wù)?),使用HyperText Transfer Protocol(HTTP)(使用什么協(xié)議?)。當(dāng)然web服務(wù)器也可以指運(yùn)行這個(gè)程序的計(jì)算機(jī)或虛擬機(jī),我們這里講到的web服務(wù)器是指程序。
本文的主要內(nèi)容如下:
•1、web服務(wù)器
•2、web服務(wù)器怎樣提供服務(wù) •3、web服務(wù)器使用的協(xié)議 •4、客戶端如何唯一標(biāo)識(shí)web服務(wù)器的資源 •5、當(dāng)前比較流行的web服務(wù)器 1、web服務(wù)器 web服務(wù)器的主要功能就是傳送web頁(yè)面給clients。這意味著,傳送HTML文檔和其它包含在文檔中的內(nèi)容,諸如images、style sheets、JavaScripts。client通常是一個(gè)web瀏覽器或web爬蟲(chóng),使用HTTP發(fā)起一個(gè)指定資源的請(qǐng)求,web服務(wù)器用指定的內(nèi)容響應(yīng)請(qǐng)求,或當(dāng)不能做指定請(qǐng)求時(shí)返回一個(gè)錯(cuò)誤消息。請(qǐng)求的資源通常是web服務(wù)器的輔助存儲(chǔ)器上的一個(gè)實(shí)際文件,但是這不是必須,取決于web服務(wù)器的實(shí)現(xiàn)。 雖然web服務(wù)器的主要功能是提供內(nèi)容,但一個(gè)完整的HTTP實(shí)現(xiàn)還包括接收來(lái)自client的內(nèi)容。這個(gè)功能用于提交web表單,包括上載文件。
許多web服務(wù)器也支持服務(wù)器端腳本,例如,Apache Http服務(wù)器和PHP。這意味著,web服務(wù)器的行為可以寫(xiě)成腳本分離到分散的文件中,然而實(shí)際的服務(wù)器軟件仍然保持不變。通常的,這個(gè)功能用于創(chuàng)建HTML文檔,相對(duì)于返回固定的文檔。這分別涉及到動(dòng)態(tài)和靜態(tài)內(nèi)容。前者主要檢索和(或)修改數(shù)據(jù)庫(kù)中的信息,然而后者通常更快和更容易緩存。
web服務(wù)器并不總是用在萬(wàn)維網(wǎng)上,也可以嵌入到諸如打印機(jī)、路由器、網(wǎng)絡(luò)攝像機(jī)和本地網(wǎng)絡(luò),這時(shí)web服務(wù)器可用于系統(tǒng)的監(jiān)視部分,或設(shè)備的管理部分。
2、web服務(wù)器怎樣提供服務(wù)
你想過(guò)沒(méi)有,當(dāng)你在瀏覽器中看到我這篇日志的時(shí)候,它是如何顯示到你的瀏覽器的呢?雖然這個(gè)過(guò)程很大程度上去取決于web服務(wù)器,但他們?nèi)杂泄残浴5湫偷?,?dāng)用戶通過(guò)點(diǎn)擊一個(gè)超鏈接或在瀏覽器的地址欄中輸入一個(gè)URL瀏覽一個(gè)web站點(diǎn)。但是同一個(gè)站點(diǎn)如何同時(shí)在網(wǎng)絡(luò)上的不同計(jì)算機(jī)上顯示的呢? 以我博客的主頁(yè)為例,當(dāng)你在瀏覽器的地址欄中輸入http://home.cnblogs.com/skynet/時(shí),通過(guò)一個(gè)Internet連接,通過(guò)將域名轉(zhuǎn)換為ip地址,然后定位到博客園服務(wù)器,你的瀏覽器初始化一個(gè)與博客園web服務(wù)器的連接。web服務(wù)器上存儲(chǔ)了我的博客里所有的資源,如我寫(xiě)的每篇文章、文章中用到的圖片、還有博客模板中用到的css、腳本等等。
一旦連接建立,瀏覽器使用HTTP從web服務(wù)器請(qǐng)求數(shù)據(jù),服務(wù)器傳輸數(shù)據(jù)給你的瀏覽器。瀏覽器接著轉(zhuǎn)換和格式化數(shù)據(jù)顯示到你的瀏覽器中。類(lèi)似的,web服務(wù)器可以同時(shí)發(fā)生文件到多個(gè)client,允許多個(gè)client同時(shí)瀏覽同一頁(yè)面。
圖1、Web客戶端與服務(wù)器端的交互
當(dāng)然,我這里描述的比較簡(jiǎn)單,更詳細(xì)的步驟請(qǐng)參考:
•What really happens when you navigate to a URL
•當(dāng)你輸入一個(gè)網(wǎng)址的時(shí)候,實(shí)際會(huì)發(fā)生什么? 3、web服務(wù)器使用的協(xié)議 相信通過(guò)上面的介紹,你已經(jīng)知道了web服務(wù)器與client是通過(guò)HTTP來(lái)交互的。關(guān)于HTPP,我以前寫(xiě)過(guò)博文介紹過(guò):HTTP協(xié)議及其POST與GET操作差異 & C#中如何使用POST、GET等,我非常自信的推薦你去閱讀以下這篇文章,比較詳細(xì)地介紹了HTTP及其與client的交互過(guò)程,我這里就不再累述了。 4、客戶端如何唯一標(biāo)識(shí)web服務(wù)器的資源
URI,沒(méi)錯(cuò)就是它統(tǒng)一資源定位符(Uniform Resource Identifiers),用它唯一標(biāo)識(shí)Internet的一個(gè)web頁(yè)面。不過(guò)你可能聽(tīng)的更多的是URL,它是Uniform Resource Location的縮寫(xiě),譯為“統(tǒng)一資源定位符”。通俗地說(shuō),URL是Internet上用來(lái)描述信息資源的字符串,主要用在各種WWW客戶程序和服務(wù)器程序上。采用URL可以用一種統(tǒng)一的格式來(lái)描述各種信息資源,包括文件、服務(wù)器的地址和目錄等。 URL的格式,URL的格式由下列三部分組成:
•第一部分是協(xié)議(或稱(chēng)為服務(wù)方式)
•第二部分是存有該資源的主機(jī)IP地址(有時(shí)也包括端口號(hào)) •第三部分是主機(jī)資源的具體地址,如目錄和文件名等。 第一部分和第二部分之間用“://”符號(hào)隔開(kāi),第二部分和第三部分用“/”符號(hào)隔開(kāi)。第一部分和第二部分是不可缺少的,第三部分有時(shí)可以省略。其實(shí)關(guān)于://不是必須的,只是萬(wàn)維網(wǎng)當(dāng)初是這樣設(shè)計(jì)的,請(qǐng)Google or 百度《萬(wàn)維網(wǎng)之父說(shuō)http://中的兩道斜杠其實(shí)多余》。完整的URL的格式如下所示: scheme://username:password@domain:port/path?query_string#anchor
scheme就是上面我們所說(shuō)的協(xié)議部分,web服務(wù)器中通常用的就是HTTP和HTTPS,但它還可以是gopher、wais、ftp、mailto。
username:password@domain:port就是我們上面說(shuō)的第二部分,一般我們都不用輸入用戶名和密碼、還有端口(HTTP協(xié)議的端口號(hào)是80,一般默認(rèn)都用的這個(gè)),而只是直接輸入域名orIP地址。
path?query_string#anchor就是我們上面說(shuō)的第三部分,path指定資源在服務(wù)器上的路徑(注意:像這種archive/2010/05/18/1738301.html,不一定就是web服務(wù)器上的絕對(duì)路徑,而是經(jīng)過(guò)URL重寫(xiě)之后的路徑,但不管怎么樣說(shuō),它還是唯一標(biāo)識(shí)了資源在服務(wù)器上的路徑);后面的query_string包含傳遞給web應(yīng)用程序(如CGI)的數(shù)據(jù)。查詢(xún)字符串以鍵/值對(duì)的形式,并且每個(gè)鍵值對(duì)之間用&隔開(kāi),如userId=skynet&password=123456;最后當(dāng)使用HTTP,#anchor表示web頁(yè)面的某一個(gè)部分。
以HTTP協(xié)議及其POST與GET操作差異 & C#中如何使用POST、GET等為例它的URL是:http://www.cnblogs.com/skynet/archive/2010/05/18/1738301.html。
上面說(shuō)到URI和URL,肯定還有人不知道他們的區(qū)別,下面我來(lái)解釋一下。URI:Uniform Resource Identifier,統(tǒng)一資源標(biāo)識(shí)符;URL:Uniform Resource Locator,統(tǒng)一資源定位符;URN:Uniform Resource Name,統(tǒng)一資源名稱(chēng)。 其中,URL、URN是URI的子集。他們的關(guān)系如下圖所示:
圖2、URI、URL、URN的關(guān)系
Web上地址的基本形式是URI,它代表統(tǒng)一資源標(biāo)識(shí)符。有兩種形式:URL、URN。URL與URN好比,URN就像一個(gè)人的名字,然而URL就像這個(gè)人所在的位置地址。換句話說(shuō),URN定義了一個(gè)元素的標(biāo)識(shí)符,URL提供方法來(lái)找到它。即URN不依賴(lài)于位置,并且有可能減少失效連接的個(gè)數(shù)。但是其流行還需假以時(shí)日,因?yàn)樗枰苘浖闹С帧?/div>
5、當(dāng)前比較流行的web服務(wù)器
下面是目前比較流行的幾個(gè)web服務(wù)器軟件,及他們2010年的市場(chǎng)份額。 Vendor
Product Web Sites Hosted (millions) Percent Apache Apache 111 54% Microsoft IIS 50 24% Igor Sysoev nginx 16 8% GWS 15 7% lighttpd lighttpd 1 0.46% 而我現(xiàn)在所研究的web服務(wù)器軟件不在其中,之所以選Mongoose來(lái)研究,原因有三: •Mongoose比較小巧、容易使用,而且能夠嵌入到現(xiàn)有的應(yīng)用程序中。 •麻雀雖小,五臟俱全!Mongoose雖小巧,它具有基本的web服務(wù)器應(yīng)該有的功能。通過(guò)研究它,可以更快地學(xué)習(xí)到web服務(wù)器軟件的特性、實(shí)現(xiàn)細(xì)節(jié)。 •Mongoose是開(kāi)源的,可以自由使用。 來(lái)源: http://www.cnblogs.com/skynet/archive/2010/07/24/1784110.html 本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/expleeve/archive/2010/09/02/5859359.aspx |
|