Android 面試必備 – http 與 https 協議

  • 2020 年 1 月 13 日
  • 筆記

前言

在講解 http 與 https 之間的區別之前,我么先來看一下一個常見的面試問題。

一次完整的 http 協議請求過程是怎樣的

該圖片出自 部落格

Http協議的主要特點

  1. 支援客戶/伺服器模式
  2. 簡單快速:客戶向服務端請求服務時,只需傳送請求方式和路徑。
  3. 靈活:允許傳輸任意類型的數據對象。由Content-Type加以標記。
  4. 無連接:每次響應一個請求,響應完成以後就斷開連接。
  5. 無狀態:伺服器不保存瀏覽器的任何資訊。每次提交的請求之間沒有關聯。

怎麼理解HTTP協議是無狀態的無連接的的協議?

非持續性和持續性

HTTP1.0默認非持續性;HTTP1.1默認持續性

持續性:瀏覽器和伺服器建立TCP連接後,可以請求多個對象

非持續性:瀏覽器和伺服器建立TCP連接後,只能請求一個對象

非流水線和流水線

類似於組成裡面的流水操作

  • 流水線:不必等到收到伺服器的回應就發送下一個報文。
  • 非流水線:發出一個報文,等到響應,再發下一個報文。類似TCP。

http 各個版本之間的區別

1.0 與 1.1

  • http1.0一次只能處理一個請求,不能同時收發數據
  • http1.1可以處理多個請求,能同時收發數據
  • http1.1增加可更多欄位,如cache-control,keep-alive.

2.0

  • http 2.0採用二進位的格式傳送數據,不再使用文本格式傳送數據
  • http2.0對消息頭採用hpack壓縮演算法,http1.x的版本消息頭帶有大量的冗餘消息
  • http2.0 採用多路復用,即用一個tcp連接處理所有的請求,真正意義上做到了並發請求,流還支援優先順序和流量控制(HTTP/1.x 雖然通過 pipeline也能並發請求,但是多個請求之間的響應會被阻塞的,所以 pipeline 至今也沒有被普及應用,而 HTTP/2 做到了真正的並發請求。同時,流還支援優先順序和流量控制。)
  • http2.0支援server push,服務端可以主動把css,jsp文件主動推送到客戶端,不需要客戶端解析HTML,再發送請求,當客戶端需要的時候,它已經在客戶端了。

POST和GET的區別

Post一般用於更新或者添加資源資訊

Get一般用於查詢操作,而且應該是安全和冪等的

Post更加安全

Get會把請求的資訊放到URL的後面

Post傳輸量一般無大小限制

Get不能大於2KB

Post執行效率低

Get執行效率略高

為什麼POST效率低,Get效率高

  • Get將參數拼成URL,放到header消息頭裡傳遞
  • Post直接以鍵值對的形式放到消息體中傳遞。
  • 但兩者的效率差距很小很小

Https

HTTPS相當於HTTP的安全版本了,是在http的基礎之上加上ssl(Secure Socket Layer)

  • 埠號是443
  • 是由SSL+Http協議構建的可進行加密傳輸、身份認證的網路協議。

https在客戶端(瀏覽器)與服務端(網站)傳輸加密的數據大概經歷一下流程

  1. 客戶端將自己的has演算法和加密演算法發給伺服器
  2. 伺服器接收到客戶端發來的加密演算法和has演算法,取出自己的加密演算法與has演算法,並將自己的身份資訊以證書的形式發送給客戶端,該證書資訊包括公鑰,網站地址,預計頒發機構等
  3. 客戶端收到伺服器發來的證書(即公鑰),開始驗證證書的合法性,如果證書信任,則生成一串隨機的字元串數字作為私鑰,並將私鑰(密文)用證書(伺服器的公鑰)進行加密,發送給伺服器
  4. 伺服器收到客戶端發來的數據之後,通過伺服器自己的私鑰進行解密客戶端發來的數據(客戶端的私鑰),(這樣雙方都擁有私鑰)再進行hash檢驗,如果結果一致,則將客戶端發來的字元串(第3個步驟發送過來的字元串)通過加密發送給客戶端
  5. 客戶端解密,如果一致的話,就使用之前客戶端隨機生成的字元串進行對稱加密演算法進行加密