1. 程式人生 > >HTTP 協議入門-筆記

HTTP 協議入門-筆記

維護 動向 nbsp ima vid 指定 編碼 數據壓縮 aud

原文參考http://mp.weixin.qq.com/s/czx0AHaItrJ-c49XDboIUg HTTP是基於TCP/IP協議的應用層協議,規定了客戶端和服務端之間的通信格式,默認使用80端口

1.0版請求格式如下
GET/HTTP/1.0 // 請求命令,必須在尾部添加協議版本(HTTP/1.0)
User-Agent:Mozilla/5.0(Macintosh;Intel Mac OS X 10_10_5) // 描述客戶端情況
Accept:*/* // 客戶端聲明可以接受數據格式
Accept-Encoding: gzip,deflate //客戶端說明自己可以接受哪些壓縮方法
Connection: keep-alive // 要求服務端不要關閉TCP連接,非標準

回應格式如下
HTTP/1.0 200 OK // 協議版本 狀態碼 狀態描述
Content-Type: text/plain //告訴客戶端數據的格式
Content-Length: 139099
Expires: Thu,05 Dec 1997 16:00:00 GMT
Last-Modified: Wed,5 August 1996 15:55:28 GMT
Server: Apache 0.84
Content-Encoding:gzip // 數據壓縮方法
Connection: keep-alive // 告訴客戶端不關閉TCP連接,非標準

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,每個值包括一級類型/二級類型
廠商可以自定義類型
MIME type可以在尾部加參數,如下
Content-Type:text/html;charset=utf-8 // 發送的是網頁編碼是UTF-8
MIME type可以寫在網頁中如下
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>

Content-Length: 3456 // 告訴瀏覽器本次回應的長度,後面屬於下一個回應
區分數據包屬於哪一個回應,聲明本次回應的長度

主要缺點:每個TCP連接只能發送一個請求,發送完畢就關閉

HTTP1.1
引入持久連接,即TCP連接默認不關閉,可以被多個請求復用,在一段時間沒有活動後,主動關閉連接。
規範做法客戶端在最後一個請求時發送Connection: close,明確告訴服務器關閉連接
大多數瀏覽器允許同時建立6個持久連接

管道機制在同一個TCP連接裏面,客戶端可以同時發送多個請求

Transfer-Encoding: chunked // 表明回應將由數量不定的數據塊組成
每個非空的數據塊之前會與一個16進制的數值表示塊的長度,最後一個大小為0表示本次回應數據發送完成
例子:
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

3
con
2
wo
0

增加了動詞方法:PUT,PATCH,HEAD,OPTIONS,DELETE
客戶端請求頭信息增加Host字段
Host: 技術分享www.example.com // 指定服務器的域名

缺點:數據通信是按次序進行的,如果碰到回應特別慢後序請求要排隊等著,這就是"隊頭堵塞"
解決方法一減少請求數
方法二多開持久連接

HTTP/2
是一個二進制協議,頭信息和數據體都是二進制,統稱為幀(frame)包括頭信息幀和數據幀

多工:在一個連接裏客戶端和瀏覽器同時發送多個請求或回應,不用按照順序一一對應。(即服務器同時受到a,b兩個請求,先回應a請求發現過程非常耗時,會發送給a已經處理好的部分,然後回應b請求完成後,在發送a剩下部分)

將每個請求或回應的所有數據包稱為一個數據流(stream),都有一個獨一無二的編號,客戶端發出的數據流ID統一為奇數,服務器發出的ID為偶數
客戶端可以指定數據流的優先級,優先級越高服務器越早回應

引入了頭信息壓縮機制(header compression),一方面頭信息使用gzip或compress壓縮後發送,另一方面客戶端和服務端同時維護一張表,所有字段會存在表裏生成一個索引,只發送索引號

允許未經請求主動向客戶端發送資源即:服務器推送(server push)
場景:客戶端請求一個網頁裏面包含很多靜態資源,服務器預期到客戶端請求頁面後會再請求靜態資源,就主動把這些靜態資源和網頁一起發給客戶端了

HTTP 協議入門-筆記