[TOC]
## 介紹
### HTTP
超文本傳輸協議(HTTP)是用于傳輸諸如HTML的超媒體文檔的應用層協議。它被設計用于Web瀏覽器和Web服務器之間的通信,但它也可以用于其他目的。
## 1. HTTP0.9
* 僅支持GET請求方法,并且僅能請求訪問HTML格式的資源。用于網頁內容獲取。
~~~
get index.html
~~~
## 2. HTTP1.0
* 支持GET, POST 和 HEAD請求方法
* 請求與回應格式發生更改,除了傳輸數據外,每次通信包含頭信息(header),用于描述一些信息
* 支持設置 `Content-Type` 請求訪問多種數據格式;
* 新增狀態碼(status code)、多字符集支持、多部分發送(multi-part type)、權限(authorization)、緩存(cache)、內容編碼(content encoding)等。
> 在1.0版本中,瀏覽器每次請求都需要建立新的TCP連接,服務器完成請求后關閉這次連接。也就是說不支持 keep alive
>
> 由于TCP連接的新建成本高,所以1.0版本性能較差。
## 3. HTTP1.1
* 在1.0基礎上,新增OPTIONS, PUT, DELETE, TRACE 和 CONNECT請求方法
* 支持長連接,TCP連接默認不關閉(可在客戶端發送總后一個請求時,發送 `Connection: close`),可以被多個請求復用,即一個TCP連接可允許多個HTTP請求
* 加入管道機制:客戶端可同時發送多個請求,服務器會根據接收的順序,依次回應。(容易出現隊頭堵塞的問題:需要返回的數據過大時,后續請求得等待回應完成)
* 增加狀態碼100,客戶端事先只發送一個只帶頭域的請求,服務器接收此請求則返回100,客戶端還需發送帶實體的完整請求。
## 4. HTTP2.0
> https支持的基礎上,增加的一些內容、復雜度
* 增加雙工模式,即不僅客戶端可同時發送多個請求,服務端也能同時處理多個請求。
* 新的二進制格式:http1.0、1.1的解析是基于文本,2.0引進二進制分幀(在應用層與傳輸層間增加二進制分幀層),將所有數據進行分割,并采用二進制格式編碼。改進傳輸性能,實現低延遲高吞吐量
* 支持多路復用:同一個鏈接可并發處理多個請求
* 壓縮header,從1.0開始添加header每次通信時傳遞,壓縮后header數據體積更小,傳輸更快。
## 5. HTTP1.1 與 HTTP2.0 測試結果
>[success] 說明:
> 測試 http2.0 的前端服務器配置在上面兩個章節已做說明,另外:
> 1. 受網絡硬條件限制,測試結果可能有所偏差,但可通過比較其他因素,判斷最終測試結果
> 2. http2.0 測試需要前后端都配置以支持 http2 ,兩者缺一不可
> 3. post 測試請求時上傳數據到服務器并再由服務器返回上傳完成的數據
### 5.1 HTTP1.1 get 請求測試
HTTP1.1 get 請求三次的結果圖

#### 5.1.1 請求耗時分析
HTTP1.1 第一次 get 請求,與 HTTP2.0 相比,在初始化連接時,因不含有 SSL 握手,響應速度略快

第二次 get 請求耗時相對較少,不再有 DNS Lookp、initial connection,同樣的第三次亦如此

### 5.2 HTTP2.0 get 請求測試
HTTP2.0 get請求三次的結果圖

#### 5.2.1 請求耗時分析
HTTP2.0 第一次 get 請求耗時較久,除網絡因素外,是由于 DNS Lookp(域名解析)、initial connection(初始化連接)、SSL(SSL握手,屬于初始化連接)

第二次 get 請求耗時相對較少,不再有 DNS Lookp、initial connection,同樣的第三次亦如此

### 5.3 http1.1 多次 post 請求測試

### 5.4 http2.0 多次 post 請求測試

### 5.5 測試結果表格展示
>[warning] post 請求測試結果截圖說明與get請求基本相似,不再詳細說明。受網絡環境因素影響,所有測試數據僅供參考
| | http1.1 | http2.0 |
| --- | --- |--- |
| 測試請求次數 | 3次 | 3次 |
| get 請求時長 | 17ms 8ms 9ms | 66ms 11ms 10ms |
| get 請求數據量 | 34.3kb | 34.3kb |
| post 請求時長 | 17ms 2ms 2ms | 62ms 7ms 5ms |
| post 請求上傳數據量 | 43.8kb | 43.8kb |
### 5.6 結論:
* HTTP2.0 在第一次數據請求時,會因為初始化連接(TCP握手+SSL握手),響應速度會慢于HTTP1.1,但在之后,同一連接再次請求數據時,不再會有初始化連接以及域名解析,HTTP1.1 亦如此,兩者響應速度相差不多,但這與預期所想不一致,預想的是 http2.0 快于 http1.1