HTTP的世界觀(附HTTP/3中文翻譯)

觀感度:🌟🌟🌟🌟🌟html

口味:黑糖珍珠前端

烹飪時間:15min


git

前端圈技術的爆發式增加隨之而來的開發人員學不動的疲憊感、焦慮感和不想跳出溫馨圈的拖延懶惰。github

jQuery華麗謝幕,React v16已經普及、Angular9和Vue3即將發佈。三大框架愈來愈貼近WebComponents標準。 TypeScript遍地開花,小程序日益火爆,快應用/PWA緊隨其後……算法

站在浪潮之巔的咱們最須要的是停下來思考,轟轟烈烈的技術本質是什麼?小程序

其實,轟轟烈烈的技術本質,是基礎知識和核心概念瀏覽器

看你這篇題目的文章,是要講HTTP咯?HTTP那麼簡單,咱們你們天天都用,有什麼好講的?安全

在停下來思考技術本質的同時,咱們也要不斷的提升本身的認識層次,你所謂的簡單是由於你沒有聽到「遙遠的哭聲」。服務器

(shout out to 男神黃執中)網絡

有請咱們今天的主角登場:HTTP

我將帶你從HTTP的歷史發展到各版本迭代主要特性來從全局的角度從新認識HTTP。

HTTP的世界觀

先來明確一下時間線,回到30年前的那個春天。

一切的一切都始於1989年的3月,萬維網之父蒂姆·伯納斯·李(Tim Berners-Lee)的一篇論文,創造了萬維網,創造了HTTP。

  • 1991年HTTP/0.9發佈 (沒有RFC,版本號是後加上去的)

  • 1996年5月HTTP/1.0RFC1945發佈

  • 1997年1月HTTP/1.1發佈 RFC2616是當前最新版本

  • 2014年HTTP/1.1再次修訂,將大文檔拆分爲六份較小的文檔, RFC7230-7235

  • 2015年HTTP/2發佈 RFC7540 (基於谷歌的SPDY協議)

  • 2018年,互聯網標準化組織IETF提議將HTTP over QUIC改名爲HTTP/3

若是但願全面的瞭解HTTP/3,推薦 Daniel Stenberg(CURL 做者)的HTTP/3詳解

固然若是你想看最新同步的中文,能夠看我翻譯的版本。 歡迎指正錯誤和StarHTTP/3詳解中文版

縱觀HTTP的歷史發展長河,究其緣由,是技術和需求一直在推進着它的發展。

HTTP是什麼?

HTTP是一個在計算機世界裏專門在兩點之間傳輸文字、圖片、音頻、視頻等超文本數據的約定和規範。

HTTP一般跑在TCP/IP協議棧之上,依靠IP協議實現尋址和路由TCP協議實現可靠數據傳輸DNS協議實現域名查找SSL/TLS協議實現安全通訊。固然,WebSocket、HTTPDNS依賴於HTTP。

HTTP/0.9

GET/index.html
複製代碼

HTTP/0.9當時是爲了學術交流,基於請求和響應的模式,在網絡中傳輸HTML超文本的內容。

如上所示,只有一個請求行,沒有HTTP請求頭和請求體。一樣,服務器也沒有響應頭信息,只是返回了數據。

由於都是HTML格式的文件,決定了返回的文件內容經過ASCII字符流進行傳輸。

HTTP/1.0

1994年低開啓撥號上網,網景也在同年推出了第一款瀏覽器,人們對萬維網的需求再也不僅侷限於學術交流。

W3C和HTTP工做組HTTP-WG也在這個時代建立。爲了知足人們對瀏覽器的需求(不光是HTML,還有CSS、JS、圖片、音視頻等),文件格式再也不侷限於ASCII編碼。

HTTP/1.0的解決辦法是引入了請求頭和響應頭。

accept: text/html
accept-encoding: gzip, deflate, br
accept-Charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh
複製代碼

同時也引入了狀態碼,爲了減輕服務器的壓力,提供了Cache機制。服務器須要統計客戶端的基礎信息(Windows 和 macOS),加入了用戶代理字段

HTTP/1.1

改進持久鏈接

一個TCP鏈接上能夠傳輸多個HTTP請求,只要瀏覽器或者服務器沒有斷開鏈接,該TCP會一直保持。

持久鏈接是默認開啓的,若是想要關閉,在請求頭中加上Connection:close便可關閉。

目前瀏覽器中對於同一個域名,默認容許同時創建6個TCP持久鏈接。

不成熟的HTTP管線化

HTTP/1.1 中試圖經過管線化的技術來解決隊頭阻塞的問題。可是由於各類緣由,被各大廠商放棄治療了。

增長對虛擬主機的支持

HTTP/1.0中每一個域名都只綁定惟一的IP地址,所以一個服務器只能支持一個域名。

可是隨着虛擬主機技術的發展,一臺物理主機上綁定多個虛擬主機的需求大大提高,每一個虛擬主機都有本身單獨的域名,這些單獨的域名都公用同一個IP地址。

所以,請求頭中也增長了Host字段,表示當前的域名地址,服務器可根據不一樣的Host值作不一樣的處理。

增長對動態生產內容的支持

HTTP/1.0須要在響應頭中設置完整的數據大小Content-Length:900,這樣,瀏覽器就能夠根據設置的數據大小來接收數據。

因爲服務器端技術發展,頁面都是動態生成的,傳輸數據以前並不知道最終數據大小, 致使瀏覽器不知道什麼時候會接受完全部的文件數據。

HTTP/1.1經過引入Chunk transfer機制來解決問題,服務器將數據分割成若干個任意大小的數據塊,每一個數據塊發送時會附上上一個數據塊的長度,最後使用一個長度爲0的塊做爲發送數據完成的標誌。

客戶端Cookie、安全機制

HTTP1.1引入了客戶端Cookie機制安全機制

HTTP/2

HTTP/1.1的缺陷

對帶寬的利用率不理想

三個問題致使
  • TCP 的慢啓動

  • 同時開啓了多條 TCP 鏈接,那麼這些鏈接會競爭固定的帶寬

  • HTTP/1.1 隊頭阻塞的問題

HTTP/2多路複用

HTTP/2使用多路複用機制解決了上述問題。

一個域名只使用一個 TCP 長鏈接和消除隊頭阻塞問題。經過引入二進制分幀層,實現了 HTTP 的多路複用技術。

HTTP/2服務器推送

服務器能夠提早將數據推送到瀏覽器,瀏覽器有權選擇是否接受。瀏覽器發送RST_STREAM幀能夠選擇拒收。

HTTP/2頭部壓縮

頭部的壓縮大大的提高了傳輸效率。HTTP/2開發了「HPACK」算法,在客戶端和服務器創建「字典」,用索引號表示重複的字符串,還採用哈夫曼編碼來壓縮整數和字符串。

HTTP/2能夠設置請求的優先級

能夠設置讓某些重要的數據優先被服務器處理並返回。

HTTP/3

HTTP/2的缺陷

TCP的隊頭阻塞

在 TCP 傳輸過程當中,因爲單個數據包的丟失而形成的阻塞稱爲 TCP 上的隊頭阻塞。 HTTP/2只解決了應用層面的隊頭阻塞,隊頭阻塞的問題還存在於TCP協議自己。

TCP創建鏈接的延時

TCP以及TCP+TLS創建鏈接的所產生的延時也是影響傳輸效率的一個主要因素。

TCP協議僵化

中間件僵化

咱們把在互聯網的各處搭建的設備叫作中間設備(中間件),好比路由器、NAT、防火牆、交換機等,它們一般依賴一些不多升級的軟件,這些軟件使用了大量的 TCP 特性,設置以後便不多進行更新。這就對咱們咱們更新TCP的時候形成了很大的困難, 新協議的數據包通過這些中間件時,它們不會去理解包的內容從而丟棄掉這些數據包。

操做系統

由於 TCP 協議都是經過操做系統內核來實現的,應用程序只能使用不能修改。一般操做系統的更新都滯後於軟件的更新,因此想要更新操做系統內核中的TCP協議也是很是困難的。

QUIC協議

HTTP/3 選擇了一個折衷的方法——UDP 協議,基於 UDP 實現了相似於 TCP 的多路數據流、傳輸可靠性等功能,咱們把這套功能稱爲QUIC 協議

  • 實現了相似 TCP 的流量控制、傳輸可靠性的功能

  • 集成了 TLS 加密功能

  • 實現了 HTTP/2 中的多路複用功能

  • 實現了快速握手功能

關於HTTP/3更多詳細的內容,請移步我翻譯成中文版的HTTP/3詳解

歡迎Star倉庫連接和提出錯誤或不對的地方。

參考:

《瀏覽器工做原理與實踐》

《透視HTTP協議》

《趣談網絡協議》

《Web協議詳解與抓包實戰》

交流

歡迎關注個人我的公衆號,優質文章將同步推送。

你的前端食堂,記得按時吃飯。

相關文章
相關標籤/搜索