HTTP 各個版本之間的區別

什麼是HTTP協議?

HTTP協議全稱HyperText Transfer Protocol,中文名超文本傳輸協議。是互聯網上應用最爲廣泛的一種網絡協議。HTTP是基於TCP/IP協議的應用層協議,不涉及數據包的傳輸,主要是規定了客戶端和服務器之間的通信格式。默認使用80端口。現在HTTP已經演化出了很多個版本。

HTTP/0.9

HTTP 0.9是最早發現的一個版本,在1991年發佈,只接受GET一種請求方法,並且不支持請求頭。只支持純文本一種內容,服務器只能迴應HTML格式的字符串,裏邊不能插入圖片。HTTP 0.9具有典型的無狀態性,每個事務獨立進行處理,事務結束時就釋放這個連接。由此可見,HTTP協議的無狀態特點在其第一個版本0.9中已經成型。

GET /index.html

HTTP/1.0

1) HTTP 1.0是HTTP協議的第二個版本在1996年發佈,如今仍然被廣泛使用,尤其是在代理服務器中。

2) 1.0版本不僅僅支持GET命令還有POST和HEAD等請求方法。

3) HTTP的請求和迴應格式也發生了變化,除了要傳輸的數據之外,每次通信都包含頭信息,用來描述一些信息。

4) 不再侷限於0.9版本的HTML格式,根據Content-Type可以支持多種數據格式,這使得互聯網不僅僅可以用來傳輸文字,還可以傳輸圖像、音頻、視頻等二進制文件。

5) 同時也開始支持cache,就是當客戶端在規定時間內訪問統一網站,直接訪問cache即可。

6) 除了數據部分,每次通信都必須包括頭信息(HTTP header)。

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

8) 但是1.0版本的工作方式是每次TCP連接只能發送一個請求,當服務器響應後就會關閉這次連接,下一個請求需要再次建立TCP連接,就是不支持 keep-alive。 TCP連接的建立成本很高,因爲需要客戶端和服務器三次握手,並且開始時發送速率較慢(slow start)。所以,HTTP 1.0版本的性能比較差。隨着網頁加載的外部資源越來越多,這個問題就愈發突出了。爲了解決這個問題,有些瀏覽器在請求時,用了一個非標準的Connection字段。

HTTP/1.1

1) 最大變化,就是引入了持久連接(persistent connection),即TCP連接默認不關閉,可以被多個請求複用,不用聲明Connection: keep-alive。客戶端和服務器發現對方一段時間沒有活動,就可以主動關閉連接。不過,規範的做法是,客戶端在最後一個請求時,發送Connection: close,明確要求服務器關閉TCP連接。

2) 加入了管道機制,在同一個TCP連接裏,允許多個請求同時發送,增加了併發性,進一步改善了HTTP協議的效率。舉例來說,客戶端需要請求兩個資源。以前的做法是,在同一個TCP連接裏面,先發送A請求,然後等待服務器做出迴應,收到後再發出B請求。管道機制則是允許瀏覽器同時發出A請求和B請求,但是服務器還是按照順序,先回應A請求,完成後再回應B請求。

3) 一個TCP連接現在可以傳送多個迴應,勢必就要有一種機制,區分數據包是屬於哪一個迴應的。這就是Content-length字段的作用,聲明本次迴應的數據長度。

4) 分塊傳輸編碼,使用Content-Length字段的前提條件是,服務器發送迴應之前,必須知道迴應的數據長度。對於一些很耗時的動態操作來說,這意味着,服務器要等到所有操作完成,才能發送數據,顯然這樣的效率不高。更好的處理方法是,產生一塊數據,就發送一塊,採用"流模式"(stream)取代"緩存模式"(buffer)。因此,1.1版規定可以不使用Content-Length字段,而使用"分塊傳輸編碼"(chunked transfer encoding)。只要請求或迴應的頭信息有Transfer-Encoding字段,就表明迴應將由數量未定的數據塊組成。

5) 新增了請求方式PUT、PATCH、OPTIONS、DELETE等。

6) 客戶端請求的頭信息新增了Host字段,用來指定服務器的域名。

7) HTTP/1.1支持文件斷點續傳,RANGE:bytes,HTTP/1.0每次傳送文件都是從文件頭開始,即0字節處開始。RANGE:bytes=XXXX表示要求服務器從文件XXXX字節處開始傳送,斷點續傳。即返回碼是206(Partial Content)

HTTP/2.0

1)二進制協議: HTTP/1.1 版的頭信息肯定是文本(ASCII編碼),數據體可以是文本,也可以是二進制。HTTP/2 則是一個徹底的二進制協議,頭信息和數據體都是二進制,並且統稱爲"幀"(frame):頭信息幀和數據幀。

2)多工: HTTP/2 複用TCP連接,在一個連接裏,客戶端和瀏覽器都可以同時發送多個請求或迴應,而且不用按照順序一一對應,這樣就避免了"隊頭堵塞"(HTTP2.0使用了多路複用的技術,做到同一個連接併發處理多個請求,而且併發請求的數量比HTTP1.1大了好幾個數量級)。
舉例來說,在一個TCP連接裏面,服務器同時收到了A請求和B請求,於是先回應A請求,結果發現處理過程非常耗時,於是就發送A請求已經處理好的部分, 接着迴應B請求,完成後,再發送A請求剩下的部分。

3)頭信息壓縮: HTTP 協議不帶有狀態,每次請求都必須附上所有信息。所以,請求的很多字段都是重複的,比如Cookie和User Agent,一模一樣的內容,每次請求都必須附帶,這會浪費很多帶寬,也影響速度。
HTTP/2 對這一點做了優化,引入了頭信息壓縮機制(header compression)。一方面,頭信息使用gzip或compress壓縮後再發送;另一方面,客戶端和服務器同時維護一張頭信息表,所有字段都會存入這個表,生成一個索引號,以後就不發送同樣字段了,只發送索引號,這樣就提高速度了。

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

意思是說,當我們對支持HTTP2.0的web server請求數據的時候,服務器會順便把一些客戶端需要的資源一起推送到客戶端,免得客戶端再次創建連接發送請求到服務器端獲取。這種方式非常合適加載靜態資源。
服務器端推送的這些資源其實存在客戶端的某處地方,客戶端直接從本地加載這些資源就可以了,不用走網絡,速度自然是快很多的。

總結

HTTP/0.9:功能撿漏,只支持GET方法,只能發送HTML格式字符串。
HTTP/1.0:支持多種數據格式,增加POST、HEAD等方法,增加頭信息,每次只能發送一個請求(無持久連接)
HTTP/1.1:默認持久連接、請求管道化、增加緩存處理、增加Host字段、支持斷點傳輸分塊傳輸等。
HTTP/2.0:二進制分幀、多路複用、頭部壓縮、服務器推送

總結來自博文:https://blog.csdn.net/qq_22238021/article/details/81197157

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章