計算機網絡應用層之HTTP協議

一、什麼是HTTP協議
HTTP是HyperText Transfer Protocol即超文本傳輸協議的縮寫,是Web應用層協議之一。

HTTP協議由兩部分程序實現:一個客戶機程序和一個服務器程序,它們運行在不同的端系統中,通過交換HTTP報文運行會話。HTTP定義了Web客戶機是如何向Web服務器請求Web頁面,以及服務器如何將Web頁面傳送給客戶機的。

HTTP使用TCP作爲它的支撐運輸協議。HTTP客戶機發起一個與服務器的TCP連接,一旦連接建立,瀏覽器(客戶機)和服務器進程就可以通過套接字接口訪問TCP。至於TCP是什麼,在後面的文章中,會詳細介紹,這裏讀者只需要知道,TCP是面向連接的,提供可靠的數據傳輸服務,可以無差錯、按順序地交付要發送的數據。即使用TCP作爲其支撐的HTTP協議不用擔心數據丟失,也不用擔心TCP是如何從網絡的數據丟失和亂序故障中恢復的,因爲那是TCP以及協議棧底層協議的工作。

HTTP是一個無狀態協議,所以服務器向客戶機發送被請求的文件時,並不存儲任何關於該客戶機的狀態信息。舉個例子來說,就是假如某個特定的客戶機在短短几秒內兩次請求同一個對象,服務器並不會因爲剛剛爲該用戶提供了該對象而不做出反應,而是重新發送該對象,就好像服務器已經完全忘記了之前所做的事一樣。

最後補充一下,我們平時上網請求的Web頁面是由對象組成的。對象,簡單點來說就是文件,如HTML文件、jpg圖片、視頻等文件,這些文件可通過一個URL地址尋址。當我們請求一個頁面時,我們通常會得到一個HTML文件和幾個引用對象,然後再根據HTML文件中對象的URL地址來加載對象。

二、非持久連接和持久連接

當客戶機/服務器的交互運行於TCP協議上時,應用程序的每個請求/響應對是經一個單獨的TCP連接,則該應用程序使用非持久連接,而當應用程序的每個請求/響應對是經相同的TCP連接發送,則該應用程序使用持久連接。

1、首先,我們來研究一下非持久連接。

在非持久連接的情況下,服務器在發送響應後,關閉TCP連接。我們定義往返時間RTT爲一個小分組從客戶機到服務器再回到客戶所花費的時間。所以RTT包括分組傳播時延、排列時延以及分組處理時延。

我們知道HTTP協議基於TCP協議作爲運輸層,所以使用HTTP與服務器之間建立一個連接,則要發起一個到服務器的TCP連接,而TCP建立連接涉及一個“三次握手”的過程。關於“三次握手”在後面介紹TCP的文章中會詳細介紹,這裏我們只需要知道,它就是客戶機向服務器發送一個小TCP報文段,服務器用一個小的報文段做出確認和響應,最後,客戶機向服務器返回確認。注意,完成了三次握手的前兩部分後,客戶機將三次握手的第三部分(確認)與一個HTTP請求報文結合起來發送到該TCP連接。一旦請求報文到達服務器,服務器向該TCP連接發送HTML文件。從上面的描述,我們可以知道,對於一個非持久連接,請求一個HTTP請求/響應需要的總時間爲兩個RTT+服務器傳輸HTML文件的時間。

2、再來看看持久連接。

在持久連接的情況下,服務器在發送響應後,保持該TCP連接打開。在相同的客戶機與服務器之間的後續請求和響應報文通過相同的連接進行傳送。特別是一個完整的Web頁面(包括多個對象)可以使用單個持久TCP連接進行傳送。如果一個連接經過一定時間間隔仍未被使用,HTTP服務器就關閉該連接。

位於同一臺服務器的多個Web頁面在從該服務器發送給同一個客戶機時,可以在單個持久TCP連接上進行,這睦對象請求可一個接一個地發出,而不必等待未決請求的回答,這種方式叫做流水線式的持久連接,它是HTTP默認使用的持久連接。

3、非持久連接的缺點

首先,非持久連接必須爲每一個請求的對象建立和維護一個全新的連接。對於每個這樣的連接,在客戶機和服務器都要分配TCP的緩衝區和變量,從而給服務器帶來了嚴重的負擔。其次,每一個對象的傳輸時延爲兩個RTT,即一個RTT用於建立TCP,另一個RTT用於請求和接收一個對象。

三、HTTP報文格式

1、HTTP的請求報文格式

首先,來看看HTTP的請求報文的報文格式,如下圖所示:


第一行是請求行,請求行有3個字段,方法字段、URL字段和HTTP版本字段。方法字段可以取值GET、POST、HEAD、PUT和DELETE等,絕大多數請求使用GET方法。其後繼行叫做首部行。當使用GET方法時,實體主體通常爲空,而當使用POST方法時,實體主體通常爲需要POST給服務器的內容,例如,我們在網頁上輸入的數據。

下面,給出一個真正的HTTP請求報文,如下:
GET /xxx/page.html HTTP/1.1
Connection: close
User-agent:Mozilla/4.0
Accept-language: fr

跟上圖對應,這個報文第一行表示請求行,瀏覽器向服務器請求一個對象,使用了GET方法,它的地址在URL字段中,爲/xxx/page.html,所使用的HTTP版本爲1.1。

其餘的行爲首部行,冒號前的是首部字段名,後面是字段的值。
Host: www.xxx.com 定義了目標所在的主機,首部行提供的信息是Web代理高速緩存所要求的。
Connection: close 它告訴服務器不希望使用持久連接,它要求服務器在發送完被請求的對象後就關閉連接。
User-agent:Mozilla/4.0 用來定義用戶代理,即向服務器發送請求的瀏覽器類型,這裏爲Netscape瀏覽器。
Accept-language: fr 表示用戶想得到該對象的法語版本。

2、HTTP響應報文格式

HTTP響應報文格式與HTTP請求報文有點不同,HTTP的響應報文格式如下圖所示:


我們可以看到它同樣由三部分組成,第一行爲狀態行,其後的爲首部行,最後的爲要發送的實體主體。實體主體部分是報文的主體,即它包含了所請求的對象本身。

下面來看看一個真實的HTTP響應報文,如下:
HTTP/1.1 200 OK
Connection: close
Data: Thu, 03, Jul, 2013 00:00:00 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Sun, 6, May 2007 09:23:24 GMT
Content-Type: text/html

(data ... data ...)

首先看一看第一行,它對應上圖中的狀態行,在該報文中,狀態行指示服務器使用的協議是HTTP/1.1,狀態碼爲200,短語爲OK,表示一切正常,信息包含在返回的響應報文中。

第2到5行爲首部行,
Connection: close 告訴客戶機在報文發送完後關閉該TCP連接。
Data 首部行指示服務器產生併發送該響應報文的日期和時間,它是服務器從它的文件系統中檢索到該對象,插入到響應報文的時間。

Server 首部行表明該報文是由一個Apache Web服務器產生的,它類似於請求報文中的User-agent首部行。
Last-Modified 首部行指示了該對象創建或者最後修改的時間和日期。
Content-Type 首部行指示了實體主體中的對象的文件類型,對象類型應該正式地使用該首部行而不是用文件擴展名來指示,因爲在某些系統(如Linux),文件的類型並不是用擴展名爲區分的。

Content-Length 首部行表明了被髮送對象的字節數。

3、常見的HTTP狀態碼和短語
200 OK:請求成功,信息包含在返回的響應報文中。
301 Moved Permanently:請求的對象已經被永久轉移了,新的URL定義在響應報文的Location 首部行中指定。客戶機可自動用新的URL獲取該對象。
400 Bad Repuest:一個通用差錯代碼,指示該請求不能被服務器所理解。
404 Not Found:被請求的文檔不在服務器上。
505 HTTP Version Not Supported:服務器不支持請求報文使用的HTTP協議版本。

發佈了126 篇原創文章 · 獲贊 456 · 訪問量 268萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章