HTTP協議是什麼?
簡單來說,就是一個基於應用層 的通信規範:雙方要進行通信,大家都要遵守一個規範,這個規範就是 HTTP協議。
HTTP協議能做什麼?
很多人首先一定會想到:瀏覽網頁。沒錯,瀏覽網頁是 HTTP的主要應用,但是這並不代表 HTTP就只能應用於網頁的瀏覽。 HTTP是一種協議,只要通信的雙方都遵守這個協議, HTTP就能有用武之地。比如咱們常用的 QQ,迅雷這些軟件,都會使用 HTTP協議(還包括其他的協議)。
HTTP協議如何工作?
大家都知道一般的通信流程:首先客戶端發送一個請求 (request)給服務器,服務器在接收到這個請求後將生成一個響應 (response)返回給客戶端。
在這個通信的過程中 HTTP協議在以下 4個方面做了規定:
1. Request 和 Response 的格式
Request格式:
HTTP
請求行
(請求)頭
空行
可選的消息體
注:請求行和標題必須以 <CR><LF> 作爲結尾(也就是,回車然後換行)。空行內必須只有 <CR><LF> 而無其他空格。在 HTTP/1.1 協議中,所有的請求頭,除 Host 外,都是可選的。
實例:
GET / HTTP/1.1
Host: gpcuster.cnblogs.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
If-Modified-Since: Mon, 25 May 2009 03:19:18 GMT
Response 格式:
HTTP
狀態行
(應答)頭
空行
可選的消息體
實例:
HTTP/1.1 200 OK
Cache-Control: private, max-age=30
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Mon, 25 May 2009 03:20:33 GMT
Last-Modified: Mon, 25 May 2009 03:20:03 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Mon, 25 May 2009 03:20:02 GMT
Content-Length: 12173
消息體的內容(略)
詳細的信息請參考: RFC 2616 。
關於 HTTP headers 的簡要介紹,請查看: Quick reference to HTTP headers
2. 建立連接的方式
HTTP支持 2中建立連接的方式:非持久連接和持久連接 (HTTP1.1默認的連接方式爲持久連接 )。
1) 非持久連接
讓 我們查看一下非持久連接情況下從服務器到客戶傳送一個Web頁面的步驟。假設該貝面由1個基本HTML文件和10個JPEG圖像構成,而且所有這些對象都 存放在同一臺服務器主機中。再假設該基本HTML文件的URL爲:gpcuster.cnblogs.com/index.html。
下面是具體步騾:
1.HTTP 客戶初始化一個與服務器主機 gpcuster.cnblogs.com 中的HTTP服務器的TCP連接。HTTP服務器使用默認端口號80監聽來自HTTP客戶的連接建立請求。
2.HTTP 客戶經由與TCP連接相關聯的本地套接字發出—個HTTP請求消息。這個消息中包含路徑名/somepath/index.html。
3.HTTP 服務器經由與TCP連接相關聯的本地套接字接收這個請求消息,再從服務器主機的內存或硬盤中取出對象/somepath/index.html,經由同一個套接字發出包含該對象的響應消息。
4.HTTP 服務器告知TCP關閉這個TCP連接(不過TCP要到客戶收到剛纔這個響應消息之後纔會真正終止這個連接)。
5.HTTP 客戶經由同一個套接字接收這個響應消息。TCP連接隨後終止。該消息標明所封裝的對象是一個HTML文件。客戶從中取出這個文件,加以分析後發現其中有10個JPEG對象的引用。
6. 給每一個引用到的JPEG對象重複步騾1-4。
上 述步驟之所以稱爲使用非持久連接,原因是每次服務器發出一個對象後,相應的TCP連接就被關閉,也就是說每個連接都沒有持續到可用於傳送其他對象。每個 TCP連接只用於傳輸一個請求消息和一個響應消息。就上述例子而言,用戶每請求一次那個web頁面,就產生11個TCP連接。
2) 持久連接
非持久連接有些缺點。首先,客戶得爲每個待請求的對象建立並維護一個新的連接。對於每個這樣的連接, TCP得在客戶端和服務器端分配 TCP緩衝區,並維持 TCP變量。對於有可能同時爲來自數百個不同客戶的請求提供服務的 web服務器來說,這會嚴重增加其負擔。其次,如前所述,每個對象都有 2個 RTT的響應延長——一個 RTT用於建立 TCP連接,另—個 RTT用於請求和接收對象。最後,每個對象都遭受 TCP緩啓動,因爲每個 TCP連接都起始於緩啓動階段。不過並行 TCP連接的使用能夠部分減輕 RTT延遲和緩啓動延遲的影響。
在持久連接情況下,服務器在發出響應後讓 TCP連接繼續打開着。同一對客戶 /服務器之間的後續請求和響應可以通過這個連接發送。整個 Web頁面 (上例中爲包含一個基本 HTMLL文件和 10個圖像的頁面 )自不用說可以通過單個持久 TCP連接發送 :甚至存放在同一個服務器中的多個 web頁面也可以通過單個持久 TCP連接發送。通常, HTTP服務器在某個連接閒置一段特定時間後關閉它,而這段時間通常是可以配置的。持久連接分爲不帶流水線 (without pipelining)和帶流水線 (with pipelining)兩個版本。如果是不帶流水線的版本,那麼客戶只在收到前一個請求的響應後才發出新的請求。這種情況下, web頁面所引用的每個對象 (上例中的 10個圖像 )都經歷 1個 RTT的延遲,用於請求和接收該對象。與非持久連接 2個 RTT的延遲相比,不帶流水線的持久連接已有所改善,不過帶流水線的持久連接還能進一步降低響應延遲。不帶流水線版本的另一個缺點是,服務器送出一個對象後開始等待下一個請求,而這個新請求卻不能馬上到達。這段時間服務器資源便閒置了。
HTTP/1.1的默認模式使用帶流水線的持久連接。這種情況下, HTTP客戶每碰到一個引用就立即發出一個請求,因而 HTTP客戶可以一個接一個緊挨着發出各個引用對象的請求。服務器收到這些請求後,也可以一個接一個緊挨着發出各個對象。如果所有的請求和響應都是緊挨着發送的,那麼所有引用到的對象一共只經歷 1個 RTT的延遲 (而不是像不帶流水線的版本那樣,每個引用到的對象都各有 1個 RTT的延遲 )。另外,帶流水線的持久連接中服務器空等請求的時間比較少。與非持久連接相比,持久連接 (不論是否帶流水線 )除降低了 1個 RTT的響應延遲外,緩啓動延遲也比較小。其原因在於既然各個對象使用同一個 TCP連接,服務器發出第一個對象後就不必再以一開始的緩慢速率發送後續對象。相反,服務器可以按照第一個對象發送完畢時的速率開始發送下一個對象。
3. 緩存的機制
HTTP/1.1中緩存的目的是爲了在很多情況下減少發送請求,同時在許多情況下可以不需要發送完整響應。前者減少了網絡迴路的數量; HTTP利用一個“過期( expiration)”機制來爲此目的。後者減少了網絡應用的帶寬; HTTP用“驗證( validation)”機制來爲此目的。
HTTP定義了 3種緩存機制:
l Freshness 設置 Cache-Control: max-age,告訴瀏覽器緩存多長時間後失效。
l Validation 如果一個response 中存在 Last-Modified 頭信息, 瀏覽器將通過 If-Modified-Since檢測緩存是否失效.
l Invalidation is usually a side effect of another request that passes through the cache. For example, if URL associated with a cached response subsequently gets a POST, PUT or DELETE request, the cached response will be invalidated.