前端---梳理 http 知識體系 2

風吹De麥浪發表於2021-11-25

 

為什麼要有HTTPS

  HTTP 天生具有明文的特點,整個傳輸過程完全透明,任何人都能夠在鏈路中截獲修改或者偽造請求 / 響應報文,資料不具有安全性。僅憑HTTP 自身是無法解決的,需要引入新的HTTPS協議,簡單的說就是不安全。

什麼是HTTPS

   HTTPS是一種通過計算機網路進行安全通訊的傳輸協議,經由HTTP進行通訊,利用SSL/TLS建立安全通道,加密資料包

  HTTPS 是一個“非常簡單”的協議,RFC 文件很小,只有短短的 7 頁,裡面規定了新的協議名“https”,預設埠號 443,至於其他的什麼請求 - 應答模式報文結構請求方法URI頭欄位連線管理等等都完全沿用 HTTP,沒有任何新的東西。

  也就是說,除了協議名http和埠號 80 這兩點不同,HTTPS 協議在語法、語義上和 HTTP 完全一樣,優缺點也照單全收(當然要除去明文和不安全)

HTTPS 是怎麼做到安全性?

  祕密就在於 HTTPS 名字裡的“S”,它把 HTTP 下層的傳輸協議由 TCP/IP 換成了 SSL/TLS,由HTTP over TCP/IP變成了HTTP over SSL/TLS,讓 HTTP 執行在了安全的 SSL/TLS 協議上,收發報文不再使用 Socket API,而是呼叫專門的安全介面。

 

  HTTPS 並不是一個新的應用層協議,它其實就是 HTTP + TLS/SSL 協議組合而成,而安全性的保證正是 SSL/TLS 所做的工作 。
  https = http + ssl/tls 

SSL/TLS

  SSL 即安全套接層(Secure Sockets Layer),在 OSI 模型中處於第 5 層(會話層),網景公司於 1994 年發明,有 v2 和 v3 兩個版本,而 v1 因為有嚴重的缺陷從未公開過。

  SSL 發展到 v3 時已經證明了它自身是一個非常好的安全通訊協議,於是網際網路工程組 IETF 在 1999 年把它改名為 TLS(傳輸層安全,Transport Layer Security),正式標準化,版本號從 1.0 重新算起,所以 TLS1.0 實際上就是 SSLv3.1。

  簡單的理解就是安全傳輸層協議(TLS)用於在兩個通訊應用程式之間提供保密性和資料完整性的作用

  TLS 協議包括兩個協議組―― TLS 記錄協議和 TLS 握手協議

  TLS 由記錄協議、握手協議、警告協議、變更密碼規範協議、擴充套件協議等幾個子協議組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術,具體可以查閱相關資料進一步瞭解。

HTTP/2 的理解

  你一定很想知道,為什麼 HTTP/2 不像之前的1.0、1.1、那樣叫2.0呢?

  這個也是很多初次接觸 HTTP/2 的人問的最多的一個問題,對此 HTTP/2 工作組特別給出瞭解釋。

 

  他們認為以前的1.0、1.1造成了很多的混亂和誤解,讓人在實際的使用中難以區分差異,所以就決定 HTTP 協議不再使用小版本號,只使用大版本號,從今往後 HTTP 協議不會出現 HTTP/2.0、2.1,只會有HTTP/2,HTTP/3……

 

國內哪些網站用了HTTP2

 目前還是很多公司都升級到了HTTP/2 比如 蘋果官網、騰訊網、csdn、掘金 等

 

相容http/1

  由於 HTTPS 已經在安全方面做的非常好了,所以 HTTP/2 的唯一目標就是改進效能,且相容HTTP1.x 版本的。

 

HTTP/2特點

頭部壓縮

  HTTP/2 對報文的頭部做了一個大的改變,由於報文Head一般會攜帶 User-Agent、Cookie、Accept、Server、Range  等許多固定的欄位,多達幾百甚至幾千位元組,而 Body 卻經常只有幾十位元組,所以導致頭部偏重。HTTP/2 使用 HPACK 演算法進行頭部壓縮。
 

二進位制分幀

  二進位制分幀指的是傳輸的都是二進位制,而幀只是一個傳輸單位。把原來的Header+Body的訊息報文格式,拆分為一個一個的二進位制“”(Frame),

HEADERS幀存放頭資料、DATA幀存放實體資料。

  這樣子的話,就是一堆亂序的二進位制幀,它們不存在先後關係,因此不需要排隊等待,解決了HTTP隊頭阻塞問題。

 

 虛擬的流--多路複用

  二進位制分幀把資料都拆分為一個一個的二進位制資料包,那麼傳輸過去之後資料怎麼組裝起來呢?

HTTP/2 為此定義了一個流(Stream)的概念,它是二進位制幀的雙向傳輸序列,同一個訊息往返的幀會分配一個唯一的流 ID。你可以把它想象成是一個虛擬的“資料流”,在裡面流動的是一串有先後順序的資料幀,這些資料幀按照次序組裝起來就是 HTTP/1 裡的請求報文和響應報文。

  因為流是虛擬的,實際上並不存在,所以 HTTP/2 就可以在一個 TCP 連線上用流同時傳送多個拆分之後的二進位制幀資料包,這就是常說的多路複用( Multiplexing)——多個往返通訊都複用一個連線來處理。

如何理解h2 中的流

  客戶端將多個請求分成不同的流,然後每個流裡面在切成一個個二進位制幀,傳送的時候是按二進位制幀傳送。每個幀存著一個流ID來表示它屬於的流,服務端收到請求的時候將幀按流ID進行拼接。

  從傳輸的角度來看流是不存在的,只是看到了一個個幀,所以說流是虛擬的,如圖

強化安全

  https 是大勢所趨,通常所能見到的 HTTP/2 都是使用“https”協議名,跑在 TLS 上面。

  為了區分“加密”和“明文”這兩個不同的版本,HTTP/2 協議定義了兩個字串識別符號:

    1、h2表示加密的 HTTP/2

    2、h2c表示明文的 HTTP/2,多出的那個字母c的意思是clear text

 

協議棧對比

 

HTTP/2 小結

  • HTTP 協議取消了小版本號,所以 HTTP/2 的正式名字不是 2.0;
  • HTTP/2 在“語義”上相容 HTTP/1,保留了請求方法、URI 等傳統概念;
  • HTTP/2 使用HPACK演算法壓縮頭部資訊,消除冗餘資料節約頻寬;
  • HTTP/2 的訊息不再是“Header+Body”的形式,而是分散為多個二進位制幀
  • HTTP/2 使用虛擬的“”傳輸訊息,解決了困擾多年的“隊頭阻塞”問題,同時實現了“多路複用”,提高連線的利用率;
  • HTTP/2 也增強了安全性,要求至少是 TLS1.2,而且禁用了很多不安全的密碼套件。

 HTTP2 的核心就是二進位制分幀、流概念、多路複用(永遠都只在一個TCP 連線裡面,因為一個TCP 中虛擬了很多流,一個請求-響應就對應一個流)

隊頭阻塞

  從HTTP/1.0誕生,一直到HTTP/2,在這24年裡,HTTP協議已經做過了三次升級,但是有一個關鍵的技術點是不變的,那就是這所有的HTTP協議,都是基於TCP協議實現的。流水的HTTP,鐵打的TCP,這是因為相對於UDP協議,TCP協議更加可靠。

  HTTP/2廢棄了管道化的方式,而是創新性的引入了幀、訊息和資料流等概念。客戶端和伺服器可以把 HTTP 訊息分解為互不依賴的幀,然後亂序傳送,最後再在另一端把它們重新組合起來。因為沒有順序了,所以就不阻塞了,就有效的解決了HTTP對頭阻塞的問題。

  但是,HTTP/2仍然會存在對頭阻塞的問題,那是因為HTTP/2其實還是依賴TCP協議實現的。

 TCP傳輸過程

  TCP傳輸過程中會把資料拆分為一個個按照順序排列的資料包,這些資料包通過網路傳輸到了接收端,接收端再按照順序將這些資料包組合成原始資料,這樣就完成了資料傳輸。

但是如果其中的某一個資料包沒有按照順序到達,接收端會一直保持連線等待資料包返回(丟包重傳機制),這時候就會阻塞後續請求。這就發生了TCP隊頭阻塞

  http/2 只是解決http 的對頭阻塞,並沒有解決tcp 的對頭阻塞,隊頭阻塞分為兩個層面,一個是HTTP 隊頭阻塞,一個是TCP 隊頭阻塞。

HTTP 對頭阻塞

  HTTP 是一個請求-應答的模式,類似一個佇列,先進先出的模式,後面的一個請求只能等前面的請求好了,才發出請求。

  如果隊首的請求因為處理的太慢耽誤了時間,那麼佇列裡後面的所有請求也不得不跟著一起等待,結果就是其他的請求承擔了不應有的時間成本,造成了阻塞。

  

  在HTTP1.1 中針對HTTP對頭阻塞,增加了併發連線的規則,這也算是空間換時間的思路,瀏覽器與伺服器建立多個TCP連線,現在比較常用的併發連線數已經增加到 6 - 8個,不同的瀏覽器應該不同的實現。

 

  在HTTP2 中增加了流、以及二進位制分幀、多路複用,讓資料包之間可以是亂序的傳送,資料包之間沒有順序的依賴關係,解決HTTP 對頭阻塞的問題,但是底層還是基於TCP 協議,所以還存在TCP 對頭阻塞問題,所以HTTP3 來了。

 

   HTTP3的基本思路,應該跟處理這個HTTP 對頭阻塞差不多,讓各個資料包之間沒有依賴關係,其中一個有問題,不會影響其他連線。

TCP 對頭阻塞

  在HTTP/2 中應用層向下傳輸的資料是做到了亂序,二進位制,但是TCP層的資料包還是有序傳輸,中間一個資料包丟失,會等待該資料包重傳,造成後面的資料包的阻塞,這也就是丟包重傳機制因為TCP在丟包的情況下必須等待重傳確認,此時其他包就算到達緩衝區,上層應用也是無法拿出來的。

總結

  做興趣使然的Hero,發現問題,解決問題。

 

 

 

相關文章