前端面試查漏補缺--(九) HTTP與HTTPS

shotCat發表於2019-02-23

前言

本系列最開始是為了自己面試準備的.後來發現整理越來越多,差不多有十二萬字元,最後決定還是分享出來給大家.

為了分享整理出來,花費了自己大量的時間,起碼是隻自己用的三倍時間.如果喜歡的話,歡迎收藏,關注我!謝謝!

文章連結

合集篇:

前端面試查漏補缺--Index篇(12萬字元合集) 包含目前已寫好的系列其他十幾篇文章.後續新增值文章不會再在每篇新增連結,強烈建議議點贊,關注合集篇!!!!,謝謝!~

後續更新計劃

後續還會繼續新增設計模式,前端工程化,專案流程,部署,閉環,vue常考知識點 等內容.如果覺得內容不錯的話歡迎收藏,關注我!謝謝!

求一份內推

目前本人也在準備跳槽,希望各位大佬和HR小姐姐可以內推一份靠譜的武漢 前端崗位!郵箱:bupabuku@foxmail.com.謝謝啦!~

TCP/IP協議

在講解HTTP與HTTPS之前,有個知識點必須提前講解下,那就是TCP/IP協議.

從字面意義上講,有人可能會認為 TCP/IP 是指 TCP 和 IP 兩種協議。實際生活當中有時也確實就是指這兩種協議。然而在很多情況下,它只是利用 IP 進行通訊時所必須用到的協議群的統稱。具體來說,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都屬於 TCP/IP 協議。他們與 TCP 或 IP 的關係緊密,是網際網路必不可少的組成部分。TCP/IP 一詞泛指這些協議,因此,有時也稱 TCP/IP 為網際協議群。

網際網路進行通訊時,需要相應的網路協議,TCP/IP 原本就是為使用網際網路而開發制定的協議族。因此,網際網路的協議就是 TCP/IP,TCP/IP 就是網際網路的協議。

更詳細全面的可以檢視 一篇文章帶你熟悉 TCP/IP 協議(網路協議篇二)

TCP協議(傳輸控制協議):應用程式之間的通訊

TCP確保資料包以正確的次序到達,並且嘗試確認資料包的內容沒有改變。 TCP在IP地址之上引埠(port),它允許計算機通過網路提供各種服務。一些埠號為不同的服務保留,而且這些埠號是眾所周知。

服務或者守護程式:在提供服務的機器上,有程式監聽特定埠上的通訊流。例如大多數電子郵件通訊流出現在埠25上,用於wwww的HTTP通訊流出現在80埠上。

當應用程式希望通過 TCP 與另一個應用程式通訊時,它會傳送一個通訊請求。這個請求必須被送到一個確切的地址。在雙方“握手”之後,TCP 將在兩個應用程式之間建立一個全雙工 (full-duplex) 的通訊,佔用兩個計算機之間整個的通訊線路。TCP 用於從應用程式到網路的資料傳輸控制。TCP 負責在資料傳送之前將它們分割為 IP 包,然後在它們到達的時候將它們重組。

TCP/IP 就是TCP 和 IP 兩個協議在一起協同工作,有上下層次的關係。

TCP 負責應用軟體(比如你的瀏覽器)和網路軟體之間的通訊。IP 負責計算機之間的通訊。TCP 負責將資料分割並裝入 IP 包,IP 負責將包傳送至接受者,傳輸過程要經IP路由器負責根據通訊量、網路中的錯誤或者其他引數來進行正確地定址,然後在它們到達的時候重新組合它們。

IP協議(網際協議):計算機之間的通訊

IP協議是計算機用來相互識別的通訊的一種機制,每臺計算機都有一個IP.用來在internet上標識這臺計算機。 IP 負責在因特網上傳送和接收資料包。 通過 IP,訊息(或者其他資料)被分割為小的獨立的包,並通過因特網在計算機之間傳送。IP 負責將每個包路由至它的目的地。

IP協議僅僅是允許計算機相互發訊息,但它並不檢查訊息是否以傳送的次序到達而且沒有損壞(只檢查關鍵的頭資料)。為了提供訊息檢驗功能,直接在IP協議上設計了傳輸控制協議TCP。

HTTP協議

概念

HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪部分內容首先顯示(如文字先於圖形)等。

HTTP是客戶端瀏覽器或其他程式與Web伺服器之間的應用層通訊協議。 在Internet上的Web伺服器上存放的都是超文字資訊,客戶機需要通過HTTP協議傳輸所要訪問的超文字資訊。HTTP包含命令和傳輸資訊,不僅可用於Web訪問,也可以用於其他因特網/內聯網應用系統之間的通訊,從而實現各類應用資源超媒體訪問的整合。

我們在瀏覽器的位址列裡輸入的網站地址叫做URL (Uniform Resource Locator,統一資源定位符)。就像每家每戶都有一個門牌地址一樣,每個網頁也都有一個Internet地址。當你在瀏覽器的地址框中輸入一個URL或是單擊一個超級連結時,URL就確定了要瀏覽的地址。瀏覽器通過超文字傳輸協議(HTTP),將Web伺服器上站點的網頁程式碼提取出來,並翻譯成漂亮的網頁。

HTTP 協議基礎

  • 永遠都是客戶端發起請求,伺服器回送響應 應用 HTTP 協議時,必定是一端擔任客戶端角色,另一端擔任伺服器端角色。僅從一條通訊線路來說,伺服器端和客服端的角色是確定的。HTTP 協議規定,請求從客戶端發出,最後伺服器端響應該請求並返回。換句話說,肯定是先從客戶端開始建立通訊的,伺服器端在沒有接收到請求之前不會傳送響應。

  • 無狀態的協議 HTTP 是一種無狀態協議。協議自身不對請求和響應之間的通訊狀態進行儲存。 也就是說在 HTTP 這個級別,協議對於傳送過的請求或響應都不做持久化處理。這是為了更快地處理大量事務,確保協議的可伸縮性,而特意把 HTTP 協議設計成如此簡單的。可是隨著 Web 的不斷髮展,我們的很多業務都需要對通訊狀態進行儲存。於是我們引入了 Cookie 技術。有了 Cookie 再用 HTTP 協議通訊,就可以管理狀態了。

  • Cookie 管理狀態 Cookie 技術通過在請求和響應報文中寫入 Cookie 資訊來控制客戶端的狀態。 Cookie 會根據從伺服器端傳送的響應報文內的一個叫做 Set-Cookie 的首部欄位資訊,通知客戶端儲存Cookie。當下次客戶端再往該伺服器傳送請求時,客戶端會自動在請求報文中加入 Cookie 值後傳送出去。伺服器端發現客戶端傳送過來的 Cookie 後,會去檢查究竟是從哪一個客戶端發來的連線請求,然後對比伺服器上的記錄,最後得到之前的狀態資訊。

  • URI 定位資源 HTTP 協議使用 URI 定位網際網路上的資源。正是因為 URI 的特定功能,在網際網路上任意位置的資源都能訪問到。

  • 持久連線 HTTP 協議的初始版本中,每進行一個 HTTP 通訊都要斷開一次 TCP 連線。比如使用瀏覽器瀏覽一個包含多張圖片的 HTML 頁面時,在傳送請求訪問 HTML 頁面資源的同時,也會請求該 HTML 頁面裡包含的其他資源。因此,每次的請求都會造成無畏的 TCP 連線建立和斷開,增加通訊量的開銷。 為了解決上述 TCP 連線的問題,HTTP/1.1 和部分 HTTP/1.0 想出了持久連線的方法。其特點是,只要任意一端沒有明確提出斷開連線,則保持 TCP 連線狀態。旨在建立一次 TCP 連線後進行多次請求和響應的互動。在 HTTP/1.1 中,所有的連線預設都是持久連線。

  • 管線化 持久連線使得多數請求以管線化方式傳送成為可能。以前傳送請求後需等待並接收到響應,才能傳送下一個請求。管線化技術出現後,不用等待亦可傳送下一個請求。這樣就能做到同時並行傳送多個請求,而不需要一個接一個地等待響應了。 比如,當請求一個包含多張圖片的 HTML 頁面時,與挨個連線相比,用持久連線可以讓請求更快結束。而管線化技術要比持久連線速度更快。請求數越多,時間差就越明顯。

HTTP工作過程

  • 1,地址解析

如用客戶端瀏覽器請求這個頁面:localhost.com:8080/index.htm 從中分解出協議名、主機名、埠、物件路徑等部分,對於我們的這個地址,解析得到的結果如下:

協議名:http
主機名:localhost.com
埠:8080
物件路徑:/index.htm
複製程式碼
複製程式碼

在這一步,需要域名系統DNS解析域名,得主機的IP地址。

  • 2,封裝HTTP請求資料包

把以上部分結合本機自己的資訊,封裝成一個HTTP請求資料包

  • 3,封裝成TCP包,建立TCP連線(TCP的三次握手)

在HTTP工作開始之前,客戶機(Web瀏覽器)首先要通過網路與伺服器建立連線,該連線是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網路。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之後才能,才能進行更層協議的連線,因此,首先要建立TCP連線,一般TCP連線的埠號是80。這裡是8080埠。

  • 4,客戶端向伺服器傳送請求命令

建立TCP連線後,客戶機傳送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和可內容。

  • 5,伺服器響應

伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。

實體訊息是伺服器向瀏覽器傳送頭資訊後,它會傳送一個空白行來表示頭資訊的傳送到此為結束,接著,它就以Content-Type應答頭資訊所描述的格式傳送使用者所請求的實際資料.

  • 6,伺服器關閉TCP連線

一般情況下,一旦伺服器向客戶端返回了請求資料,它就要關閉 TCP 連線,然後如果客戶端或者伺服器在其頭資訊加入了這行程式碼 Connection:keep-alive ,TCP 連線在傳送後將仍然保持開啟狀態,於是,客戶端可以繼續通過相同的連線傳送請求。保持連線節省了為每個請求建立新連線所需的時間,還節約了網路頻寬。

HTTP 協議報文結構與頭部

這部分涉及到的知識特別繁瑣,受限於篇幅,這裡就不贅述了.可以參考這篇文章的四,五,六章作了超詳盡的說明.

HTTP的請求方法

GET: 獲取URL指定的資源;
POST:傳輸實體資訊
PUT:上傳檔案
DELETE:刪除檔案
HEAD:獲取報文首部,與GET相比,不返回報文主體部分
OPTIONS:詢問支援的方法
TRACE:追蹤請求的路徑;
CONNECT:要求在與代理伺服器通訊時建立隧道,使用隧道進行TCP通訊。主要使用SSL和TLS將資料加密後通過網路隧道進行傳輸。

複製程式碼

HTTP狀態碼

菜鳥教程裡有完整的說明.

HTTP缺點

  • 通訊使用明文,容易被竊聽
  • 不驗證通訊方的身份,可能遭遇偽裝
  • 無法證明報文的完整性,有可能遭遇篡改

HTTPS協議

概念

超文字傳輸安全協議(英語:Hypertext Transfer Protocol Secure,縮寫:HTTPS,常稱為HTTP over TLS,HTTP over SSL或HTTP Secure)是一種通過計算機網路進行安全通訊的傳輸協議。

HTTPS經由HTTP進行通訊,但利用SSL/TLS來加密資料包。

HTTPS開發的主要目的,是提供對網站伺服器的身份認證,保護交換資料的隱私與完整性。

簡而言之: HTTPS是在HTTP上建立SSL加密層,並對傳輸資料進行加密,是HTTP協議的安全版。

前端面試查漏補缺--(九) HTTP與HTTPS

HTTPS比HTTP多了一層TLS/SSL協議

前端面試查漏補缺--(九) HTTP與HTTPS

TLS/SSL全稱安全傳輸層協議Transport Layer Security, 是介於TCP和HTTP之間的一層安全協議,不影響原有的TCP協議和HTTP協議,所以使用HTTPS基本上不需要對HTTP頁面進行太多的改造。

HTTPS原理

這部分細說起來,真的很多.這裡我歸納簡單說一下:

  • 客戶端向伺服器端索要並驗證公鑰。這一階段使用的是非對稱加密傳輸(RSA),服務端將數字證書發給客戶端.其中數字證書包括:公鑰和數字簽名.客戶端在拿到後對兩者進行校驗.
  • 在非對稱加密傳輸中,兩端協商生成"對話金鑰"。
  • 雙方採用"對話金鑰"進行對稱加密通訊。

受限於篇幅,我就不展開了.要不然就太多太多了.這裡我推薦幾篇文章大家全面理解:

  • 以通俗易懂的方式理解https原理: 文章
  • 關於SSL/TLS 原理的詳細說明:文章
  • 關於PKI體系與證書的說明:文章

HTTP 與 HTTPS 的區別

  • HTTP 是明文傳輸,HTTPS 通過 SSL\TLS 進行了加密
  • HTTP 的埠號是 80,HTTPS 是 443
  • HTTPS 需要到 CA 申請證書,一般免費證書很少,需要交費
  • HTTP 的連線很簡單,是無狀態的;HTTPS 協議是由 SSL+HTTP 協議構建的可進行加密傳輸、身份認證的網路協議,比 HTTP 協議安全。

HTTPS主要作用是:

  • 對資料進行加密,並建立一個資訊保安通道,來保證傳輸過程中的資料安全
  • 對網站伺服器進行真實身份認證

HTTPS缺點

  • HTTPS協議握手階段比較費時,會使頁面的載入時間延長近50%,增加10%到20%的耗電;
  • https連線快取不如http高效,如果是大流量網站,則會造成流量成本太高。
  • https連線伺服器端資源佔用高很多,支援訪客稍多的網站需要投入更大的成本,如果全部採用https,基於大部分計算資源閒置的假設的VPS的平均成本會上去。
  • SSL證書需要錢,功能越強大的證書費用越高,個人網站、小網站沒有必要一般不會用。
  • SSL證書通常需要繫結IP,不能再同一IP上繫結多個域名,IPv4資源不可能支撐這個消耗(SSL有擴充套件可以部分解決這個問題,但是比較麻煩,而且要求瀏覽器、作業系統支援,Windows XP就不支援這個擴充套件,考慮到XP的裝機量,這個特性幾乎沒用)。

HTTPS接入優化

CDN接入

HTTPS 增加的延時主要是傳輸延時 RTT,RTT 的特點是節點越近延時越小,CDN 天然離使用者最近,因此選擇使用 CDN 作為 HTTPS 接入的入口,將能夠極大減少接入延時。CDN 節點通過和業務伺服器維持長連線、會話複用和鏈路質量優化等可控方法,極大減少 HTTPS 帶來的延時。

會話快取

雖然前文提到 HTTPS 即使採用會話快取也要至少1*RTT的延時,但是至少延時已經減少為原來的一半,明顯的延時優化;同時,基於會話快取建立的 HTTPS 連線不需要伺服器使用RSA私鑰解密獲取 Pre-master 資訊,可以省去CPU 的消耗。如果業務訪問連線集中,快取命中率高,則HTTPS的接入能力講明顯提升。當前TRP平臺的快取命中率高峰時期大於30%,10k/s的接入資源實際可以承載13k/的接入,收效非常可觀。

硬體加速

為接入伺服器安裝專用的SSL硬體加速卡,作用類似 GPU,釋放 CPU,能夠具有更高的 HTTPS 接入能力且不影響業務程式的。測試某硬體加速卡單卡可以提供35k的解密能力,相當於175核 CPU,至少相當於7臺24核的伺服器,考慮到接入伺服器其它程式的開銷,一張硬體卡可以實現接近10臺伺服器的接入能力。

遠端解密

本地接入消耗過多的 CPU 資源,浪費了網路卡和硬碟等資源,考慮將最消耗 CPU 資源的RSA解密計算任務轉移到其它伺服器,如此則可以充分發揮伺服器的接入能力,充分利用頻寬與網路卡資源。遠端解密伺服器可以選擇 CPU 負載較低的機器充當,實現機器資源複用,也可以是專門優化的高計算效能的伺服器。當前也是 CDN 用於大規模HTTPS接入的解決方案之一。

SPDY/HTTP2

前面的方法分別從減少傳輸延時和單機負載的方法提高 HTTPS 接入效能,但是方法都基於不改變 HTTP 協議的基礎上提出的優化方法,SPDY/HTTP2 利用 TLS/SSL 帶來的優勢,通過修改協議的方法來提升 HTTPS 的效能,提高下載速度等。

感謝及參考

相關文章