TCP/IP(六):HTTP 與 HTTPS 簡介

本文是準備面試過程中網絡部分總結整理的最后一篇文章,主要介紹以下知識:

  • HTTP 協議概述
  • POST 請求和 GET 請求
  • Cookie 和 Session
  • 數據傳輸時的加密
  • HTTPS 簡介

HTTP 協議

在 OSI 七層模型中,HTTP 協議位于最頂層的應用層中。通過瀏覽器訪問網頁就直接使用了 HTTP 協議。使用 HTTP 協議時,客戶端首先與服務端的 80 端口建立一個 TCP 連接,然后在這個連接的基礎上進行請求和應答,以及數據的交換。


HTTP 工作原理

HTTP 有兩個常用版本,分別是 1.0 和 1.1。主要區別在于 HTTP 1.0 中每次請求和應答都會使用一個新的 TCP 連接,而從 HTTP 1.1 開始,運行在一個 TCP 連接上發送多個命令和應答。因此大幅度減少了 TCP 連接的建立和斷開,提高了效率。

由 HTTP 協議加載出來的網頁,通常使用 HTML 語言來描述,因此 HTML 也可以理解為網頁的一種數據格式。HTML 是一段純文本,可以指定網頁中的文字、圖像、音頻視頻圖片、鏈接,以及它們的顏色、位置等。無論計算機的底層結構如何,也無論網絡底層使用了哪些協議,使用 HTML 展示出來的效果基本上是一致的。從這個角度來說 HTML 位于 OSI 七層模型的表現層。

POST 請求和 GET 請求

HTTP 有八種請求(也稱方法),其中最常見的是 GET 請求和 POST 請求。

GET 請求通常用于查詢、獲取數據,而 POST 請求則用于發送數據,除了用途上的區別,它們還有以下這些不同:

  1. GET 請求可以被緩存,可以被收藏為書簽,但 POST 不行。
  2. GET 請求會保留在瀏覽器的歷史記錄中,POST 不會。
  3. GET 請求的長度有限制(不同的瀏覽器不一樣,大約在幾 Kb 左右),URL 的數據類型只能是 ASCII 字符,POST 請求沒有限制。
  4. GET 請求的參數在 URL 中,因此絕不能用 GET 請求傳輸敏感數據。POST 請求數據則寫在 HTTP 的請求頭中,安全性略高于 GET 請求。

注意

  POST 請求僅比 GET 請求略安全一點,它的數據不在 URL 中,但依然以明文的形式存放于 HTTP 的請求頭中。

Cookie 和 Session

HTTP 是一種無狀態的連接,客戶端每次讀取 web 頁面時,服務器都會認為這是一次新的會話。但有時候我們又需要持久保持某些信息,比如登錄時的用戶名、密碼,用戶上一次連接時的信息等。這些信息就由 Cookie 和 Session 保存。

這兩者的根本性區別在于,cookie 保存在客戶端上,而 session 則保存在服務器中。由此我們還可以拓展出以下結論:

  1. cookie 相對來說不安全,瀏覽器可以分析本地的 cookie 進行 cookie 欺騙。
  2. session 可以設置超時時間,超過這個時間后就失效,以免長期占用服務端內存。
  3. 單個 cookie 的大小有限制(4 Kb),每個站點的 cookie 數量一般也有限制(20個)。
  4. 客戶端每次都會把 cookie 發送到服務端,因此服務端可以知道 cookie,但是客戶端不知道 session。

當服務器接收到 cookie 后,會根據 cookie 中的 SessionID 來找到這個客戶的 session。如果沒有,則會生成一個新的 SessionID 發送給客戶端。

加密

加密分為兩種,對稱加密和非對稱加密。在解釋這兩者的含義前,先來看一下簡單的加密、解密過程:


加密和解密過程

所謂的對稱,就是指加密秘鑰和解密秘鑰相同,而非對稱自然就是指兩者不同。

舉一個對稱加密的例子。假設這里的加密算法是加法,解密算法是減法。如果明文數據是 10,秘鑰是 1,那么加密數據就是 10 + 1 = 11,如果接收方不知道秘鑰,就不知道密文 11 應該減去幾。反之,如果接收方知道秘鑰是 1,就可以通過 11 - 1 = 10 計算出明文數據。

常見的一個非對稱加密算法是 RSA 算法,它主要利用了“兩個素數求乘積容易,但是將乘積分解為兩個素數很難”這一思想。它的具體原理不在本文討論范圍,有興趣的讀者可以查看文章末尾的參考文章。

在非對稱加密中,利用公鑰加密的數據能且只能通過私鑰解密,通過私鑰加密的數據能且只能通過公鑰解密。

對稱加密的優點在于速度快,但是假設秘鑰由服務器保存,如何安全的讓客戶端得到秘鑰是需要解決的問題。因此實際的網絡傳輸中,通常使用對稱加密與非對稱加密結合的方式,服務端通過非對稱加密將對稱秘鑰發給客戶端。此后雙方使用這個對稱密鑰進行通信。

HTTPS

我們知道 HTTP 協議直接使用了 TCP 協議進行數據傳輸。由于數據沒有加密,都是直接明文傳輸,所以存在以下三個風險:

  1. 竊聽風險:第三方節點可以獲知通信內容。
  2. 篡改風險:第三方節點可以修改通信內容。
  3. 冒充風險:第三方節點可以冒充他人身份參與通信。

比如你在手機上打開應用內的網頁時,有時會看到網頁底部彈出了廣告,這實際上就說明你的 HTTP 內容被竊聽、并篡改了。

HTTPS 協議旨在解決以上三個風險,因此它可以:

  1. 保證所有信息加密傳輸,無法被第三方竊取。
  2. 為信息添加校驗機制,如果被第三方惡意破壞,可以檢測出來。
  3. 配備身份證書,防止第三方偽裝參與通信。

HTTPS 的結構如圖所示:


HTTPS 協議

可見它僅僅是在 HTTP 和 TCP 之間新增了一個 TLS/SSL 加密層,這也印證了一句名言:“一切計算機問題都可以通過添加中間層解決”。

使用 HTTPS 時,服務端會將自己的證書發送給客戶端,其中包含了服務端的公鑰。基于非對稱加密的傳輸過程如下:

  1. 客戶端使用公鑰將信息加密,密文發送給服務端
  2. 服務端用自己的私鑰解密,再將返回數據用私鑰加密發回客戶端
  3. 客戶端用公鑰解密

這里的證書是服務器證明自己身份的工具,它由權威的證書頒發機構(CA)發給申請者。如果證書是虛假的,或者是自己給自己頒發的證書,服務器就會不認可這個證書并發出警告:


12306 的自簽名證書

總結一下 HTTPS 協議是如何避免前文所說的三大風險的:

  1. 先用非對稱加密傳輸密碼,然后用這個密碼對稱加密數據,使得第三方無法獲得通信內容
  2. 發送方將數據的哈希結果寫到數據中,接收方解密后對比數據的哈希結果,如果不一致則說明被修改。由于傳輸數據加密,第三方無法修改哈希結果。
  3. 由權威機構頒發證書,再加上證書校驗機制,避免第三方偽裝參與通信。

參考文章

  1. HTTPS科普掃盲帖
  2. SSL/TLS協議運行機制的概述
  3. RSA 加密
  4. HTTP 方法:GET 對比 POST


文/bestswifter(簡書作者)
原文鏈接:http://www.jianshu.com/p/6e7521041e92
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248003.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248003.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248003.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Node — 第三天

模塊化 什么是模塊化 模塊化是指解決一個復雜問題時,自頂向下逐層把系統劃分成若干模塊的過程。 對于整個系統來說,模塊是可組合、分解和更換的單元。 生活中的模塊化 編程中的模塊化 編程領域中的模塊化,就是遵守固定的規則,…

FireDAC 中文字段過濾問題

當使用 FireDAC Filter 過濾數據的時候,通常這樣寫: FDMemTable.Filtered : False; FDMemTable1.Filter : 姓名 string(edtFilter.Text).QuotedString; FDMemTable.Filtered : True; 將會報錯:[FireDAC][Stan][Eval]-107. Invalid characte…

UIScrollViewDelegate-代理API詳解

在iOS編程中,經常用到UIScrollView控件。自然也會用到UIScrollViewDelegate協議。 今天就抽空,研究了一下UIScrollViewDelegate中所有的委托方法。 僅做Mark!如有,錯誤之處,歡迎留言指正,交流!貼…

License for package Android SDK Build-Tools 28.0.2 not accepted.(MAC)

https://blog.csdn.net/user11223344abc/article/details/83997907轉載于:https://www.cnblogs.com/dtdxrk/p/10812469.html

Express — 使用步驟

Express Express 介紹安裝搭建服務器的步驟express提供的新方法GET接口 獲取GET中的請求參數 POST接口 獲取POST請求提交的數據 中間件原理中間件語法中間件初體驗(設置響應頭)中間件開放靜態資源中間件接收POST請求體中間件返回404頁面 express 介紹 E…

大模型工具_Langchain-Chatchat

https://github.com/chatchat-space/Langchain-Chatchat 原Langchain-ChatGLM 1 功能 整體功能,想解決什么問題 基于 Langchain 與 ChatGLM 等LLM模型,搭建一套針對中文場景與開源模型,界面友好、可離線運行的知識庫問答解決方案。 當前解決…

iOS 鍵盤風格詳解UIKeyboardType

一、鍵盤風格 UIKit框架支持8種風格鍵盤。 [java] view plaincopy print?typedef enum { UIKeyboardTypeDefault, // 默認鍵盤:支持所有字符 UIKeyboardTypeASCIICapable, // 支持ASCII的默認鍵盤 UIKeyboardTypeNu…

MySQL Hardware--FIO壓測

FIO參數 filename/export/1.txt 支持文件系統或者裸設備,-filename/dev/sda2或-filename/dev/sdb direct1 測試過程繞過機器自帶的buffer,使測試結果更真實 rwrandwread 測試隨機讀的I/O rwrandwrite 測試隨機…

Node — 第四天(Promise與路由)

Promise - ES6新對象 Promise能夠處理異步程序。 回調地獄 JS中或node中,都大量的使用了回調函數進行異步操作,而異步操作什么時候返回結果是不可控的,如果我們希望幾個異步請求按照順序來執行,那么就需要將這些異步操作嵌套起來…

xcode8 升級后注釋快捷鍵不能使用的解決方法

一種說法: 這個是因為蘋果解決xcode ghost。把插件屏蔽了。解決方法 命令運行: sudo /usr/libexec/xpccachectl 然后必須重啟電腦后生效 還有一種說法:不用指令直接重啟就可以了。

winform datagridview控件使用

最近做項目時&#xff0c;顯示查詢結果總需要綁定到datagridview控件上顯示&#xff0c;總結了給datagridview綁定數據的方式&#xff0c;以及導出datagridview數據到excel表格&#xff0c;如有錯誤請多指教 1.直接綁定數據源&#xff0c;可以綁定的數據格式有List<T>,Da…

Node — 第五天

1. MySQL數據庫 phpstudy 數據庫服務器及圖形化軟件 軟件鏈接 鏈接&#xff1a;https://pan.baidu.com/s/1F8wdoMstHAJkINfDKDejsw 提取碼&#xff1a;xl3k 數據庫對于我們前端同學來說&#xff0c;就是一個了解。 對于不會變化的數據&#xff08;省、市、縣&#xff09;&…

iOS10 權限訪問崩潰

手機升級了 iOS10 Beta&#xff0c;然后用正在開發的項目 裝了個ipa包&#xff0c;發現點擊有關 權限訪問 直接Crash了&#xff0c;并在控制臺輸出了一些信息&#xff1a; This app has crashed because it attempted to access privacy-sensitive data without a usage descr…

Node — 第六天(前后端分離)及(身份驗證)

綜合應用服務端知識點搭建項目 下載安裝所需的第三方模塊 npm init -y npm i express cors mysql # express 用于搭建服務器 # cors 用于解決跨域 # mysql 用于操作數據庫# 后面用到什么&#xff0c;再下載創建app.js 之前&#xff0c;我們開啟一個服務器&#xff0c;js文件…

繼承上機作業

1、實現如下類之間的繼承關系&#xff0c;并編寫Music類來測試這些類 2、編寫一個Java應用程序&#xff0c;該程序包括3個類&#xff1a;Monkey類、People類和主類E。要求&#xff1a; (1) Monkey類中有個構造方法&#xff1a;Monkey (String s)&#xff0c;并且有個public voi…

ApplePay集成教程

Apple Pay運行環境&#xff1a;iPhone6以上設備&#xff0c;操作系統最低iOS9.0以上&#xff0c;部分信息設置需要iOS9.2以上。目前還不支持企業證書添加。 環境搭建好后可以在模擬器上面運行&#xff0c;xcode7.2.1iPhone6SP9.2系統下&#xff0c;系統會綁定幾種虛擬的銀行卡…

Node — 第七天 (大事件項目接口實現一)

關于JS錯誤處理 node中和mysql中的錯誤處理 node和MySQL提供的方法&#xff0c;已經對錯誤信息進行了封裝&#xff0c;只需要使用 err.message 即可獲取到錯誤信息。 比如&#xff1a; const fs require(fs); // 讀取一個不存在的文件 fs.readFile(abcd.txt, (err, data) …

1.Consul 簡介和環境搭建

1.什么是 Consul Consul 是 service mesh(服務網格)的一個解決方案&#xff0c;它提供了諸如服務發現&#xff0c;配置和隔離等功能的一整套控制平面(control plane)。開發人員可以根據需要單獨使用這些功能點&#xff0c;也可以將他們整合成為一個完整的service mesh。Consul …

Node — 第八天 (大事件項目接口實現二)

如何處理MySQL的錯誤 MySQL的錯誤信息&#xff0c;可以通過err來獲取。這是沒有問題的。 但是&#xff0c;我們加入了Promise&#xff0c;Promise中的錯誤&#xff0c;在外部是獲取不到的&#xff0c;只能使用Promise相關方法來獲取錯誤信息。 解決方法一 使用 JS原生的 tr…

在local模式下的spark程序打包到集群上運行

一、前期準備 前期的環境準備&#xff0c;在Linux系統下要有Hadoop系統&#xff0c;spark偽分布式或者分布式&#xff0c;具體的教程可以查閱我的這兩篇博客&#xff1a; Hadoop2.0偽分布式平臺環境搭建 Spark2.4.0偽分布式環境搭建 然后在spark偽分布式的環境下必須出現如下八…