HTTP基本概念
超文本-傳輸-協議
- 協議
HTTP是一個用在計算機世界里的協議。它使用計算機可以理解的語言確立了一種計算機之間交流通信的規范(兩個以上的參與者),以及相關的各種控制和錯誤處理方式(行為約定和規范)。 - 傳輸
HTTP協議是一個雙向協議。是一個在計算機世界里專門用來在兩點之間傳輸數據的約定和規范 - 超文本
HTTP傳輸的內容是超文本。圖片、視頻、壓縮包在HTTP協議看來都是文本。超文本超越普通文本的文本,是文字、圖片、視頻的混合體,最關鍵有超鏈接能從一個超文本跳轉到另一個超文本。HTML就是最常見的超文本。
HTTP是一個在計算機世界里專門在兩點之間傳輸文字、圖片、音頻、視頻等超文本數據的約定和規范。
HTTP狀態碼
- 1xx類屬于提示信息,是協議處理中一種中間狀態,實際用的比較少
- 2xx類狀態碼表示服務器成功處理了客戶端的請求
- 204Not Content 成功但響應頭沒有body數據
- 206Partial Content 應用于HTTP分塊下載或斷點續傳,表示響應的body數據不資源全部
- 3xx狀態碼表示客戶端請求的資源發生變動,需要客戶端用新的URL重新發送請求獲取資源,也就是重定向
- 301表示永久重定向,需要客戶端用新的URL再次訪問
- 302臨時重定向,說明請求的資源還在,暫時需要另一個URL來訪問
- 301和302會在響應頭字段location,指明后續要跳轉的URL,瀏覽器自動重定向到新的URL
- 304表示資源未修改,表示客戶端可以繼續使用緩存資源用于緩存控制
- 4xx類狀態碼表示客戶端發送報文有誤,服務器無法處理
- 400 表示客戶端請求的報文有錯誤,但只是籠統錯誤
- 403表示服務器禁止訪問資源,不是客戶端請求出錯
- 404表示請求資源在服務器不存在或沒找到,無法提供給客戶端
- 5xx表示客戶端請求正確,但是服務器處理時內部發生了錯誤,屬于服務器端的錯誤碼
- 500與400類型是個籠統通用的錯誤碼,服務器發生了什么錯誤并不知道
- 501表示客戶端的請求暫時不支持
- 502表示服務器自身工作正常,但是訪問后端服務器發生錯誤,通常是服務器作為網關或代理時返回的錯誤碼
- 503表示服務器繁忙暫時無法響應客戶端
HTTP常見的字段
Host:客戶端發送請求時用來指定服務器的域名。有個這個字段可以將請求發往同一臺服務器上的不同網站
Content-Length表明本次回應的數據長度。HTTP協議通過設置回車符,換行符作為HTTP header的邊界,通過Content-Length字段作為HTTP body的邊界,這兩個方式都是為了解決粘包問題。
Connection常用于客戶端要求服務器使用HTTP長連接機制,以便其他請求復用。只要任意一端沒有明確提出斷開連接,則保持TCP連接狀態
http/1.1版本默認開始長連接為了兼容老版本的HTTP,需要指定Connection首部字段的值為Keep-Alive
Content-Type:用于服務器回應時,告訴客戶端,本次數據是什么格式
Content-Encoding說明數據的壓縮方法。表示服務器返回的數據使用什么壓縮格式
GET和POST區別
GET的語義是從服務器獲取指定的資源,這個資源可以可以是靜態的文本,頁面,圖片視頻等。GET請求的參數位置一般是寫在URL中,URL規定智能支持ASCII,所以GET請求的參數只允許ASCII,而且瀏覽器會對URL長度有限制(HTTP協議并沒有對URL的長度有規定)
POST語義是根據請求負荷對指定的資源做出處理,具體的處理方式視資源類型而不同。POST請求攜帶數據的位置一般是寫在報文body中,body中的數據可以是任意格式的數據,只要客戶端和服務端協商好即可,而且瀏覽器不會對body大小做限制
GET和POST方法都是安全和冪等的嗎
- 在HTTP協議中,安全 指的是不會破壞服務器上的資源
- 冪等指的是多次執行相同的操作,結果都是相同的
從RFC規定的語義來看 - GET方法是安全且冪等的。所以可以對GET請求的數據做緩存,這個緩存就可以做到瀏覽器本身上,也可以做到代理上,而且在瀏覽器中GET請求可以保存為書簽
- POST會修改服務器上的資源,所以是不安全的,且多次提交數據就會創建多個資源,所以不是冪等的
HTTP緩存技術
HTTP緩存的實現方式
強制緩存和協商緩存
強緩存指的是只要瀏覽器判斷緩存沒有過期,則直接使用瀏覽器的本地緩存,決定是否使用緩存的主動性在于瀏覽器這邊。強緩存利用兩個HTTP響應頭部字段實現的,Cache-Control一個相對時間,Expires是一個絕對時間;Cache-Control優先級高于Expires
協商緩存:這里的兩個字段都需要配合強制緩存中Cache-Control字段來使用,只有在未能命中強緩存的時候才能發起帶有協商緩存字段的請求。
HTTP特性
http/1.1
- 簡單,基本報文格式是header+body,頭部信息也是key-value簡單文本的形式,頭部信息也是key-value簡單文本的形式,易于理解,講了學習和使用的門檻
- 靈活易于拓展允許開發人員自定義和擴充。同時HTTP工作在應用層它下層可以隨意變化,HTTPS就是在HTTP和TCP之間加了SSL/TLS;http3.0傳輸協議該用UDP
- 應用廣泛和跨平臺
缺點 - 無狀態,好處服務器不用記憶HTTP狀態,所以不需要額外的資源來記錄狀態信息,能減輕服務器的負擔,能夠把更多的CPU用來對外提供服務壞處在進行有關聯的請求操作時每一步都需要驗證用戶的身份(可用cookie技術解決)
- 明文傳輸,明文方便閱讀但是毫無隱私容易竊取信息
- 不安全,不加密傳輸賬號信息易泄露。不驗證通信雙方身份可能遭遇偽裝。無法驗證報文的完整性,可能會被篡改。
HTTP/1.1性能
HTTP協議是基于TCP/IP,并且使用請求-應答的通信模式
1.長連接
在http1.0時每發起一個請求都要新建一次TCP連接,如果是串行請求,做了無謂的TCP連接建立和斷開,增加通信開銷。HTTP/1.1提出長連接通信方式。只要任意一端沒有明確提出斷開連接,則保持TCP連接狀態。
2.管道網絡傳輸(沒有被使用)
即在同一個TCP連接里,客戶端可以發起多個請求,只要第一個請求發送成功不用等響應就可以發送第二個請求,減少整體的響應時間。但是服務器必須按照接收請求的順序發送對這些管道請求的響應。
3.隊頭阻塞
當順序發送的請求序列中的一個請求因為某種原因被阻塞時,在后面排隊的所有請求也一同被阻塞,導致客戶端一直收不到數據,這就是隊頭阻塞
HTTP和HTTPS
區別
- HTTP是超文本傳輸協議,信息明文傳輸,存在安全風險。HTTPS解決了HTTP不安全的缺陷,在HTTP和TCP中加入SSL/TLS,使報文加密傳輸
- HTTP建立連接簡單,TCP三次握手之后便可進行進行HTTP的報文傳輸,而HTTPS在TCP三次握手之后還要進行SSL/TLS握手,才可進入加密報文傳輸
- 兩者的默認端口不一樣,HTTP默認端口號是80,HTTPS默認端口號是443
- HTTPS協議需要向CA申請數字證書,來保證服務器的身份是可信的
HTTPS解決的問題
- 信息加密,交互信息無法被竊取
- 校驗機制,無法篡改通信內容,篡改了就不能正常顯示
- 身份證書,證明淘寶是真的淘寶網
解決的辦法: - 混合加密的方式實現信息的機密性,解決竊聽的風險
- 摘要算法的方式實現完整性,它能夠為數據生成獨一無二的指紋,指紋用于校驗數據的完整性,解決了篡改的風險
- 將服務器公鑰放到數字證書中,解決了被冒充的風險
1.混合加密
HTTPS采用的是對稱加密和非對稱加密結合的混合加密方式 - 在通信建立前采用非對稱加密的方式交換會話密鑰
- 在通信過程中全部使用對稱加密的會話密鑰的方式加密明文數據
采用混合加密的原因: - 對稱加密只使用一個密鑰,運算速度塊,密鑰必須保密,無法做到安全的密鑰交換
- 非對稱加密的兩個密鑰,公鑰和私鑰,公鑰可以任意分發而私鑰保密,解決了密鑰交換問題但速度慢
2.摘要算法+數字簽名
保證傳輸內容不被篡改對內容計算出一個指紋,然后同內容一起傳輸給對方
收到后接收方對內容計算出指紋跟發送方發送的指紋做一個比較,指紋相同說明內容沒有被篡改否則就可以判斷出內容被篡改了。
在計算機里會用摘要算法(哈希函數)來計算出內容的哈希值,也就是內容的指紋,這個哈希值是唯一的,且無法通過哈希值推導出內容。
但是不能保證內容+哈希不會被中間人替換,因為這里缺少對客戶端收到的消息是否來源于服務端的證明(客戶端無法確認消息中的哈希值是否真的是服務端計算的)采用非對稱加密來解決 - 采用非對稱加密通過私鑰加密公鑰解密方式,確認消息的身份,即數字簽名算法,私鑰加密內容不是內容本身,而是對內容的哈希值加密!
*3.數字證書
- 服務器將自己的公鑰注冊到CA
- CA用自己的私鑰將服務器的公鑰數字簽名并頒發數字證書(數字證書:服務器的公鑰和CA的數字簽名)
- CA的公鑰實現置入到了瀏覽器或操作系統中
- 客戶端拿到服務器的數字證書后使用CA的公鑰確認服務器數字證書的真實性
- 從數字證書獲取到服務器的公鑰后使用它對報文加密后發送