1. 程式人生 > >http協議版本介紹

http協議版本介紹

HTTP 協議是網際網路的基礎協議,也是網頁開發的必備知識,最新版本 HTTP/2 更是讓它成為技術熱點。

本文介紹 HTTP 協議的歷史演變和設計思路。

一、HTTP/0.9

HTTP 是基於 TCP/IP 協議的應用層協議。它不涉及資料包(packet)傳輸,主要規定了客戶端和伺服器之間的通訊格式,預設使用80埠。

最早版本是1991年釋出的0.9版。該版本極其簡單,只有一個命令GET

GET /index.html

上面命令表示,TCP 連線(connection)建立後,客戶端向伺服器請求(request)網頁index.html

協議規定,伺服器只能迴應HTML格式的字串,不能迴應別的格式。

<html>
  <body>Hello World</body>
</html>

伺服器傳送完畢,就關閉TCP連線。

二、HTTP/1.0

2.1 簡介

1996年5月,HTTP/1.0 版本釋出,內容大大增加。

首先,任何格式的內容都可以傳送。這使得網際網路不僅可以傳輸文字,還能傳輸影象、視訊、二進位制檔案。這為網際網路的大發展奠定了基礎。

其次,除了GET命令,還引入了POST命令和HEAD命令,豐富了瀏覽器與伺服器的互動手段。

再次,HTTP請求和迴應的格式也變了。除了資料部分,每次通訊都必須包括頭資訊(HTTP header),用來描述一些元資料。

其他的新增功能還包括狀態碼(status code)、多字符集支援、多部分發送(multi-part type)、許可權(authorization)、快取(cache)、內容編碼(content encoding)等。

2.2 請求格式

下面是一個1.0版的HTTP請求的例子。

GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

可以看到,這個格式與0.9版有很大變化。

第一行是請求命令,必須在尾部新增協議版本(HTTP/1.0)。後面就是多行頭資訊,描述客戶端的情況。

2.3 迴應格式

伺服器的迴應如下。

HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84

<html>
  <body>Hello World</body>
</html>

迴應的格式是"頭資訊 + 一個空行(\r\n) + 資料"。其中,第一行是"協議版本 + 狀態碼(status code) + 狀態描述"。

2.4 Content-Type 欄位

關於字元的編碼,1.0版規定,頭資訊必須是 ASCII 碼,後面的資料可以是任何格式。因此,伺服器迴應的時候,必須告訴客戶端,資料是什麼格式,這就是Content-Type欄位的作用。

下面是一些常見的Content-Type欄位的值。

text/plain
text/html
text/css
image/jpeg
image/png
image/svg+xml
audio/mp4
video/mp4
application/javascript
application/pdf
application/zip
application/atom+xml

這些資料型別總稱為MIME type,每個值包括一級型別和二級型別,之間用斜槓分隔。

除了預定義的型別,廠商也可以自定義型別。

application/vnd.debian.binary-package

上面的型別表明,傳送的是Debian系統的二進位制資料包。

MIME type還可以在尾部使用分號,新增引數。

Content-Type: text/html; charset=utf-8

上面的型別表明,傳送的是網頁,而且編碼是UTF-8。

客戶端請求的時候,可以使用Accept欄位宣告自己可以接受哪些資料格式。

Accept: */*

上面程式碼中,客戶端宣告自己可以接受任何格式的資料。

MIME type不僅用在HTTP協議,還可以用在其他地方,比如HTML網頁。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!-- 等同於 -->
<meta charset="utf-8" /> 

2.5 Content-Encoding 欄位

由於傳送的資料可以是任何格式,因此可以把資料壓縮後再發送。Content-Encoding欄位說明資料的壓縮方法。

Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate

客戶端在請求時,用Accept-Encoding欄位說明自己可以接受哪些壓縮方法。

Accept-Encoding: gzip, deflate

2.6 缺點

HTTP/1.0 版的主要缺點是,每個TCP連線只能傳送一個請求。傳送資料完畢,連線就關閉,如果還要請求其他資源,就必須再新建一個連線。

TCP連線的新建成本很高,因為需要客戶端和伺服器三次握手,並且開始時傳送速率較慢(slow start)。所以,HTTP 1.0版本的效能比較差。隨著網頁載入的外部資源越來越多,這個問題就愈發突出了。

為了解決這個問題,有些瀏覽器在請求時,用了一個非標準的Connection欄位。

Connection: keep-alive

這個欄位要求伺服器不要關閉TCP連線,以便其他請求複用。伺服器同樣迴應這個欄位。

Connection: keep-alive

一個可以複用的TCP連線就建立了,直到客戶端或伺服器主動關閉連線。但是,這不是標準欄位,不同實現的行為可能不一致,因此不是根本的解決辦法。

三、HTTP/1.1

1997年1月,HTTP/1.1 版本釋出,只比 1.0 版本晚了半年。它進一步完善了 HTTP 協議,一直用到了20年後的今天,直到現在還是最流行的版本。

3.1 持久連線

1.1 版的最大變化,就是引入了持久連線(persistent connection),即TCP連線預設不關閉,可以被多個請求複用,不用宣告Connection: keep-alive

客戶端和伺服器發現對方一段時間沒有活動,就可以主動關閉連線。不過,規範的做法是,客戶端在最後一個請求時,傳送Connection: close,明確要求伺服器關閉TCP連線。

Connection: close

目前,對於同一個域名,大多數瀏覽器允許同時建立6個持久連線。

3.2 管道機制

1.1 版還引入了管道機制(pipelining),即在同一個TCP連線裡面,客戶端可以同時傳送多個請求。這樣就進一步改進了HTTP協議的效率。

舉例來說,客戶端需要請求兩個資源。以前的做法是,在同一個TCP連線裡面,先發送A請求,然後等待伺服器做出迴應,收到後再發出B請求。管道機制則是允許瀏覽器同時發出A請求和B請求,但是伺服器還是按照順序,先回應A請求,完成後再回應B請求。

3.3 Content-Length 欄位

一個TCP連線現在可以傳送多個迴應,勢必就要有一種機制,區分資料包是屬於哪一個迴應的。這就是Content-length欄位的作用,宣告本次迴應的資料長度。

Content-Length: 3495

上面程式碼告訴瀏覽器,本次迴應的長度是3495個位元組,後面的位元組就屬於下一個迴應了。

在1.0版中,Content-Length欄位不是必需的,因為瀏覽器發現伺服器關閉了TCP連線,就表明收到的資料包已經全了。

3.4 分塊傳輸編碼

使用Content-Length欄位的前提條件是,伺服器傳送迴應之前,必須知道迴應的資料長度。

對於一些很耗時的動態操作來說,這意味著,伺服器要等到所有操作完成,才能傳送資料,顯然這樣的效率不高。更好的處理方法是,產生一塊資料,就傳送一塊,採用"流模式"(stream)取代"快取模式"(buffer)。

因此,1.1版規定可以不使用Content-Length欄位,而使用"分塊傳輸編碼"(chunked transfer encoding)。只要請求或迴應的頭資訊有Transfer-Encoding欄位,就表明迴應將由數量未定的資料塊組成。

Transfer-Encoding: chunked

每個非空的資料塊之前,會有一個16進位制的數值,表示這個塊的長度。最後是一個大小為0的塊,就表示本次迴應的資料傳送完了。下面是一個例子。

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25
This is the data in the first chunk
1C
and this is the second one
3
con
8
sequence
0

3.5 其他功能

1.1版還新增了許多動詞方法:PUTPATCHHEAD、 OPTIONSDELETE

另外,客戶端請求的頭資訊新增了Host欄位,用來指定伺服器的域名。

Host: www.example.com

有了Host欄位,就可以將請求發往同一臺伺服器上的不同網站,為虛擬主機的興起打下了基礎。

3.6 缺點

雖然1.1版允許複用TCP連線,但是同一個TCP連線裡面,所有的資料通訊是按次序進行的。伺服器只有處理完一個迴應,才會進行下一個迴應。要是前面的迴應特別慢,後面就會有許多請求排隊等著。這稱為"隊頭堵塞"(Head-of-line blocking)。

為了避免這個問題,只有兩種方法:一是減少請求數,二是同時多開持久連線。這導致了很多的網頁優化技巧,比如合併指令碼和樣式表、將圖片嵌入CSS程式碼、域名分片(domain sharding)等等。如果HTTP協議設計得更好一些,這些額外的工作是可以避免的。

四、SPDY 協議

2009年,谷歌公開了自行研發的 SPDY 協議,主要解決 HTTP/1.1 效率不高的問題。

這個協議在Chrome瀏覽器上證明可行以後,就被當作 HTTP/2 的基礎,主要特性都在 HTTP/2 之中得到繼承。

五、HTTP/2

2015年,HTTP/2 釋出。它不叫 HTTP/2.0,是因為標準委員會不打算再發布子版本了,下一個新版本將是 HTTP/3。

5.1 二進位制協議

HTTP/1.1 版的頭資訊肯定是文字(ASCII編碼),資料體可以是文字,也可以是二進位制。HTTP/2 則是一個徹底的二進位制協議,頭資訊和資料體都是二進位制,並且統稱為"幀"(frame):頭資訊幀和資料幀。

二進位制協議的一個好處是,可以定義額外的幀。HTTP/2 定義了近十種幀,為將來的高階應用打好了基礎。如果使用文字實現這種功能,解析資料將會變得非常麻煩,二進位制解析則方便得多。

5.2 多工

HTTP/2 複用TCP連線,在一個連線裡,客戶端和瀏覽器都可以同時傳送多個請求或迴應,而且不用按照順序一一對應,這樣就避免了"隊頭堵塞"。

舉例來說,在一個TCP連線裡面,伺服器同時收到了A請求和B請求,於是先回應A請求,結果發現處理過程非常耗時,於是就傳送A請求已經處理好的部分, 接著迴應B請求,完成後,再發送A請求剩下的部分。

這樣雙向的、實時的通訊,就叫做多工(Multiplexing)。

5.3 資料流

因為 HTTP/2 的資料包是不按順序傳送的,同一個連線裡面連續的資料包,可能屬於不同的迴應。因此,必須要對資料包做標記,指出它屬於哪個迴應。

HTTP/2 將每個請求或迴應的所有資料包,稱為一個數據流(stream)。每個資料流都有一個獨一無二的編號。資料包傳送的時候,都必須標記資料流ID,用來區分它屬於哪個資料流。另外還規定,客戶端發出的資料流,ID一律為奇數,伺服器發出的,ID為偶數。

資料流傳送到一半的時候,客戶端和伺服器都可以傳送訊號(RST_STREAM幀),取消這個資料流。1.1版取消資料流的唯一方法,就是關閉TCP連線。這就是說,HTTP/2 可以取消某一次請求,同時保證TCP連線還開啟著,可以被其他請求使用。

客戶端還可以指定資料流的優先順序。優先順序越高,伺服器就會越早迴應。

5.4 頭資訊壓縮

HTTP 協議不帶有狀態,每次請求都必須附上所有資訊。所以,請求的很多欄位都是重複的,比如CookieUser Agent,一模一樣的內容,每次請求都必須附帶,這會浪費很多頻寬,也影響速度。

HTTP/2 對這一點做了優化,引入了頭資訊壓縮機制(header compression)。一方面,頭資訊使用gzipcompress壓縮後再發送;另一方面,客戶端和伺服器同時維護一張頭資訊表,所有欄位都會存入這個表,生成一個索引號,以後就不傳送同樣欄位了,只發送索引號,這樣就提高速度了。

5.5 伺服器推送

HTTP/2 允許伺服器未經請求,主動向客戶端傳送資源,這叫做伺服器推送(server push)。

常見場景是客戶端請求一個網頁,這個網頁裡面包含很多靜態資源。正常情況下,客戶端必須收到網頁後,解析HTML原始碼,發現有靜態資源,再發出靜態資源請求。其實,伺服器可以預期到客戶端請求網頁後,很可能會再請求靜態資源,所以就主動把這些靜態資源隨著網頁一起發給客戶端了。

相關推薦

http協議版本介紹

HTTP 協議是網際網路的基礎協議,也是網頁開發的必備知識,最新版本 HTTP/2 更是讓它成為技術熱點。 本文介紹 HTTP 協議的歷史演變和設計思路。 一、HTTP/0.9 HTTP 是基於 TCP/IP 協議的應用層協議。它不涉及資料包(packet)傳輸,主

Spring Security 集成 CAS(基於HTTP協議版本)

可能 key 1.3 remove gin repo produce writing monit Spring Security 集成 CAS(基於HTTP協議版本) 近段時間一直研究Spring Security 集成 CAS,網上資料相關資料也很多,不過大都是基於Htt

基於HTTP 協議認證介紹與實現

idt 興趣 cati 生成 保護 進行 pos 響應 label 導言 一直對http 的頭認證有興趣,就是路由器的那種彈出對話框輸入賬號密碼怎麽實現一直不明白,最近,翻了一下http 協議,發現這是一個RFC 2617的實現,所以寫篇文章介紹一下吧. Http基本認證

http 協議簡單介紹

文章目錄 http http 請求 http 響應 http 狀態碼 http 請求方法 http 工作原理 參考 http HTTP協議是Hyper

Http協議詳細介紹 HTTP協議詳細介紹

HTTP協議詳細介紹 當你在瀏覽器位址列敲入“http://www.cnblogs.com/”,然後猛按回車,呈現在你面前的,將是部落格園的首頁了(這真是廢話,你會認為這是理所當然的

Http協議詳細介紹

服務器響應時間 重點 tool attach col 人員 釋放資源 height fir HTTP協議詳細介紹 當你在瀏覽器地址欄敲入“http://www.cnblogs.com/”,然後猛按回車

HTTP協議簡單介紹

Http協議是超文字傳輸協議的縮寫,是用於從全球資訊網伺服器傳輸超文字到本地瀏覽器的傳送協議。Http協議是一個基於TCP/IP通訊協議來傳輸資料(HTML檔案、圖片檔案、查詢結果等) 瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB瀏覽器傳送所有請求。 HTTP

HTTP協議各個版本介紹和特點

    超文字傳輸協議 (HTTP-Hypertext transfer protocol) 是一種詳細規定了瀏覽器和全球資訊網伺服器之間互相通訊的規則,通過因特網傳送全球資訊網文件的資料傳送協議。 HTTP/0.9 只接受GET一種請求方法,沒有在通訊中指定版本號,且不支援請求頭。由於該版本不支援

HTTP協議(一):介紹

ans html 通過 www. cat hyper res lan 了解 HTTP協議(一):介紹 RFC 2616定義了今天普遍使用的一個版本——HTTP 1.1。HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)

http協議不同版本之間的對比(1.0 1.1 2.0)

http區別 http 1.0 短連接每一個請求建立一個TCP連接,請求完成後立馬斷開連接。這將會導致2個問題:連接無法復用,head of line blocking連接無法復用會導致每次請求都經歷三次握手和慢啟動。三次握手在高延遲的場景下影響較明顯,慢啟動則對文件類大請求影響較大。head of lin

http協議的簡單介紹

Linuxhttp:伯納斯·李{1994年,伯納斯李在MIT網絡中心成立萬維網中心,代表互聯網誕生,伯納斯李被稱為萬維網之父;}http/0.9:只有get或put功能;http的原型版本;http/1.0(1998年);引入郵件中的MIME機制:Mutipurpose Internet Mail Exten

http協議版本差異(2)

大量 XML cti 技術 類型 版本 bsp 沒有 域名 —————————————HTTP1.0/HTTP1.1—————————————— 建立連接方面   HTTP/1.0 每次請求都需要建立新的TCP連接,連接不能復用。HTTP/1.1 新的請求可以在上次請求

HTTP協議八種請求型別介紹

HTTP 協議中共定義了八種方法或者叫“動作”來表明對 Request-URI 指定的資源的不同操作方式,具體介紹如下:  OPTIONS:返回伺服器針對特定資源所支援的HTTP請求方法。也可以利用向Web伺服器傳送'*'的請求來測試伺服器的功能性。  HEAD:向伺服器索要與

HTTP協議八種請求類型介紹

發出 修改 不同 spa 特定 表單 位置 代理 新的 HTTP 協議中共定義了八種方法或者叫“動作”來表明對 Request-URI 指定的資源的不同操作方式,具體介紹如下: OPTIONS:返回服務器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務器發送

SpringCloud工作筆記048---RESTful API 中 HTTP 狀態碼的定義_以及把RESTFul版本號_放到http協議header中_以及RestFul設計時的兩個誤區

------------------------- RESTful架構有一些典型的設計誤區。 最常見的一種設計錯誤,就是URI包含動詞。因為"資源"表示一種實體,所以應該是名詞,URI不應該有動詞,動詞應該放在HTTP協議中。 舉例來說,某個URI是/posts/s

HTTP協議介紹(POST、GET、Content-Type)

什麼是HTTP? 超文字傳輸協議(HyperText Transfer Protocol -- HTTP)是一個設計來使客戶端和伺服器順利進行通訊的協議。 HTTP/1.1 協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE

http協議各個版本

一、HTTP協議版本更替 HTTP/0.9         HTTP協議的最初版本,功能簡陋,僅支援請求方式GET,並且僅能請求訪問HTML格式的資源。 HTTP/1.0     請求行必須在尾部新增協議版本欄位(http/1.0);必須包含頭訊息        

Java學習筆記13-- web伺服器介紹及Tomcat的使用;jdk,eclipse,tomcat關係以及安裝順序;http協議

web伺服器介紹及Tomcat的使用 jdk,eclipse,tomcat關係以及安裝順序 1、eclipse安裝前必須要先裝jdk 1、沒有JDK的話,無法安裝或者執行eclipse。 2、JDK 是整個Java的核心,包括了Java執行環境,Java

OkHttp的基本使用-1(Http協議介紹)

Http是一個屬於應用層的面向物件的協議,由於其簡潔、快速的方式,適用於分散式超媒體資訊系統。 它於1990年提出,經過今年的使用與發展,得到不斷地完善和擴充套件。目前在WWW中使用的是HTTP/1.

HTTP協議與REST基礎介紹(上)

超文字傳輸協議是網路應用基本,當你傳輸文件或者傳送ajax請求的時候都會用到。但是對於一般的web開發者來說HTTP協議並不熟悉。這篇文章會介紹一些HTTP、REST的基本原理,然後你可以用這些構建一些跨系統跨平臺的介面。 為什麼是REST REST是獨立系統間一種簡單的