FreeBSD超文字傳輸協議HTTP(轉)

gugu99發表於2007-08-11
FreeBSD超文字傳輸協議HTTP(轉)[@more@]

  由於能夠提供圖形、聲音等多媒體資料,WWW已經成為Internet使用者最喜愛的訪問方式,當前的大部分 Internet流量均是由WWW瀏覽產生的。由於這種多媒體瀏覽方式的幫助,Internet不再僅僅是由專業人員使用,對計算機瞭解不多的普通使用者也能進入Internet的世界,享受Internet帶來的新鮮內容。

  雖然WWW服務非常之流行,然而要建立一個WWW伺服器以提供WWW服務卻仍然屬於專業領域的任務。當前能夠提供WWW服務的軟體有很多種,分別執行在不同的作業系統之上,其中有一些軟體能夠執行在個人使用的Windows桌面系統上,具備圖形介面且易於配置,因此很多希望嘗試提供WWW服務的使用者常常會安裝並試執行過這些系統。然而這些系統基本上是隻能提供極其有限的服務能力的系統,如果要想提供一個能夠允許正常的Internet訪問的伺服器系統,至少應該使用Windows NT系統。當要求更高的效能和穩定性系統時,就應該選擇Unix。FreeBSD顯然是使用Intel平臺系統時,可供選擇的極其優秀的WWW伺服器作業系統。

  • 基本概念

  雖然普通使用者只需要瞭解一些常識性的概念,如URL、HTML等,就能透過瀏覽器很輕鬆的訪問Internet 上的Web資源。然而要建立一個Web伺服器,卻需要更多的相關概念,如HTTP、MIME、CGI等,這樣才能瞭解Web伺服器的設定引數,以正確設定這些引數建立一個真正可用的伺服器系統。

  • 超文字傳輸協議HTTP

  用於支援WWW瀏覽的網路協議為HTTP,這是一種最基本的客戶機/伺服器的訪問協議。瀏覽器向伺服器傳送請求,而伺服器回應相應的網頁。HTTP協議從1990年開始出現,發展到當前的HTTP 1.1標準,已經有了相當多的擴充套件,然而其最基本的實現是非常簡單的,伺服器需要進行的額外處理相當少,這也是為什麼Web伺服器軟體如此眾多的原因之一。

  • 請求方法

      通常,HTTP協議使用埠80來提供客戶訪問,因此也可以使用其他的網路軟體,如telnet,模擬客戶向伺服器傳送請求,來檢視HTTP的傳輸方式。

    $ telnet webserver 80

    Trying 192.168.0.1...

    Connected to webserver.

    Escape character is '^]'.

    GET /index.html

      當telnet顯示了Connect等資訊建立了連線之後,伺服器就等待使用者輸入請求,而不進行任何提示。上例中,使用者輸入GET /index.html指令,則伺服器立即將相應的網頁返回,然後關閉連線。

      客戶程式向伺服器傳送的請求可以有不同的型別,這樣伺服器可以根據不同的請求型別進行不同的處理。在HTTP 1.0中,定義了三種最基本的請求型別,GET、POST和HEAD,這些請求方法的實現方式均與上例相同,客戶程式用大寫指令將請求傳送給伺服器,後面跟隨具體的資料。

      GET請求最為常見,它後面跟隨一個網頁的位置,伺服器接受請求並返回其請求的頁面。除了頁面位置作引數之外,請求還可以跟隨協議的版本如HTTP/1.0等作為引數,以傳送給伺服器更多的資訊。

      POST請求要求伺服器接收大量的資訊,除了POST後面跟隨的引數之外,瀏覽器還會在後面持續傳送資料,讓伺服器進行處理。通常,POST方法是和CGI程式分不開的,伺服器應該啟動一個CGI程式來處理POST傳送來的資料。

      HEAD請求在客戶程式和伺服器之間進行交流,而不會返回具體的文件。當使用GET和POST方法時,伺服器最後都將結果文件返回給客戶程式,瀏覽器將重新整理顯示。而HEAD請求則不同,它僅僅交流一些內部資料,這些資料不會影響瀏覽的過程。因此HEAD方法通常不單獨使用,而是和其他的請求方法一起起到輔助作用。一些搜尋引擎使用的自動搜尋機器人使用這個方法來獲得網頁的標誌資訊,或者進行安全認證時,使用這個方法來傳遞認證資訊。

      除了這三種最常見的訪問方法之外,在HTTP 1.1中還定義了更多的訪問方法型別,如PUT,用於將網頁放置到正確位置,DELETE用於刪除相關文件等。這些方法並不常用,因而大部分Web伺服器軟體並沒有實現他們。然而對於特定場合他們還是非常有用的,例如使用軟體編輯網頁時,網頁編輯器可以使用這些方法,管理不同的網頁。

      如果伺服器不支援客戶傳送的請求方法,伺服器將返回錯誤並立即關閉連線。

  • 伺服器對HTTP的處理方式

      HTTP協議的這種請求/回應的模式,使得伺服器只能根據客戶程式的請求傳送回資訊,這樣的好處是客戶具備很大的自由度,可以任意訪問伺服器上的資訊。因此就存在多個客戶同時訪問一個伺服器的問題。

      在Unix下,由一個守護程式來監視來自客戶程式的請求,當守護程式接受到一個請求時,就建立一個新的程式對請求進行處理。通常伺服器能建立足夠多的新程式來回應客戶的請求,然而如果同時傳送請求的客戶太多,那麼伺服器就有可能出現超載的情況,建立程式的速度跟不上眾多客戶傳送請求的速度,這樣就造成了伺服器對外表現反應遲緩。此外,為了提高使用者使用瀏覽器時的效能,現代瀏覽器還支援併發的訪問方式,瀏覽一個網頁時同時建立多個連線,以迅速獲得一個網頁上的多個圖示,這樣能更快速完成整個網頁的傳輸。但是對伺服器來講,更增加了瞬間負載。

      顯然,造成這個問題的關鍵是伺服器對HTTP協議的處理方式,一次請求就要建立一個連線,在網頁上充滿了多個較小的圖象檔案的時候,那麼伺服器和客戶程式之間的大部分工作是用於建立連線,而真正用於傳遞資料的工作卻很輕鬆。因此,更好的利用現有連線,減少建立連線的消耗,就需要能在一次連線中回應多個請求。在HTTP 1.1中提供了這種持續連線的方式,而下一代HTTP協議:HTTP-NG更增加了有關會話控制、豐富的內容協商等方式的支援,來提供更高效率的連線。

      除了針對每次請求都建立一個新程式的處理方式之外,HTTP守護程式也能使用其他的方式處理多個請求,例如使用多執行緒,或者使用非同步方式在不同請求之間進行切換,就能在一個程式內處理多個請求。雖然比起建立新程式來講,這樣消耗的處理器資源略微減少,但是並不能從根本上消除併發訪問帶來的處理器資源不足的問題。一般使用執行緒和非同步方式的程式較為複雜,不能很容易擴充對新特性的支援,並有可能因為程式內部要自己進行同步等原因也會造成資源消耗。使用這些方式,雖然對處理靜態的網頁有好處,但對於執行CGI程式,仍然要建立子程式進行處理。因此,大部分執行在Unix上的守護程式仍然使用多程式的方式,這種方式簡單卻有效。

      即使對於使用多程式方式進行處理的Web伺服器,也有不同的處理方式。Unix系統中提供了超級伺服器程式inetd ,因此簡單的Web伺服器可以使用inetd來啟動真正的Web伺服器。然而,inetd效率不高,使用in etd的伺服器不能用作高負載的伺服器系統,因此高負載的Web伺服器,本身來監聽客戶連線請求,並負責啟動子程式真正處理客戶的請求。

      如果選擇的伺服器程式的確需要使用inetd來啟動,可以選擇與inetd功能相同,但效率更高的超級伺服器程式tcpserver,它可以比inetd更高效的啟動服務程式。

  • 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-944592/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章