1. 程式人生 > 實用技巧 >HTTP協議基礎

HTTP協議基礎

1. HTTP 定義

HTTP(Hyper Text Transfer Protocol, 超文字傳輸協議),HTTP 是一個在計算機世界裡專門在兩點之間傳輸超文字(文字、圖片、音訊、視訊等)等資料的約定和規範。HTML 就是最常見的超文字了,它本身只是純文字檔案,但內部用很多標籤定義了圖片、視訊等的連結,再經過瀏覽器的解釋,呈現給我們的就是一個文字、有畫面的網頁了。

2.HTTP 是一個無狀態協議

  • 無狀態的優勢:因為伺服器不需要額外的資源來記錄狀態HTTP 的狀態資訊,可減輕伺服器的負擔,能夠把更多的 CPU 和記憶體用來對外提供服務。
  • 無狀態的不足:既然伺服器沒有記憶能力,它在完成有關聯性的操作時會非常麻煩。 例如登入->新增購物車->下單->結算->支付,這系列操作都要知道使用者的身份才行。但伺服器不知道這些請求是有關聯的
    ,每次都要問一遍身份資訊。 這樣每操作一次,都要驗證資訊。
  • 對於無狀態的問題,解法方案有很多種,其中比較簡單的方式用 Cookie 技術。

3. 層次結構

_______________
|HTTP
|____|____TLS SSL_
|
|___TCP____
|
|___IP_____
|
|__鏈路層__

由結構可知:

  • http是一個應用層協議
  • HTTPS 是在 HTTP 與 TCP 層之間增加了 SSL/TLS 安全傳輸層,HTTP/3 甚至把 TCP 層換成了基於 UDP 的 QUIC。
  • http是基於TCP的連線

4.埠號

  • http的埠號為 80
  • https的埠號為 443

5. http報文格式

5.1. 請求報文(示例
GET /somedir/page.html HTTP/1.1 /*請求行, 結構為: 方法欄位+url欄位+http協議版本*/
Host: www.baidu.com /*定義了目標所在主機*/
Connection: Keep-Alive /*HTTP/1.1 版本的預設連線都是持久連線,但為了相容老版本的 HTTP,需要指定 */
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Firefox/13.0.1 /*定義使用者代理,及瀏覽器型別*/

Accept-langugae: zh-CN,zh;q=0.9,en;q=0.8 /*請求物件的語言版本,伺服器沒有就使用預設版本*/
/*附加回車換行*/

(2)說明:

第一行叫做請求行,結構為: 方法欄位+url欄位+http協議版本
報文是普通的ASCII文字書寫的
每行用回車換行(\r\n)結束
最後一行附加有回車換行
該報文有5行,實際上可以有一行或者多行

5.2. HTTP首部欄位

首部欄位是由首部欄位名欄位值構成,中間用冒號“:”隔開。欄位值對應單個首部欄位可以有多個值,用逗號“,”隔開。

5.3 根據實際用途,分為四種類型

  • 通用首部欄位:請求報文和響應報文兩方都會使用的首部。

  • 請求首部欄位:從客戶端向伺服器傳送請求報文時使用的首部。

  • 響應首部欄位:從伺服器向客戶端返回響應報文時使用的首部。

  • 實體首部欄位:針對請求報文和響應報文的實體部分使用的首部。

注意:在HTTP協議通訊互動中使用到的首部欄位不限於RFC2616中定義的上面的47種,還有一些非正式的首部欄位,比如 Cookie、Set-Cookie和Content-Disposition等,統一歸納在RFC4229 HTTP Header Field Registrations中。

5.3HTTP首部欄位根據定義快取代理非快取代理的行為分為兩種型別:

  • 端到端首部(End-to-end Header)

此類別中的首部會轉發給請求/響應對應的最終接受目標,而且必須儲存在由快取生成的響應中,另外規定它必須被轉發。

  • 逐跳首部(Hop-by-hop Header)

此類別中的首部只對單次轉發有效,會因通過快取或代理而不再轉發;http1.1和之後的版本,如要使用該首部,需提供Connection首部欄位。

HTTP/1.1中的逐跳首部欄位(除了這8個,其他所有欄位都屬於端到端首部)。

Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade。

6. HTTP 常見的狀態碼:

  • GET:GET 方法是安全且冪等的,因為它是隻讀操作,無論操作多少次,伺服器上的資料都是安全的,且每次的結果都是相同的。
  • POST : POST方法會修改(增刪改)伺服器上的資源,所以是不安全的且多次提交資料就會建立多個資源,所以不是冪等的。
  • HEAD:HEAD方法類似於GET方法,伺服器收到HEAD方法時,會用一個http報文響應,不返回請求物件
  • PUT : PUT請求的目的是用來替換整個目標資源,PUT請求具有冪等性(idempotent);
  • DELETE: 刪除伺服器上指定物件.

7. TTP/1.1、HTTP/2、HTTP/3 演變

7.1 HTTP/1.1 相比 HTTP/1.0 效能上的改進:

  1. 使用 TCP 長連線的方式改善了 HTTP/1.0 短連線造成的效能開銷。
  2. 支援管道(pipeline)網路傳輸,只要第一個請求發出去了,不必等其回來,就可以發第二個請求 出去,可以減少整體的響應時間。

7.2 HTTP/1.1 效能瓶頸:

  1. 請求 / 響應頭部(Header)未經壓縮就傳送,首部資訊越多延遲越大,只能壓縮 Body 的部分。每次互相傳送相同的首部造成的浪費較多;
  2. 伺服器是按請求的順序響應的,如果伺服器響應慢,會招致客戶端一直請求不到資料,造成隊頭阻塞;
  3. 沒有請求優先順序控制; 請求只能從客戶端開始,伺服器只能被動響應。