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