Mongoose源碼剖析:外篇之web服務器

引言

在深入Mongoose源碼剖析之前,我們應該清楚web服務器是什麼?它提供什麼服務?怎樣提供服務?使用什麼協議?客戶端如何唯一標識web服務器的資源?下面我們拋開Mongoose,來介紹一個web服務的這些通性。

web服務器:通常是指一個計算機程序(web服務器是什麼?),在World Wide Web上提供諸如web頁面的服務(提供什麼服務?),使用HyperText Transfer Protocol(HTTP)(使用什麼協議?)。當然web服務器也可以指運行這個程序的計算機或虛擬機,我們這裏講到的web服務器是指程序。

本文的主要內容如下:

  • 1、web服務器
  • 2、web服務器怎樣提供服務
  • 3、web服務器使用的協議
  • 4、客戶端如何唯一標識web服務器的資源
  • 5、當前比較流行的web服務器

1、web服務器

web服務器的主要功能就是傳送web頁面給clients。這意味着,傳送HTML文檔和其它包含在文檔中的內容,諸如images、style sheets、JavaScripts。client通常是一個web瀏覽器或web爬蟲,使用HTTP發起一個指定資源的請求,web服務器用指定的內容響應請求,或當不能做指定請求時返回一個錯誤消息。請求的資源通常是web服務器的輔助存儲器上的一個實際文件,但是這不是必須,取決於web服務器的實現。

雖然web服務器的主要功能是提供內容,但一個完整的HTTP實現還包括接收來自client的內容。這個功能用於提交web表單,包括上載文件。

許多web服務器也支持服務器端腳本,例如,Apache Http服務器和PHP。這意味着,web服務器的行爲可以寫成腳本分離到分散的文件中,然而實際的服務器軟件仍然保持不變。通常的,這個功能用於創建HTML文檔,相對於返回固定的文檔。這分別涉及到動態和靜態內容。前者主要檢索和(或)修改數據庫中的信息,然而後者通常更快和更容易緩存。

web服務器並不總是用在萬維網上,也可以嵌入到諸如打印機、路由器、網絡攝像機和本地網絡,這時web服務器可用於系統的監視部分,或設備的管理部分。

2、web服務器怎樣提供服務

你想過沒有,當你在瀏覽器中看到我這篇日誌的時候,它是如何顯示到你的瀏覽器的呢?雖然這個過程很大程度上去取決於web服務器,但他們仍有共性。典型的,當用戶通過點擊一個超鏈接或在瀏覽器的地址欄中輸入一個URL瀏覽一個web站點。但是同一個站點如何同時在網絡上的不同計算機上顯示的呢?

以我博客的主頁爲例,當你在瀏覽器的地址欄中輸入http://home.cnblogs.com/skynet/時,通過一個Internet連接,通過將域名轉換爲ip地址,然後定位到博客園服務器,你的瀏覽器初始化一個與博客園web服務器的連接。web服務器上存儲了我的博客裏所有的資源,如我寫的每篇文章、文章中用到的圖片、還有博客模板中用到的css、腳本等等。

一旦連接建立,瀏覽器使用HTTP從web服務器請求數據,服務器傳輸數據給你的瀏覽器。瀏覽器接着轉換和格式化數據顯示到你的瀏覽器中。類似的,web服務器可以同時發生文件到多個client,允許多個client同時瀏覽同一頁面。

image

圖1、Web客戶端與服務器端的交互

當然,我這裏描述的比較簡單,更詳細的步驟請參考:

3、web服務器使用的協議

相信通過上面的介紹,你已經知道了web服務器與client是通過HTTP來交互的。關於HTPP,我以前寫過博文介紹過:HTTP協議及其POST與GET操作差異 & C#中如何使用POST、GET等,我非常自信的推薦你去閱讀以下這篇文章,比較詳細地介紹了HTTP及其與client的交互過程,我這裏就不再累述了。

4、客戶端如何唯一標識web服務器的資源

URI,沒錯就是它統一資源定位符(Uniform Resource Identifiers),用它唯一標識Internet的一個web頁面。不過你可能聽的更多的是URL,它是Uniform Resource Location的縮寫,譯爲“統一資源定位符”。通俗地說,URL是Internet上用來描述信息資源的字符串,主要用在各種WWW客戶程序和服務器程序上。採用URL可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。

URL的格式,URL的格式由下列三部分組成:

  • 第一部分是協議(或稱爲服務方式)
  • 第二部分是存有該資源的主機IP地址(有時也包括端口號)
  • 第三部分是主機資源的具體地址,如目錄和文件名等。

第一部分和第二部分之間用“://”符號隔開,第二部分和第三部分用“/”符號隔開。第一部分和第二部分是不可缺少的,第三部分有時可以省略。其實關於://不是必須的,只是萬維網當初是這樣設計的,請Google or 百度《萬維網之父說http://中的兩道斜槓其實多餘》。完整的URL的格式如下所示:

scheme://username:password@domain:port/path?query_string#anchor

scheme就是上面我們所說的協議部分,web服務器中通常用的就是HTTP和HTTPS,但它還可以是gopher、wais、ftp、mailto。

username:password@domain:port就是我們上面說的第二部分,一般我們都不用輸入用戶名和密碼、還有端口(HTTP協議的端口號是80,一般默認都用的這個),而只是直接輸入域名orIP地址。

path?query_string#anchor就是我們上面說的第三部分,path指定資源在服務器上的路徑(注意:像這種archive/2010/05/18/1738301.html,不一定就是web服務器上的絕對路徑,而是經過URL重寫之後的路徑,但不管怎麼樣說,它還是唯一標識了資源在服務器上的路徑);後面的query_string包含傳遞給web應用程序(如CGI)的數據。查詢字符串以鍵/值對的形式,並且每個鍵值對之間用&隔開,如userId=skynet&password=123456;最後當使用HTTP,#anchor表示web頁面的某一個部分。

HTTP協議及其POST與GET操作差異 & C#中如何使用POST、GET等爲例它的URL是:http://www.cnblogs.com/skynet/archive/2010/05/18/1738301.html

上面說到URI和URL,肯定還有人不知道他們的區別,下面我來解釋一下。URI:Uniform Resource Identifier,統一資源標識符;URL:Uniform Resource Locator,統一資源定位符;URN:Uniform Resource Name,統一資源名稱。 其中,URL、URN是URI的子集。他們的關係如下圖所示:

image

圖2、URI、URL、URN的關係

Web上地址的基本形式是URI,它代表統一資源標識符。有兩種形式:URL、URN。URL與URN好比,URN就像一個人的名字,然而URL就像這個人所在的位置地址。換句話說,URN定義了一個元素的標識符,URL提供方法來找到它。即URN不依賴於位置,並且有可能減少失效連接的個數。但是其流行還需假以時日,因爲它需要更精密軟件的支持。

5、當前比較流行的web服務器

下面是目前比較流行的幾個web服務器軟件,及他們2010年的市場份額。

Vendor

Product

Web Sites Hosted (millions)

Percent

Apache

Apache

111

54%

Microsoft

IIS

50

24%

Igor Sysoev

nginx

16

8%

Google

GWS

15

7%

lighttpd

lighttpd

1

0.46%

而我現在所研究的web服務器軟件不在其中,之所以選Mongoose來研究,原因有三:

  • Mongoose比較小巧、容易使用,而且能夠嵌入到現有的應用程序中。
  • 麻雀雖小,五臟俱全!Mongoose雖小巧,它具有基本的web服務器應該有的功能。通過研究它,可以更快地學習到web服務器軟件的特性、實現細節。
  • Mongoose是開源的,可以自由使用。


作者:吳秦
出處:http://www.cnblogs.com/skynet/
本文基於署名 2.5 中國大陸許可協議發佈,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名吳秦(包含鏈接).


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章