該文章是我本身學習筆記及理解,但願通篇讀完能讓你對HTTP和HTTPS有一個更全面的理解,若是錯誤地方煩請指正。文字較多,全篇預計閱讀耗時20分鐘。html
超文本傳輸協議(英語:HyperText Transfer Protocol,縮寫:HTTP)是一種用於分佈式、協做式和超媒體信息系統的應用層協議[1]。HTTP是萬維網的數據通訊的基礎。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。經過HTTP或者HTTPS協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。《維基百科》前端
從 1990 年開始HTTP就在 WWW 上普遍應用。HTTP協議採用了請求/響應模型。客戶端向服務器發送一個請求,請求頭包含請求的方法、URI、協議版本、以及包含請求修飾符、客戶 信息和內容的相似於MIME的消息結構。服務器以一個狀態行做爲響應,相應的內容包括消息協議的版本,成功或者錯誤編碼加上包含服務器信息、實體元信息以及可能的實體內容。程序員
HTTP剛出現是爲了將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器,隨着WEB的持續發展,例如CSS、JS豐富了頁面展現和基於HTTP協議的ajax增長了咱們向服務器獲取數據的方式,HTTP也不斷的進行優化迭代。web
版本 | 發佈時間 | 主要內容 | 現狀 |
---|---|---|---|
HTTP/0.9 | 1991 | 無狀態、只支持GET請求、無協議頭、只支持純文本 | 已過期 |
HTTP/1.0 | 1996 | 有協議頭、支持GET/POST/HEAD等方法、傳輸內容不限 | 仍被採用 |
HTTP/1.1 | 1999 | 默認持久鏈接、請求管道化、增長緩存處理、增長Host字段、支持斷點傳輸、增長錯誤通知處理 | 目前最被普遍使用 |
HTTP/2 | 2015 | 新的二進制格式(幀)、多路複用、header壓縮、請求優先級、服務端推送 | 將來的發展趨勢 |
HTTP/3 | 2018.11 | 新的二進制格式(幀)、多路複用、header壓縮、請求優先級、服務端推送 | 發展中 |
HTTP/2繼承於Google的SPDY協議。HTTP/2: the Future of the Internet | Akamai這是Akamai公司用來講明HTTP/2的優點所建立的demo。同時請求379張圖片,HTTP/2速度佔了絕對的優點。
ajax
HTTP 2.0 的全部幀都採用二進制編碼算法
之因此速度能有如此優化,主要得益於HTTP2.0的多路複用技術。
有了新的分幀機制後,HTTP/2再也不依賴多個TCP 鏈接去處理更多併發的請求,每一個數據流都拆分紅不少互不依賴的幀,而這些幀能夠交錯(亂序發送),還能夠分優先級。最後再在另外一端根據每一個幀首部的流標識符把它們從新組合起來。從始至終,客戶端與服務器之間只須要一個鏈接(同個域名下)便可。 segmentfault
HTTP 協議不帶有狀態,每次請求都必須附上全部信息。因此,請求的不少字段都是重複的,好比Cookie和User Agent,如出一轍的內容,每次請求都必須附帶,這會浪費不少帶寬,也影響速度。
HTTP/2 對這一點作了優化,引入了頭信息壓縮機制(header compression)。一方面,頭信息使用gzip或compress壓縮後再發送;另外一方面,客戶端和服務器同時維護一張頭信息表,全部字段都會存入這個表,生成一個索引號,之後就不發送一樣字段了,只發送索引號,這樣就提升速度了。瀏覽器
由於 HTTP/2 的數據包是不按順序發送的,同一個鏈接裏面連續的數據包,可能屬於不一樣的迴應。所以,必需要對數據包作標記,指出它屬於哪一個迴應。
HTTP/2 將每一個請求或迴應的全部數據包,稱爲一個數據流(stream)。每一個數據流都有一個獨一無二的編號。數據包發送的時候,都必須標記數據流ID,用來區分它屬於哪一個數據流。另外還規定,客戶端發出的數據流,ID一概爲奇數,服務器發出的,ID爲偶數。
數據流發送到一半的時候,客戶端和服務器均可以發送信號(RST_STREAM幀),取消這個數據流。1.1版取消數據流的惟一方法,就是關閉TCP鏈接。這就是說,HTTP/2 能夠取消某一次請求,同時保證TCP鏈接還打開着,能夠被其餘請求使用。
客戶端還能夠指定數據流的優先級。優先級越高,服務器就會越早迴應。緩存
HTTP/2 容許服務器未經請求,主動向客戶端發送資源,這叫作服務器推送(server push)。常見場景是客戶端請求一個網頁,這個網頁裏面包含不少靜態資源。服務端能在客戶端請求靜態資源前主動把這些靜態資源隨着網頁一塊兒發給客戶端了,省去了客戶端創建鏈接、發起請求等過程,極大提高了速度。安全
因爲底層支持TCP協議的缺陷,致使HTTP/2仍是存在一些問題。
Connection:keep-alive
,TCP鏈接在發送後將仍然保持打開狀態,因而,瀏覽器能夠繼續經過相同的鏈接發送請求。保持鏈接節省了爲每一個請求創建新鏈接所需的時間,還節約了網絡帶寬。一個完整的請求由請求行
、請求頭
和請求體
三部分組成。
請求行包含:請求方法、請求地址(URL)和協議版本。
方法名 | 功能 |
---|---|
GET | 向指定的資源發出「顯示」請求,使用 GET 方法應該只用在讀取數據上,而不該該用於產生「反作用」的操做中 |
POST | 指定資源提交數據,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求文本中。這個請求可能會建立新的資源或者修改現有資源,或二者皆有。 |
PUT | 向指定資源位置上傳其最新內容 |
DELETE | 請求服務器刪除 Request-URI 所標識的資源 |
OPTIONS | 使服務器傳回該資源所支持的全部HTTP請求方法。用* 來代替資源名稱,向 Web 服務器發送 OPTIONS 請求,能夠測試服務器功能是否正常運做 |
HEAD | 與 GET 方法同樣,都是向服務器發出指定資源的請求,只不過服務器將不傳回資源的本文部分,它的好處在於,使用這個方法能夠在沒必要傳輸所有內容的狀況下,就能夠獲取其中關於該資源的信息 (原信息或稱元數據) |
TRACE | 顯示服務器收到的請求,主要用於測試或診斷 |
CONNECT | HTTP/1.1 中預留給可以將鏈接改成通道方式的代理服務器。一般用於 SSL 加密服務器的連接(經由非加密的 HTTP 代理服務器) |
請求頭包含客戶端主機名和客戶端環境信息。 常見的請求頭:
名稱 | 做用 |
---|---|
Authorization | 用於設置身份認證信息 |
User-Agent | 用戶標識,如:OS 和瀏覽器的類型和版本 |
Accept-Encoding | 告訴服務器能接受什麼編碼格式,如 gzip、deflate |
If-Modified-Since | 值爲上一次服務器返回的Last-Modified值,用於肯定某個資源是否被更改過,沒有更改過就從緩存中讀取 |
If-None-Match | 值爲上一次服務器返回的 ETag 值,通常會和If-Modified-Since |
Cookie | 已有的Cookie |
Referer | 標識請求引用自哪一個地址,好比你從頁面 A 跳轉到頁面 B 時,值爲頁面 A 的地址 |
Host | 請求的主機和端口號 |
通用的首部字段:
名稱 | 做用 |
---|---|
Cache-Control | 響應輸出到客戶端後,服務端經過該屬性告訴客戶端該怎麼控制響應內容的緩存 |
Date | 代表HTTP報文建立的日期和時間 |
Trailer | 報文某段的的首部一覽 |
Warning | 錯誤通知 |
請求體(又叫請求正文)是 post 請求方式中的請求參數,以 key = value 形式進行存儲,多個請求參數之間用&鏈接,若是請求當中請求體,那麼在請求頭當中的 Content-Length 屬性記錄的就是該請求體的長度
一個完整的響應由響應行
、響應頭
和響應體
三部分組成。
響應行包含:協議版本、狀態碼和狀態描述。
2XX成功
3XX重定向
4XX客戶端錯誤
5XX服務器錯誤
同請求頭同樣,用來傳遞附加信息。 常見的響應頭:
名稱 | 做用 |
---|---|
Accept-Ranges | 是否接受字節範圍請求 |
ETag | 表示你請求資源的版本,若是該資源發生啦變化,那麼這個屬性也會跟着變 |
Location | 在重定向中或者建立新資源時使用 |
Set-Cookie | 服務端能夠設置客戶端的cookie |
響應體也就是網頁的正文內容,通常在響應頭中會用 Content-Length 來明確響應體的長度,便於瀏覽器接收,對於大數據量的正文信息,也會使用 chunked 的編碼方式。
回到開篇的圖片可知,HTTPS是在HTTP的基礎上加入了SSL/TLS協議,SSL/TLS依靠證書來驗證服務器的身份,並保護交換數據的隱私與完整性。爲了解決HTTP的明文通訊,沒法驗證對方身份和報文的完整性等問題,網景公司(Netscape)在1994年提出了HTTPS協議,隨後拓展到互聯網上。目前HTTPS已經取代HTTP成爲主流協議,並且HTTP/2以後都只能用於HTTPS加密鏈接。
對稱加密 對稱密鑰(Symmetric-key algorithm)又稱爲共享密鑰加密,加密和解密使用相同的密鑰。常見的對稱加密算法有DES、3DES、AES、RC五、RC6。對稱密鑰的優勢是計算速度快,可是它有缺點,雙方須要都知道密鑰才能加解密,所以如何安全的發送密鑰給接收者成爲了一個問題。
非對稱加密 公開密鑰加密(public-key cryptography)簡稱公鑰加密。公鑰能夠隨意分發,發送方使用公鑰進行加密處理,接收方用本身的私有私鑰進行解密。這種方式沒必要擔憂密鑰被攻擊者竊聽而盜走,但服務器沒法驗證公鑰信息,存在被中間人截獲替換的風險,另外非對稱加密的傳輸效率比對稱加密低。
解決方案:對稱加密+非對稱加密 對稱加密效率高,非對稱加密能夠防止傳輸內容被截獲。結合二者的優點,HTTPS在交換祕鑰階段採用非對稱加密,創建通訊後經過對稱加密來傳遞信息。例如發送信息的一方先使用對方的公鑰加密對稱密鑰,對方接收到信息後用私鑰進行解密得到對稱密鑰,以後雙方的通訊都用對稱密鑰進行加解密。
至此,完成了服務器向客戶端的單向驗證,若要使客戶端對服務器也進行驗證操做(雙向驗證),則須要將CA證書放在客戶端。 若採用雙向驗證,則在步驟2服務器會額外向客戶端請求客戶端的CA證書信息,客戶端在步驟3驗證服務器證書後,會將客戶端證書發給服務器進行驗證。 雙向驗證能更好的預防中間人攻擊,客戶端內置了僅接受指定域名的證書,保障了客戶端與服務端通訊的惟一性和安全性,但要注意證書續期後需從新將證書放入到客戶端中。
文章 用信鴿來解釋 HTTPS 詳細描述了整個過程,這裏再也不累述,想了解的能夠自行閱讀。
Charles的抓包原理是假裝成中間人,攔截服務器響應,用Charles製做的CA證書替換服務器證書發給客戶端,再攔截客戶端響應用以前攔截的服務器證書公鑰從新加密發給服務器,讓雙方誤覺得仍是在正常的驗證通訊中。這一切發生的前提是客戶端選擇信任並安裝Charles的CA證書,不然客戶端校驗不過CA證書就會報錯並停止校驗。 具體過程如圖:
HTTP 協議入門
HTTP 0.9 HTTP 1.0 HTTP 1.1 HTTP 2.0區別
HTTP 基礎與變遷
5分鐘讓你明白HTTP協議
程序員都該懂點 HTTP
前端必備HTTP技能之HTTP請求頭響應頭中經常使用字段詳解
解密HTTP/2與HTTP/3 的新特性
深刻理解HTTPS工做原理
也許,這樣理解HTTPS更容易
HTTP與HTTPS的區別
HTTPS協議詳解(五):HTTPS性能與優化
扯一扯HTTPS單向認證、雙向認證、抓包原理、反抓包策略