面試的時候被問到http與https的區別、以及http/1.x與http/2的區別,之前偶爾有了解,但是沒有系統的學習,所以答的就比較模棱兩可,結果不大如人意,於是狠下心來。。。學唄
一、首先說http與https的區別
(一)、了解http與https之前先要知道一下幾個概念:
1、什么是http與https?
2、什么是ssl與tls
1、http(HyperText Transfer Protocol)超文本傳輸協議,https(Hypertext Transfer Protocol Secure)超文本傳輸安全協議,就是http的安全版本。http與https都屬於應用層協議,下一層是TCP(傳輸層協議),https沒有對http作任何修改,https是由http進行通信,但利用SSL/TLS來加密數據包,https是在http與tcp之間加了一個ssl/tls協議。http + 加密 + 認證 + 完整性保護 = https,可以說https是披着ssl/tls外衣的http。那么什么是ssl/tls?
2、ssl/tls:SSL/TLS是HTTP和TCP之間的中轉協議,也是一個應用層協議。我們可以把ssl/tls理解為一個黑盒子,我們把數據丟給http,http把數據丟給ssl/tls,ssl/tls把數據加密后丟給tcp,這就是https。
(二)、http與https的特點
1、http是明文傳輸,所以如果報文被劫持,劫持者完全可以讀懂報文或修改報文,易被監聽、偽裝、篡改,是一種不安全的協議。而https是密文傳輸,它是由http+SSL的結合體,由之前http到tcp,改為了http到SSL到tcp。報文是經過加密的,所以更加安全。
2、https使用需要CA證書,大部分都是付費使用的
3、http默認使用80端口,https默認使用443端口
4、https因為多了一層ssl/tls加密,以及數字證書的握手,數據的加密/解密,以及密鑰的交換與確認,消耗更多的CPU和內存資源,加密范圍也比較有限,黑客攻擊、拒絕服務攻擊、服務器劫持方面幾乎起不到什么作用。最關鍵的,SSL證書信用鏈體系並不安全,特別是在某些國家可以控制CA根證書的情況下,中間攻擊一樣可行。
二、再說http/1.x與http/2的區別
Web 性能的終極目標是減少到用戶端的延遲,讓用戶能夠盡快的打開前端網頁並進行相關交互。盡可能發送少的數據給服務器,從服務端下載盡可能少的數據,盡可能減少往返 (Round Trips) ,客戶端與服務器無論是哪一邊,額外的數據流都會帶來額外的延遲開銷,與此同時也更容易出現擁塞和丟包問題,這無疑嚴重影響了性能。 多余的 Round Trip 同樣會增加延遲,尤其是在移動網絡下(100ms 是讓用戶感覺到系統立即做出響應的時間上限)。
而HTTP/2試圖解決HTTP/1.1的許多缺點和不靈活之處,對比demo在這里。
(一)、HTTP/1.x
Http1.x
缺陷:線程阻塞,在同一時間,同一域名的請求有一定數量限制,超過限制數目的請求會被阻塞。
http1.0
缺陷:瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個 TCP 連接(TCP 連接的新建成本很高,因為需要客戶端和服務器三次握手),服務器完成請求處理后立即斷開 TCP 連接,服務器不跟蹤每個客戶也不記錄過去的請求;
解決方案:添加頭信息——非標准的 Connection 字段 Connection: keep-alive
http1.1
改進點:
1、持久連接
引入了持久連接,即 TCP 連接默認不關閉,可以被多個請求復用,不用聲明 Connection: keep-alive(對於同一個域名,大多數瀏覽器允許同時建立 6 個持久連接)
2、管道機制
即在同一個 TCP 連接里面,客戶端可以同時發送多個請求。
3、分塊傳輸編碼
即服務端沒產生一塊數據,就發送一塊,采用”流模式”而取代”緩存模式”。
4、新增請求方式
PUT:請求服務器存儲一個資源;
DELETE:請求服務器刪除標識的資源;
OPTIONS:請求查詢服務器的性能,或者查詢與資源相關的選項和需求;
TRACE:請求服務器回送收到的請求信息,主要用於測試或診斷;
CONNECT:保留將來使用
缺點:
雖然允許復用 TCP 連接,但是同一個 TCP 連接里面,所有的數據通信是按次序進行的。服務器只有處理完一個請求,才會接着處理下一個請求。如果前面的處理特別慢,后面就會有許多請求排隊等着。這將導致“隊頭堵塞”
避免方式:一是減少請求數(代碼合並、圖片精靈),二是同時多開持久連接(靜態資源分布到不同的域下)。
(二)、HTTP/2.0
特點
采用二進制格式而非文本格式;完全多路復用,而非有序並阻塞的、只需一個連接即可實現並行;使用報頭壓縮,降低開銷服務器推送
1. 二進制協議
HTTP/1.1 版的頭信息肯定是文本(ASCII 編碼),數據體可以是文本,也可以是二進制。HTTP/2 則是一個徹底的二進制協議,頭信息和數據體都是二進制,並且統稱為”幀”:頭信息幀和數據幀。二進制協議解析起來更高效、“線上”更緊湊,更重要的是錯誤更少。
2. 完全多路復用(多路復用的單一長連接)
(1)、單一長鏈接
在HTTP/2中,客戶端向某個域名的服務器請求頁面的過程中,只會創建一條TCP連接,即使這頁面可能包含上百個資源。而之前的HTTP/1.x
一般會創建6-8條TCP連接來請求這100多個資源。單一的連接應該是HTTP2的主要優勢,單一的連接能減少TCP握手帶來的時延(如果是建立在SSL/TLS上面,HTTP2能減少很多不必要的SSL握手,大家都知道SSL握手很慢吧)。
另外我們知道,TCP協議有個滑動窗口,有慢啟動這回事,就是說每次建立新連接后,數據先是慢慢地傳,然后滑動窗口慢慢變大,才能較高速度地傳,這下倒好,這條連接的滑動窗口剛剛變大,http1.x
就創個新連接傳數據(這就好比人家HTTP2一直在高速上一直開着,你HTTP1.x
是一輛公交車走走停停)。由於這種原因,讓原本就具有突發性和短時性的 HTTP 連接變的十分低效。
所以咯,HTTP2中用一條單一的長連接,避免了創建多個TCP連接帶來的網絡開銷,提高了吞吐量。
(2)、多路復用
HTTP2把要傳輸的信息分割成一個個二進制幀,首部信息會被封裝到HEADER Frame,相應的request body就放到DATA Frame,一個幀你可以看成路上的一輛車,只要給這些車編號,讓1號車都走1號門出,2號車都走2號門出,就把不同的http請求或者響應區分開來了。但是,這里要求同一個請求或者響應的幀必須是有有序的,要保證FIFO的,但是不同的請求或者響應幀可以互相穿插。這就是HTTP2的多路復用,是不是充分利用了網絡帶寬,是不是提高了並發度?
更進一步,http2還能對這些流(車道)指定優先級,優先級能動態的被改變,例如把CSS和JavaScript文件設置得比圖片的優先級要高,這樣代碼文件能更快的下載下來並得到執行。
3. 報頭壓縮
HTTP 協議是沒有狀態,導致每次請求都必須附上所有信息。所以,請求的很多頭字段都是重復的,比如 Cookie,一樣的內容每次請求都必須附帶,這會浪費很多帶寬,也影響速度。對於相同的頭部,不必再通過請求發送,只需發送一次;HTTP/2 對這一點做了優化,引入了頭信息壓縮機制;一方面,頭信息使用 gzip 或 compress 壓縮后再發送;另一方面,客戶端和服務器同時維護一張頭信息表(分靜態部分和動態部分),所有字段都會存入這個表,產生一個索引號,之后就不發送同樣字段了,只需發送索引號。
4. 服務器推送
HTTP/2 允許服務器未經請求,主動向客戶端發送資源;通過推送那些服務器任務客戶端將會需要的內容到客戶端的緩存中,避免往返的延遲
參考文獻:
HTTP/2 對現在的網頁訪問,有什么大的優化呢?體現在什么地方?