全面了解HTTP和HTTPS(開發人員必備)

2020-12-15 剪輯客

Http和Https屬於計算機網絡範疇,但作為開發人員,不管是後臺開發或是前臺開發,都很有必要掌握它們。

在學習Http和Https的過程中,主要是參考了阮一峰老師的博客《阮一峰:HTTP 協議入門》,講的很全面,並且通俗易懂,有興趣的同學可以去學習學習。

這篇文章主要是按照自己的思路來講解對Http和Https的理解。文章將會從以下幾個方面介紹。

目錄樹:

一、網絡層結構二、Http協議三、Tcp三次握手四、Https協議/SSL協議五、SSL證書六、RSA加密和DH加密七、Http和Https對比從目錄結構可以看出,每個標題展開來說都是一個很大的主題。但本文旨在讓各位同學對Http和Https相關知識有一個全面的認知,不會太過深入探討各個主題,有興趣的同學可以進行針對性研究。

一、網絡層結構

網絡結構有兩種主流的分層方式:OSI七層模型和TCP/IP四層模型。

OSI七層模型和TCP/IP四層模型

OSI是指Open System Interconnect,意為開放式系統互聯。

TCP/IP是指傳輸控制協議/網間協議,是目前世界上應用最廣的協議。

兩種模型區別

1、OSI採用七層模型,TCP/IP是四層模型

2、TCP/IP網絡接口層沒有真正的定義,只是概念性的描述。OSI把它分為2層,每一層功能詳盡。

3、在協議開發之前,就有了OSI模型,所以OSI模型具有共通性,而TCP/IP是基於協議建立的模型,不適用於非TCP/IP的網絡。

4、實際應用中,OSI模型是理論上的模型,沒有成熟的產品;而TCP/IP已經成為國際標準。

二、HTTP協議

Http是基於TCP/IP協議的應用程式協議,不包括數據包的傳輸,主要規定了客戶端和伺服器的通信格式,默認使用80埠。

Http協議的發展歷史

1、1991年發布Http/0.9版本,只有Get命令,且服務端直返HTML格式字符串,伺服器響應完畢就關閉TCP連接。

2、1996年發布Http/1.0版本,優點:可以發送任何格式內容,包括文字、圖像、視頻、二進位。也豐富了命令Get,Post,Head。請求和響應的格式加入頭信息。缺點:每個TCP連接只能發送一個請求,而新建TCP連接的成本很高,導致Http/1.0新能很差。

3、1997發布Http/1.1版本,完善了Http協議,直至20年後的今天仍是最流行的版本。

優點:a. 引入持久連接,TCP默認不關閉,可被多個請求復用,對於一個域名,多數瀏覽器允許同時建立6個持久連接。b. 引入管道機制,即在同一個TCP連接中,可以同時發送多個請求,不過伺服器還是按順序響應。c. 在頭部加入Content-Length欄位,一個TCP可以同時傳送多個響應,所以就需要該欄位來區分哪些內容屬於哪個響應。d. 分塊傳輸編碼,對於耗時的動態操作,用流模式取代緩存模式,即產生一塊數據,就發送一塊數據。e. 增加了許多命令,頭信息增加Host來指定伺服器域名,可以訪問一臺伺服器上的不同網站。

缺點:TCP連接中的響應有順序,伺服器處理完一個回應才能處理下一個回應,如果某個回應特別慢,後面的請求就會排隊等著(對頭堵塞)。

4、2015年發布Http/2版本,它有幾個特性:二進位協議、多工、數據流、頭信息壓縮、伺服器推送。

Http請求和響應格式

Request格式:

GET /barite/account/stock/groups HTTP/1.1 QUARTZ-SESSION: MC4xMDQ0NjA3NTI0Mzc0MjAyNg.VPXuA8rxTghcZlRCfiAwZlAIdCA DEVICE-TYPE: ANDROID API-VERSION: 15 Host: shitouji.bluestonehk.com Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/3.10.0 Response格式:

HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Mon, 15 Oct 2018 03:30:28 GMT Content-Type: application/json;charset=UTF-8 Pragma: no-cache Cache-Control: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT Content-Encoding: gzip Transfer-Encoding: chunked Proxy-Connection: Keep-alive {"errno":0,"dialogInfo":null,"body":{"list":[{"flag":2,"group_id":1557,"group_name":"港股","count":1},{"flag":3,"group_id":1558,"group_name":"美股","count":7},{"flag":1,"group_id":1556,"group_name":"全部","count":8}]},"message":"success"} 說明一下請求頭和響應頭的部分欄位:

Host:指定伺服器域名,可用來區分訪問一個伺服器上的不同服務Connection:keep-alive表示要求伺服器不要關閉TCP連接,close表示明確要求關閉連接,默認值是keep-aliveAccept-Encoding:說明自己可以接收的壓縮方式User-Agent:用戶代理,是伺服器能識別客戶端的作業系統(Android、IOS、WEB)及相關的信息。作用是幫助伺服器區分客戶端,並且針對不同客戶端讓用戶看到不同數據,做不同操作。Content-Type:伺服器告訴客戶端數據的格式,常見的值有text/plain,image/jpeg,image/png,video/mp4,application/json,application/zip。這些數據類型總稱為MIME TYPE。Content-Encoding:伺服器數據壓縮方式Transfer-Encoding:chunked表示採用分塊傳輸編碼,有該欄位則無需使用Content-Length欄位。Content-Length:聲明數據的長度,請求和回應頭部都可以使用該欄位。三、Tcp三次握手

Http和Https協議請求時都會通過Tcp三次握手建立Tcp連接。

那麼,三次握手是指什麼呢?

那麼,為什麼一定要三次握手呢,一次可以嗎?兩次可以嗎?

帶著這些問題,我們來分析一下為什麼必須是三次握手。

1、第一次握手,A向B發送信息後,B收到信息。B可確認A的發信能力和B的收信能力

2、第二次握手,B向A發消息,A收到消息。A可確認A的發信能力和收信能力,A也可確認B的收信能力和發信能力

3、第三次握手,A向B發送消息,B接收到消息。B可確認A的收信能力和B的發信能力

通過三次握手,A和B都能確認自己和對方的收發信能力,相當於建立了互相的信任,就可以開始通信了。

下面,我們介紹一下三次握手具體發送的內容,用一張圖描述如下:

首先,介紹一下幾個概念:

ACK:響應標識,1表示響應,連接建立成功之後,所有報文段ACK的值都為1SYN:連接標識,1表示建立連接,連接請求和連接接受報文段SYN=1,其他情況都是0FIN:關閉連接標識,1標識關閉連接,關閉請求和關閉接受報文段FIN=1,其他情況都是0,跟SYN類似seq number:序號,一個隨機數X,請求報文段中會有該欄位,響應報文段沒有ack number:應答號,值為請求seq+1,即X+1,除了連接請求和連接接受響應報文段沒有該欄位,其他的報文段都有該欄位知道了上面幾個概念後,看一下三次握手的具體流程:

1、第一次握手:建立連接請求。客戶端發送連接請求報文段,將SYN置為1,seq為隨機數x。然後,客戶端進入SYN_SEND狀態,等待伺服器確認。

2、第二次握手:確認連接請求。伺服器收到客戶端的SYN報文段,需要對該請求進行確認,設置ack=x+1(即客戶端seq+1)。同時自己也要發送SYN請求信息,即SYN置為1,seq=y。伺服器將SYN和ACK信息放在一個報文段中,一併發送給客戶端,伺服器進入SYN_RECV狀態。

3、第三次握手:客戶端收到SYN+ACK報文段,將ack設置為y+1,向伺服器發送ACK報文段,這個報文段發送完畢,客戶端和服務券進入ESTABLISHED狀態,完成Tcp三次握手。

從圖中可以看出,建立連接經歷了三次握手,當數據傳輸完畢,需要斷開連接,而斷開連接經歷了四次揮手:

1、第一次揮手:主機1(可以是客戶端或伺服器),設置seq和ack向主機2發送一個FIN報文段,此時主機1進入FIN_WAIT_1狀態,表示沒有數據要發送給主機2了

2、第二次揮手:主機2收到主機1的FIN報文段,向主機1回應一個ACK報文段,表示同意關閉請求,主機1進入FIN_WAIT_2狀態。

3、第三次揮手:主機2向主機1發送FIN報文段,請求關閉連接,主機2進入LAST_ACK狀態。

4、第四次揮手:主機1收到主機2的FIN報文段,想主機2回應ACK報文段,然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段後,關閉連接。此時主機1等待主機2一段時間後,沒有收到回復,證明主機2已經正常關閉,主機1頁關閉連接。

下面是Tcp報文段首部格式圖,對於理解Tcp協議很重要:

四、Https協議/SSL協議

Https協議是以安全為目標的Http通道,簡單來說就是Http的安全版。主要是在Http下加入SSL層(現在主流的是SLL/TLS),SSL是Https協議的安全基礎。Https默認埠號為443。

前面介紹了Http協議,各位同學能說出Http存在的風險嗎?

1、竊聽風險:Http採用明文傳輸數據,第三方可以獲知通信內容

2、篡改風險:第三方可以修改通信內容

3、冒充風險:第三方可以冒充他人身份進行通信

SSL/TLS協議就是為了解決這些風險而設計,希望達到:

1、所有信息加密傳輸,三方竊聽通信內容

2、具有校驗機制,內容一旦被篡改,通信雙發立刻會發現

3、配備身份證書,防止身份被冒充

下面主要介紹SSL/TLS協議。

SSL發展史(網際網路加密通信)

1、1994年NetSpace公司設計SSL協議(Secure Sockets Layout)1.0版本,但未發布。

2、1995年NetSpace發布SSL/2.0版本,很快發現有嚴重漏洞

3、1996年發布SSL/3.0版本,得到大規模應用

4、1999年,發布了SSL升級版TLS/1.0版本,目前應用最廣泛的版本

5、2006年和2008年,發布了TLS/1.1版本和TLS/1.2版本

SSL原理及運行過程

SSL/TLS協議基本思路是採用公鑰加密法(最有名的是RSA加密算法)。大概流程是,客戶端向伺服器索要公鑰,然後用公鑰加密信息,伺服器收到密文,用自己的私鑰解密。

為了防止公鑰被篡改,把公鑰放在數字證書中,證書可信則公鑰可信。公鑰加密計算量很大,為了提高效率,服務端和客戶端都生成對話秘鑰,用它加密信息,而對話秘鑰是對稱加密,速度非常快。而公鑰用來機密對話秘鑰。

下面用一張圖表示SSL加密傳輸過程:

詳細介紹一下圖中過程:

1、客戶端給出協議版本號、一個客戶端隨機數A(Client random)以及客戶端支持的加密方式

2、服務端確認雙方使用的加密方式,並給出數字證書、一個伺服器生成的隨機數B(Server random)

3、客戶端確認數字證書有效,生成一個新的隨機數C(Pre-master-secret),使用證書中的公鑰對C加密,發送給服務端

4、服務端使用自己的私鑰解密出C

5、客戶端和伺服器根據約定的加密方法,使用三個隨機數ABC,生成對話秘鑰,之後的通信都用這個對話秘鑰進行加密。

SSL證書

上面提到了,Https協議中需要使用到SSL證書。

SSL證書是一個二進位文件,裡面包含經過認證的網站公鑰和一些元數據,需要從經銷商購買。

證書有很多類型,按認證級別分類:

域名認證(DV=Domain Validation):最低級別的認證,可以確認申請人擁有這個域名公司認證(OV=Organization Validation):確認域名所有人是哪家公司,證書裡面包含公司的信息擴展認證(EV=Extended Validation):最高級別認證,瀏覽器地址欄會顯示公司名稱。EV證書瀏覽器地址欄樣式:

OV證書瀏覽器地址欄樣式:

DV證書瀏覽器樣式:

按覆蓋範圍分類:

單域名證書:只能用於單域名,foo.com證書不能用不www.foo.com通配符證書:可用於某個域名及所有一級子域名,比如*.foo.com的證書可用於foo.com,也可用於www.foo.com多域名證書:可用於多個域名,比如foo.com和bar.com認證級別越高,覆蓋範圍越廣的證書,價格越貴。也有免費的證書,為了推廣Https,電子前哨基金會成立了Let's Encrypt提供免費證書。

https://letsencrypt.org/

證書的經銷商也很多,知名度比較高的有亞洲誠信(Trust Asia)。

五、RSA加密和DH加密

加密算法分類

加密算法分為對稱加密、非對稱加密和Hash加密算法。

對稱加密:甲方和乙方使用同一種加密規則對信息加解密非對稱加密:乙方生成兩把秘鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲取,私鑰是保密的,只存在於乙方手中。甲方獲取公鑰,然後用公鑰加密信息,乙方得到密文後,用私鑰解密。Hash加密:Hash算法是一種單向密碼體制,即只有加密過程,沒有解密過程對稱加密算法加解密效率高,速度快,適合大數據量加解密。常見的堆成加密算法有DES、AES、RC5、Blowfish、IDEA

非對稱加密算法複雜,加解密速度慢,但安全性高,一般與對稱加密結合使用(對稱加密通信內容,非對稱加密對稱秘鑰)。

常見的非對稱加密算法有RSA、DH、DSA、ECC

Hash算法特性是:輸入值一樣,經過哈希函數得到相同的散列值,但並非散列值相同則輸入值也相同。常見的Hash加密算法有MD5、SHA-1、SHA-X系列

下面著重介紹一下RSA算法和DH算法。

RSA加密算法

Https協議就是使用RSA加密算法,可以說RSA加密算法是宇宙中最重要的加密算法。

RSA算法用到一些數論知識,包括互質關係,歐拉函數,歐拉定理。此處不具體介紹加密的過程,如果有興趣,可以參照RSA算法加密過程。

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

RSA算法的安全保障基於大數分解問題,目前破解過的最大秘鑰是700+位,也就代表1024位秘鑰和2048位秘鑰可以認為絕對安全。

大數分解主要難點在於計算能力,如果未來計算能力有了質的提升,那麼這些秘鑰也是有可能被破解的。

DH加密算法

DH也是一種非對稱加密算法,DH加密算法過程。

https://zh.wikipedia.org/wiki/%E8%BF%AA%E8%8F%B2-%E8%B5%AB%E7%88%BE%E6%9B%BC%E5%AF%86%E9%91%B0%E4%BA%A4%E6%8F%9B

DH算法的安全保障是基於離散對數問題。

六、Http協議和Https協議的對比

Http和Https的區別如下:

1、https協議需要到CA申請證書,大多數情況下需要一定費用

2、Http是超文本傳輸協議,信息採用明文傳輸,Https則是具有安全性SSL加密傳輸協議

3、Http和Https埠號不一樣,Http是80埠,Https是443埠

4、Http連接是無狀態的,而Https採用Http+SSL構建可進行加密傳輸、身份認證的網絡協議,更安全。

5、Http協議建立連接的過程比Https協議快。因為Https除了Tcp三次握手,還要經過SSL握手。連接建立之後數據傳輸速度,二者無明顯區別。

總結

經過了3天的學習和總結,總算完成了這篇文章,本文可以幫助讀者大體上把握Http和Https的知識框架。

相關焦點

  • 全面了解HTTP和HTTPS
    Http和Https屬於計算機網絡範疇,但作為開發人員,不管是後臺開發或是前臺開發,都很有必要掌握它們。在學習Http和Https的過程中,主要是參考了阮一峰老師的博客,講的很全面,並且通俗易懂,有興趣的同學可以去學習學習。
  • 帶你全面了解Http和Https
    Http和Https屬於計算機網絡範疇,但作為開發人員,不管是後臺開發或是前臺開發,都很有必要掌握它們。在學習Http和Https的過程中,主要是參考了阮一峰老師的博客,講的很全面,並且通俗易懂,有興趣的同學可以去學習學習。
  • HTTP和HTTPS是什麼?
    網站的URL會分為兩部分:通信協議和域名地址。域名地址都很好理解,不同的域名地址表示網站中不同的頁面,而通信協議,簡單來說就是瀏覽器和伺服器之間溝通的語言。網站中的通信協議一般就是HTTP協議和HTTPS協議。兩者分別是什麼,有什麼區別呢?
  • Android開發必備的「80」個開源庫
    /一些常用的開發工具類https://github.com/l123456789jy/LazyAndroid-Studio-Pluginshttps://github.com/balsikandar/Android-Studio-Plugins最全面的高質量 Android 面試指南https://github.com
  • HTTP和HTTPS的區別?
    本文主要講解http和https的關係與區別,分辨不清區別的同學要注意朝下看完,Web面試中最常問的已到面試題~~一.HTTP 和HTTPS
  • 網站域名http切換https
    傳統的http協議已經面臨淘汰,主要原因存在多個不安全因素,如果你是元老級上網的網民,你會發現曾經打開一種網站,會彈出很多站點及廣告,這些內容很快將電腦變的非常卡。傳統的http除了安全問題還會洩漏用戶隱私信息,數據被劫持顯而易見。
  • http與https的區別是什麼?前者已經逐漸被後者取代
    http或許對上網用戶並不陌生,只要我們在瀏覽器中查看網頁,那麼就會需要用到http,那麼http是什麼呢?至尚風華在網絡安全問題上,http不完全滿足用戶瀏覽網頁的安全,很多網站在創建時進行的身份驗證並不全面,而且在傳輸加密上,http在網際網路快速發展的浪潮中顯然有些過時了,那麼在這個時候
  • HTTPS和HTTP的區別和選擇建議 建站是否必須使用HTTPS
    如今我們大部分站長建站肯定會較多的選擇HTTPS,畢竟對於我們是使用免費SSL證書,還是付費證書基本上技術層面和成本預算考慮還是可以滿足的。 這幾天和網友在討論http與https的區別的時候又提到安裝證書的必要性問題。因為我們看到有些比較老的網站,當然也是非常優秀的個人站長都沒有使用SSL證書實現HTTPS加密。問到站長的原因是他們擔心更換HTTPS之後收錄有問題,所以一直沒有更換,雖然也知道有些網絡是有劫持的,但是無奈不敢換。
  • 關於HTTP2和HTTPS,你不得不了解的東西
    、前言作者:Java3y連結:https://my.oschina.net/u/3777556/blog/1919845
  • 為什麼Node.js是Web開發人員必備工具?
    Node.js是Web開發人員一個有趣優秀的開發庫,它憑藉高並發性,目前已成為開發者選擇在Web開發中使用的主要工具之一,一般都是開發者的第二備選。比如Netflix,Uber和LinkedIn等科技公司對Node.js可以承受大量流量和高並發性的說法給予了很好信任。Node.js的初學者和中級開發人員要掌握與了解基本知識內容,其實是很困難的事情,需要多次實戰練習,掌握了基本知識,開發者就可以基本可以正常開發,所以Node.js主要是最基本的基礎擴展開來的。
  • 八個面向開發人員的機器學習平臺
    微軟還推出了三個人工智慧工具,內容管理器,自定義語音服務和Bing語音API,共25個開發者工具庫,旨在提高AI的可訪問性。6. ai-one(http://www.ai-one.com/)開發人員可以使用ai-one創建幾乎適用於任何軟體應用程式的智能助手。
  • HTTPS和HTTP有什麼區別,到底安全在哪裡?
    當你要和B完成第一次密鑰交換的時候,M把紙條扣了下來,假裝自己是B並偽造了一個key,然後用你發來的k1加密了key發還給你。  你以為你和B完成了密鑰交換,實際上你是和M完成了密鑰交換。  同事M和B完成一次密鑰交換,讓B以為和A你完成了密鑰交換。
  • 開發人員應該了解的五款Julia IDE
    如果你已經是 Julia 程式設計師或開發人員的話,你可能想要了解可用的頂級 IDE 都有哪些。當你使用像 Juno 這樣的優秀 IDE 時,Julia 會更易於使用。對於想要創建複雜應用程式的開發人員來說,IDE 可能非常有用,但是必須指出,這種語言沒有特定的 IDE,必須根據對這種語言的熟悉程度和可用性來選擇 IDE。
  • 產品經理懂點技術:什麼是https,與http有什麼區別
    本文主要圍繞https和與http的異同點進行分析了探究,與大家分享。某天,產品汪突然發現,自家的產品在電腦瀏覽器上打開、在微信瀏覽器裡面打開,都被提示「不安全」!這樣用戶看到該有多困擾啊。經過一番研究,原來是自家產品的網址,都是http開頭的,而不是https開頭的,與程序猿哥哥溝通一番後,全部連結換成了https,就再也不會有這樣的提示了。什麼是http?要搞清什麼是https前,首先要了解什麼是http。
  • 開發人員必備!6大不可缺少的工具
    每個人都有自己用慣了的工具,本文將介紹6種我認為必備的工具,你不妨試試看。這對網站性能和可訪問性都非常重要。許多開發人員開始進行Web開發,主要學習組合美觀的網站。然而性能原則經常被忽視了,其實性能與審美同樣重要。有些網站規模太大,負載了過多資源,以致於緩慢的網速無法支撐運行,或者網頁瀏覽損耗行動裝置的電池。不妨使用Lighthous,加速和優化您的網站。
  • 一文徹底拿下HTTP/HTTPS協議
    隨著1995年開發出Apache,同時其他的多媒體等技術發展迅速,從而進一步的促使HTTP新功能的出現。那QUIC有啥牛掰的地方呢QUIC是Google開發的一個基於UDP且能像TCP一樣具有可靠性特點的協議。具備像HTTP/2一樣的應用數據二進位分幀傳輸。其主要解決的問題有兩個。進一步解決線頭阻塞問題。通過獨立不同流,讓各個流之間實現相互獨立傳輸,互不幹擾切換網絡時的連接保持。wifi和3G/4G經常需要來回切換。
  • HTTPS 證書生成原理和部署細節
    HTTPS的傳輸採用的是非對稱加密,一組非對稱加密密鑰包含公鑰和私鑰,通過公鑰加密的內容只有私鑰能夠解密。上面我們看到,整個傳輸過程,伺服器端是沒有透露私鑰的。而 CA 數字認證涉及到私鑰,整個過程比較複雜,我也沒有很深入的了解,後續有詳細了解之後再補充下。
  • 【福利大放送】不止是Android,Github超高影響力開源大放送,學習開發必備教科書
    作者        本文由 南塵 投稿,博客地址:http
  • 後端開發必備的 RestFul API 知識
    RestFul API 是每個程式設計師都應該了解並掌握的基本知識,我們在開發過程中設計API的時候也應該至少要滿足RestFul API
  • 關於 HTTP2 和 HTTPS,這些你必須要知道
    #掃描上方二維碼報名成都源創會#作者:Java3y