了解HTTP協議


開始複習網絡基礎了,這個是真學了又忘,忘了又學

1. 簡單的HTTP協議

超文本傳輸協議,規範了瀏覽器和服務器的數據交互,其是基於TCP協議進行連接的,而傳輸的內容就是HTTP

瀏覽器即客戶端發送的HTTP我們稱之為請求報文,反之叫響應報文

1.1 報文的組成

報文首部 + 空行 + 報文主體

請求報文的組成:報文首部(請求方法、請求URI、協議版本、首部字段)、空行、報文主體

響應報文的組成:報文首部(協議版本、狀態碼、原因短語、首部字段)、空行、內容實體

1.2 持久連接

  • keep-alive:保持TCP連接,建立一個TCP連接可進行多次請求和相應
  • 管線化:不用等待響應可直接發送下一個請求

2. 常見的請求方法

請求方法用於告知服務器的意圖

  • GET:獲取資源
  • POST:傳輸實體主體
  • PUT:傳輸文件(一般不使用,沒有驗證)
  • HEAD:獲得報文首部(確認URI有效性、資源更新時間)
  • DELETE:刪除文件(一般不使用,沒有驗證,但和RESTful意義不同了)
  • OPTIONS:預查詢資源支持的方法
  • TRACE:追蹤路徑
  • CONNECT:要求用歲寶協議連接代理(主要SSL/TLS用到)

GET與POST的區別

GET:
獲取資源
請求參數附加在url後面,且有長度限制

POST:
傳輸實體主體
請求信息放入請求體裏面,沒有長度限制
有兩個TCP包,先發送請求頭,待響應100 continue後才發送請數據

3. URI、URL

URI統一資源標識符、URL統一資源定位符,URI包含URL。URL是我們常用的Web的網頁地址,而RUI是任何不止於Web的唯一標識,比如身份證、UUID等

URI格式:

//root:[email protected]:80/dir/index.html?search=test#ch1
 協議 :// 認證信息 @ 服務器地址 : 端口號 / 文件路徑 ? 查詢參數 # 位置標識符

4 協議版本

常見的HTTP協議版本有 1.0 / 1.1 / 2.0 其區別如下:

  • 1.0-1.1
    • 支持長連接:keep-alive
    • Host頭處理:虛擬主機的出現
    • 支持範圍請求:增加range字段,可斷點請求
    • 增多了錯誤狀態碼
    • 增多了緩存處理:增多了緩存控制
  • 1.1-1.2
    • 採用二進制格式:1.1是文本格式,二進制解析高效
    • 報頭壓縮:以前版本大量字段且重複發送
    • 主動推送
    • 完全多路復用:連接共享,每個請求對應一個Id,那麼一個TCP連接上可以有多個請求,可隨機混雜到服務器再歸併

5 狀態碼

負責表示客戶端HTTP請求的返回結果,以三位數字和原因短語組成,類別如下:

類別 原因短語
1XX 信息性 請求正在處理
2XX 成功 請求正常處理完畢
3XX 重定向 需要附加操作以完成請求
4XX 客戶端錯誤 服務器無法處理請求
5XX 服務器錯誤 服務器處理請求錯誤

常見的狀態碼:

  • 101:切換協議

  • 200:請求成功且返回

  • 204:請求成功無返回

  • 206:範圍請求

  • 301:永久重定向

  • 302:臨時重定向(常用)

  • 303:存在另外URI,希望用GET方法

  • 400:請求語法錯誤

  • 401:未認證

  • 403:無權限

  • 404:無此資源

  • 405:不支持該請求方法

  • 500:服務器內部錯誤

  • 503:服務器繁忙

6 首部字段

給瀏覽器或服務器提供報文主體大小、使用語言、認證信息等。其分類如下:

6.1 通用首部字段

  • Connection:控制不再轉發的字段、管理持久連接
Connection:update 、 Connection:keep-alive
  • Date:創建報文的日期時間
  • Trailer:事先聲明報文主體記錄的首部字段,分塊傳輸會用到
  • Transfer-Encoding:規定傳輸報文主體採用的編碼
  • Update:檢測能否使用高級協議(只能用於鄰接的服務器,要配合Connection)

6.2 請求首部字段

  • Host:必須包含在內的主機名
  • Accept:用戶代理能處理的媒體類型eg:text/html
  • Accept-Charset:用戶代理支持的字符集
  • Accept-Encoding:用戶代理支持的內容編碼eg:gzip、identity、compress
  • Accept-Language:用戶代理支持的語言集eg:zh-cn、en-us
  • Authorization:告知服務器用戶代理信息
  • Range:範圍請求eg:Range:bytes=1000-2000
  • Referer:請求的原始URI
  • User-Agent:客戶端程序信息

6.3 響應首部字段

  • Accept-Ranges:是否支持範圍請求eg:none、bytes
  • Age:創建響應過去多長時間,單位秒
  • Localtion:重定向地址,配置302狀態碼
  • Retry-After:告知客戶端多久後再請求
  • Server:告知HTTP的服務器應用程序

6.4 實體首部字段

  • Content-Encoding:實體內容的編碼
  • Content-Length:實體主體大小單位位元組
  • Content-Range:範圍請求資源
  • Content-type:實體內容的媒體類型
  • Expires:資源過期時間

6.5 為Cookie服務的字段

  • Set-cookie:響應字段
  • cookie:發給服務器的字段

7. HTTP協議的瓶頸

  • 一條連接上只可發送一個請求(1.1版本長連接可多個)
  • 請求只能從客戶端開始,不可接收響應外的指令
  • 首部字段未壓縮發送,信息越多越延遲
  • 發送冗長的首部,每次互相發送相同的首部浪費
  • 可任意選擇數據壓縮格式,未強制要求壓縮

應對方法:

7.1 Ajax

利用JavaScript和DOM操作,局部Web頁面更新,響應中減少了傳輸的數據,但並未突破瓶頸

7.2 Comet

通過延遲應答(掛起響應)模擬服務器向客戶端推送消息,需要連接時長變長,但並未突破瓶頸

7.3 SPDY

沒完全改寫HTTP協議,而是在應用層和傳輸層之間通過新的會話層形式運行。可多路復用、請求優先級、壓縮首部、推送、服務器提示功能

突破了瓶頸,但SPDY只是單個域名的多路復用(只對當前網站適用),若請求其他網站則不適用,沒有盛行

7.4 WebSocket

使用HTTP協議就無法完全消除瓶頸,那麼只能使用另外的協議了—-WebSokcet使用全雙工通信,突破瓶頸

一旦建立WebSocket通信,後面都使用這個專用的協議,但由於其使用HTTP來升級協議,那麼發起連接的還是客戶端,升級協議後就沒有區分了

WebSocket特點:推送功能、減少通信量

過程:建立HTTP連接後(TCP三次握手),需要再進行一次升級協議(HTTP字段),成功後使用WebSocket的獨立數據幀(所以WebSocket使用到了TCP、HTTP的功能)

  • 第一步:客戶端發送Update:WebSocket字段、Connection:Update、Sec-WebSocket-Key:XXX
  • 第二步:響應101狀態碼,字段:Sec-WebSocket-Accept:XXX(二者通過算法加密一樣才可連接)

參考

《圖解HTTP》