HTTP協議講解

http協議是基於tcp協議,默認是80端口。它的特點是什麼?它是基於請求和響應的,大家抓個包能看到http協議有一個請求報文有一個響應報文,還有它是一個無狀態的協議,還有一個無連接的協議。

HTTP協議講解

HTTP協議講解

HTTP協議講解

無連接是指:

http協議每次只能處理一個請求,限制我們每次連接只處理一個請求,就是服務器處理完客戶的一個請求,並且收到客戶的應答之後就會斷開連接,即一個連接處理一個請求。

後續再有其他請求需要重新發起連接。它採用這種方式啊,其實是為了節省時間,但是一般web頁面都比較複雜,可能需要在一個連接裡面要處理多個請求,這時就不希望處理完一個請求,就斷開連接,而是希望一個連接裡面要去處理多個請求,於是在這個協議裡面定義了一個新的功能叫做keep alive機制,它就可以讓我們的一個連接保持。我們讓它保持之後呢,它就變成了一個長鏈接。

HTTP協議講解


無狀態是指:

就是這個協議對於客戶端是沒有任何的記憶能力,那它導致一個問題,例如一個請求,斷開了,沒有保留本次請求裡面的一個消息。然後下一個請求又來了。那麼此時要用到上一個請求的東西怎麼辦?這時候就需要重新傳輸。

比如說使用淘寶,用戶需要先進行登錄,然後再去購買商品,那登錄是一個請求,購買商品又是另外一個請求,那購買商品的時候是不是一定要先登錄,這時就希望他能夠給我保留一些登錄相關的信息,怎麼辦呢?這時候我們應該採取一些什麼樣的機制來進行呢?就是一個cookie的機制和一個session的一個機制。

HTTP協議講解

HTTP協議講解

明文就是沒有加過密的報文。所以賬號密碼都可以看見,非常的不安全,也不會對雙方的“身份”進行認證。比如說我們有一個客戶端,要想跟服務器進行一個通信,那中間如果有一個第三者,它就做了一個截取消息,篡改消息,因為客戶端和服務器它並沒有進行身份認證,所以中間第三者他可以把這個消息竊取到,進行修改之後再發給服務器。這是一個很不安全的地方,這就是http協議的一個非常明顯的一個缺點。基於這個缺點HTTPS(全稱:Hyper Text Transfer Protocol Secure)應運而生,就是超文本傳輸安全協議。

HTTP協議講解

https協議它是加過密的,它的報文我們叫做密文。沒有相關的密鑰是看不到裡面的具體消息,還可以保證我們的一個消息避免被竊取。

http + 加密 + 身份認證 + 完整性 = HTTPS

https協議是基於tcp的443端口。我們經常把https協議叫做披著ssl協議外殼的http協議。http協議和https協議都是基於TCP協議的,但是對於https協議呢,它是先有一個ssl協議的,它需要先有1個ssl封裝加密。HTTPS網絡中數據包的封裝的過程:先封裝一個ssl協議頭部,然後再去封裝一個http協議,所以它需要先去基於1個ssl加密的,然後呢在這個加密的基礎上面發送http的消息。

HTTP協議講解

ssl協議它有一個非常複雜的一個握手過程。不是tcp的這個握手,我們的ssl握手的過程。過程比較複雜,

大家可以看一下這個圖:

HTTP協議講解

這個圖的過程其實是很複雜的,我們用一個比較淺顯的例子來幫大家來理解這個過程。客戶端想要跟服務器建立連接的基礎上面去建立連接。

比如說這個女生是一個客戶端。這個男生是服務器。客戶端要去跟服務器建立https的連接。男生也是很有誠意的,他就說好呀,那既然你要跟我建立連接,我們先建立一個安全通道吧。

也就是ssl握手的過程。

第一條消息是由客戶端發起的。所以叫做client hello消息。消息包括客戶端支持的所有加密方式。男生(服務器)會在女生(客戶端)告訴的加密方式裡面去選一個一樣的加密方法,也就是要選擇一樣的語言來進行溝通。

第二條消息,是男生基於女生髮的第一條消息回應的一個消息。剛剛客戶端這邊叫做client hello,現在男生回覆的叫做server hello。

當然男生作為一個gentleman,他要表達他的誠意,他把他的身份證給了這個女生表示我是一個合法公民,相當於服務器的一張證書,給到了客戶端。那客戶端拿到這個證書,證書裡面包含了一些密鑰信息。所以拿到這個證書之後,她在本地默默地生成了一個密鑰,這個密鑰用來加密後面的傳輸數據,就是用來加密後面的http協議的交互消息的。她就把這個密鑰消息通過一定的方式來告訴了這個男生。男生也記下來了。它記下來之後,它也要發一條消息告訴這個客戶端我記下來了,那以後我們就用這個加密方式來進行一個安全聊天,至此我們的ssl握手就結束了。

剛剛那個是簡易過程,下圖為一個細化版。

HTTP協議講解

左邊是客戶端,右邊是服務器

客戶端給服務器發一個handshake(client hello)握手消息,把所有的加密規則都發給服務器,那服務器收到之後回了一個server hello,這裡麵包括一組加密算法,一個身份證消息,以證書的形式發給了瀏覽器,第二條消息是server hello,第三條消息也是我們的一個證書。客戶端獲得了證書之後去驗證他的證書,看他的身份是不是合法的。如果這個證書要是受信任的,客戶端就會在本地默默生成一個密鑰,生成的密鑰之後把這個密鑰告訴服務器。通過client key exchange就是客戶端密鑰來進行一個交換,他會給他發一個加密的一個套件說明給到客戶端。總共做的事情就是把我本地生成的密鑰告訴了客戶端,那服務器他收到之後也要去確認一下。那ssl握手就結束。

總結:

首先加密的功能通過客戶端生成的一個密鑰來進行加密,身份認證是通過服務器給發的證書做身份認證。只有服務器發了證書這種叫作單向認證。如果有些網站安全要求比較高,可以做雙向認證!單項認證只有服務器發了證書,那如果要去做雙向認證,就是客戶端和服務器都認證,相互交換證書,也就是說我的客戶端也要去向CA申請一張證書,然後把這張證書發給服務器,讓服務器也來認證一下我客戶端的身份

HTTP協議講解

完整性驗證就是防止有第三方去篡改消息,有一個叫作MD5的哈希算法,通過MD5進行哈希算法。相當於我打了一個補丁,放在客戶端的消息,然後把消息帶這個補丁發給服務器,讓服務器收到後再去驗證對比一下這個摘要的正確性,這個摘要跟客戶端的那個補丁是否一樣的,如果他們一樣,就表示這個消息沒有被篡改。

那面試官常常會問的一個問題就是:https協議和http協議的區別

HTTP協議講解

第一:安全性

從安全性角度, https協議是比http協議安全的,因為http是明文,易受攻擊,也沒有辦法認證身份,也沒有辦法保證數據的完整性,https協議呢?它密文加密了,還能認證身份,還能防止消息被篡改,對安全性是非常高的。這是他們兩個的第一個非常重要的區別.

第二:靈活性

http是tcp的80端口,https是tcp的443端口,靈活性不同, http協議也沒有複雜的握手過程,https因為ssl這個協議的實現過程比較複雜,有一些加密,有些密鑰的計算,有一些很複雜的技術在裡面,所以它的技術門檻比較高,如果你要基於這個技術去開發一個網站的話,它的技術要求會比較高。

第三:速度

很明顯http協議速度肯定快。因為它不需要經過複雜的ssl的握手,所以它的速度非常快。https協議需要經過一些複雜的安全過程,所以需要服務器性能好,服務器如果資源不夠,都沒有辦法承載這個複雜的加密算法,也會導致我們用戶的訪問速度會比較慢.

第四:經濟適用度

就是http協議,它沒有一些額外的費用。但是呢,https協議,要去CA頒發證書,這個需要花錢的,年費大概是600到1000左右,還需要一些技術支持等費用,它是比較貴的,https優勢這麼明顯,但是仍然有一些網站,像有一些小公司,由於對服務器要求比較高,可能就承擔不起.

關注我瞭解更多程序員資訊技術,領取豐富資料


HTTP協議講解


分享到:


相關文章: