一、什麼是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是乙個無狀態協議,所以伺服器向客戶機傳送被請求的檔案時,並不儲存任何關於該客戶機的狀態資訊。舉個例子來說,就是假如某個特定的客戶機在短短幾秒內兩次請求同乙個物件,伺服器並不會因為剛剛為該使用者提供了該物件而不做出反應,而是重新傳送該物件,就好像伺服器已經完全忘記了之前所做的事一樣。
二、非持久連線和持久連線
當客戶機/伺服器的互動執行於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方法,它的位址在url欄位中,為/***/page.html,所使用的http版本為1.1。
其餘的行為首部行,冒號前的是首部欄位名,後面是字段的值。
host:
www.***.com定義了目標所在的主機,首部行提供的資訊是web**快取記憶體所要求的。
connection: close 它告訴伺服器不希望使用持久連線,它要求伺服器在傳送完被請求的物件後就關閉連線。
user-agent:mozilla/4.0 用來定義使用者**,即向伺服器傳送請求的瀏覽器型別,這裡為netscape瀏覽器。
accept-language: fr 表示使用者想得到該物件的法語版本。
2、http響應報文格式
http響應報文格式與http請求報文有點不同,http的響應報文格式如下圖所示:
我們可以看到它同樣由三部分組成,第一行為狀態行,其後的為首部行,最後的為要傳送的實體主體。實體主體部分是報文的主體,即它包含了所請求的物件本身。
下面來看看乙個真實的http響應報文,如下:
首先看一看第一行,它對應上圖中的狀態行,在該報文中,狀態行指示伺服器使用的協議是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協議版本。
計算機網路 應用層 HTTP協議
是七層osi模型的第七層。應用層直接和應用程式介面並提供常見的網路應用服務。應用層也向表示層發出請求。應用層是開放系統的最高層,是直接為應用程序提供服務的。其作用是在實現多個系統應用程序相互通訊的同時,完成一系列業務處理所需的服務。超文字傳輸協議,是乙個屬於應用層的物件導向的協議,由於其簡捷 快速的...
計算機網路 應用層 HTTP協議
1.http概況 web的應用層協議是超文字傳輸協議 http 它是web的核心。http由兩部分程式實現 乙個客戶機程式和乙個伺服器程式,它們執行在不同的端系統中,通過交換http報文進行對話。http定義了這些報文的格式以及客戶機和伺服器是如何進行報文交換的。下圖是其基本思想 當使用者請求乙個w...
計算機網路 應用層 HTTP
狀態碼request請求頭 response請求頭 參考 啞服務 連線上時不會回顯,要有其他行為時 url 協議 hosts 主機 埠 uri 路徑 1.0 時每乙個http都要建立一次tcp,1.0後可設定connection keep alive來讓tcp持續 客戶端傳送request,服務端回...