自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你需要知道,高并發(fā)架構(gòu)下的HTTP

開(kāi)發(fā) 架構(gòu)
我們前面說(shuō)過(guò)了 CDN的知識(shí),也通過(guò)抓包分析了 TCP建立鏈接的過(guò)程。今天一起聊一聊應(yīng)用層的協(xié)議 HTTP/HTTPS;這是應(yīng)用工程師日常中接觸最久的協(xié)議了。但是你真的了解他嗎?

 我們前面說(shuō)過(guò)了 CDN的知識(shí),也通過(guò)抓包分析了 TCP建立鏈接的過(guò)程。今天一起聊一聊應(yīng)用層的協(xié)議 HTTP/HTTPS;這是應(yīng)用工程師日常中接觸最久的協(xié)議了。但是你真的了解他嗎?

[[277185]]

今天我們不講 HTTP協(xié)議 的幾種請(qǐng)求方式,主要介紹HTTP及HTTPS整個(gè)發(fā)送數(shù)據(jù)的過(guò)程。

消息結(jié)構(gòu)

還記得前面講的 DNS 的過(guò)程嗎?通過(guò)DNS我們拿到了服務(wù)端的IP地址,然后通過(guò)TCP協(xié)議,完成了瀏覽器與應(yīng)用服務(wù)器的連接建立。HTTP協(xié)議是建立在TCP協(xié)議之上的(上層協(xié)議必然依賴(lài)下層協(xié)議),連接建立后,自然是開(kāi)始通信。那么通信的格式是什么呢?

 

你需要知道,高并發(fā)架構(gòu)下的HTTP

看上面這張圖,HTTP的請(qǐng)求與響應(yīng)格式基本如此。我們分開(kāi)來(lái)說(shuō)。

對(duì)于 請(qǐng)求消息 ,由三部分構(gòu)成:請(qǐng)求行、請(qǐng)求頭、請(qǐng)求的Body;所謂的請(qǐng)求行,就是:POST / HTTP/1.1 這部分內(nèi)容。接下來(lái)的就是請(qǐng)求頭,也就是我們常說(shuō)的HTTP頭;然后換行后緊接著的內(nèi)容就是請(qǐng)求的Body,也就是正兒八經(jīng)發(fā)送給應(yīng)用的參數(shù)。

對(duì)于 響應(yīng)消息 ,也是由三部分構(gòu)成:狀態(tài)行、響應(yīng)頭、響應(yīng)的Body;關(guān)于響應(yīng)行就是標(biāo)記本次請(qǐng)求獲得的結(jié)果是什么,這里主要有:20X、30X、40X、50X這幾個(gè)范圍的狀態(tài)碼,需要熟記。響應(yīng)頭里邊重要的主要有跟緩存相關(guān)的東西,這部分內(nèi)容會(huì)知道瀏覽器、CDN等緩存體的緩存行為,需要有一定的了解;最后的實(shí)體就是你請(qǐng)求的想要的結(jié)構(gòu),比如:HTML、Json等等。

傳輸過(guò)程

消息構(gòu)建后,如何發(fā)送進(jìn)行傳輸呢?我們上面圖片中看到的是字符串內(nèi)容,HTTP本身是不能進(jìn)行網(wǎng)絡(luò)傳輸?shù)?,它必須依?lài)的底層的TCP協(xié)議建立的連接來(lái)發(fā)送數(shù)據(jù)。因此它實(shí)際上就是把這些構(gòu)建好的字符串傳給下層的TCP,至于TCP如何傳輸?shù)目梢钥瓷掀恼?,這里不展開(kāi)了。

WebService 收到數(shù)據(jù)后會(huì)對(duì)數(shù)據(jù)進(jìn)行處理然后交給應(yīng)用服務(wù)器,應(yīng)用服務(wù)器自然是將請(qǐng)求的Body作為輸入,然后根據(jù)要求產(chǎn)生輸出。輸出的行為受到請(qǐng)求頭中部分信息的控制,比如:格式(Content-Type)、編碼(Accept-Charset)等。而產(chǎn)生的輸出各個(gè)地方也會(huì)根據(jù)響應(yīng)頭進(jìn)行處理。

看到這里大家有沒(méi)有發(fā)現(xiàn)幾個(gè)問(wèn)題:HTTP依賴(lài)底層的TCP連接,也就是每個(gè)HTTP都需要進(jìn)行三次握手,效率是不是會(huì)非常慢?這種方式總需要瀏覽器端主動(dòng)發(fā)起鏈接,服務(wù)端想主動(dòng)推送些什么很無(wú)能為力;

針對(duì)上面這些問(wèn)題,HTTP2.0 協(xié)議也就誕生了,當(dāng)然上面這些問(wèn)題在 HTTP1.1 時(shí)代也有些解決方案。HTTP2.0 主要解決了協(xié)議頭進(jìn)行壓縮,傳輸同樣含義的內(nèi)容,占用帶寬更少速度更快;將上面的單向鏈接的方式改成二進(jìn)制流的方式,服務(wù)端有能力主動(dòng)推送數(shù)據(jù);一個(gè)鏈接里邊支持傳輸多種數(shù)據(jù)流。

關(guān)于 HTTP2.0 的內(nèi)容不是文本主要想說(shuō)的,大家可以自行了解下。接下來(lái)又到了 核心部分,關(guān)于 HTTPS 為什么安全、以及如何加密的解釋。這部分內(nèi)容算是面試的重要考點(diǎn)。

HTTPS為什么可靠

現(xiàn)在大網(wǎng)站基本都適用了HTTPS協(xié)議,那么它跟HTTP是什么關(guān)系呢?它其實(shí)就是HTTP加上TLS(SSL)安全層,合在一起就叫 HTTPS。為什么有了這層處理數(shù)據(jù)就安全了呢?

很簡(jiǎn)單,要想安全就得加密。加密的方式現(xiàn)在無(wú)非就是:對(duì)稱(chēng)加密 與 非對(duì)稱(chēng)加密。

對(duì)稱(chēng)加密: 加密與解密都是使用相同的密鑰,因此這種方式加密數(shù)據(jù),密鑰一定不能丟失。

非對(duì)稱(chēng)加密: 有兩把密鑰,私鑰與公鑰。使用私鑰加密的數(shù)據(jù)必須使用公鑰進(jìn)行解密,反之依然。

安全的代價(jià)

看起來(lái) 非對(duì)稱(chēng)加密 非常安全。不過(guò)對(duì)稱(chēng)加密的效率非常高。HTTPS正是綜合使用這兩種加密方式,讓整個(gè)傳輸過(guò)程變得安全。接下來(lái)看看這個(gè)過(guò)程是如何完成的。

對(duì)稱(chēng)加密

我們先來(lái)看看,如果HTTPS只使用 對(duì)稱(chēng)加密,能否滿(mǎn)足安全的需要呢?由于這種情況只有一個(gè)密鑰,服務(wù)端怎么把這個(gè)密鑰交給客戶(hù)端呢?線上傳輸肯定會(huì)泄漏。

所以單單有對(duì)稱(chēng)加密是不能滿(mǎn)足需求??磥?lái)得換個(gè)路子。

非對(duì)稱(chēng)加密

使用非對(duì)稱(chēng)加密的私鑰加密數(shù)據(jù),發(fā)給客戶(hù)端。客戶(hù)端用公鑰解密就得到了數(shù)據(jù)??雌饋?lái)好像沒(méi)有什么問(wèn)題。

但是這里有個(gè)問(wèn)題,由于服務(wù)端發(fā)出來(lái)的數(shù)據(jù)是使用的私鑰,由于公鑰是公開(kāi),這相當(dāng)于沒(méi)有加密。大家都能夠看到。并且服務(wù)端發(fā)出去的公鑰這個(gè)過(guò)程也可能被串改啊,你怎么知道你收到的公鑰就是服務(wù)器給你的呢?就跟現(xiàn)在很多詐騙公司一樣,看起來(lái)有模有樣,實(shí)則就是一皮包公司。

第三方公正

為了解決上述問(wèn)題,出現(xiàn)了一個(gè)所謂的 CA 機(jī)構(gòu),它怎么解決這個(gè)信任問(wèn)題呢?它將服務(wù)器的公鑰放到 CA證書(shū) 里邊傳給客戶(hù)端(這里指瀏覽器),瀏覽器拿到后驗(yàn)證一下這個(gè)證書(shū)是否真實(shí)有效,因?yàn)镃A機(jī)構(gòu)是有限可追溯的。就跟你的護(hù)照一樣,可辨別真?zhèn)?,所以CA證書(shū)證明了有效,那么CA證書(shū)中攜帶的公鑰自然也證明了自己的身份。

是不是看起來(lái)整個(gè)過(guò)程非常麻煩?沒(méi)有辦法為了安全,這點(diǎn)代價(jià)非常值得。這也是為什么我們常常說(shuō)HTTPS的效率略低于HTTP的原因。

工作模式

了解完上面的知識(shí),我們來(lái)看看HTTPS到底是如何工作的?

你需要知道,高并發(fā)架構(gòu)下的HTTP

客戶(hù)端發(fā)起了一個(gè)https請(qǐng)求,包含版本信息,加密套件候選列表,壓縮算法候選列表,隨機(jī)數(shù)random_c,擴(kuò)展字段等信息。這個(gè)過(guò)程此時(shí)是明文的。

然后服務(wù)器會(huì)進(jìn)行回復(fù),根據(jù)客戶(hù)端支持的算法信息、套件等,服務(wù)器選擇一個(gè)告訴客戶(hù)端,我們就用這個(gè)吧,同時(shí)也會(huì)返回一個(gè)隨機(jī)數(shù)random_s,后面協(xié)商密鑰有用。

服務(wù)端響應(yīng)客戶(hù)端,這個(gè)響應(yīng)中包含了證書(shū)的鏈接,用于交換密鑰。

客戶(hù)端對(duì)收到的數(shù)據(jù)進(jìn)行檢查,先把證書(shū)給拉下來(lái),然后檢查各種指標(biāo),如果不合法,會(huì)看到瀏覽器提醒不安全。

如果驗(yàn)證通過(guò),就會(huì)生成一個(gè) 隨機(jī)數(shù)字 Pre-master,并用證書(shū)公鑰加密(非對(duì)稱(chēng)加密),發(fā)送給服務(wù)器。

此時(shí)的客戶(hù)端已經(jīng)有了生成證書(shū)的全部?jī)?nèi)容,它會(huì)計(jì)算協(xié)商的密鑰(對(duì)稱(chēng)密鑰),然后告訴服務(wù)端以后通信都采用協(xié)商的通信密鑰和加密算法進(jìn)行加密通信。緊接著會(huì)用協(xié)商的密鑰加密一段數(shù)據(jù)發(fā)給服務(wù)端,看看是否能夠正常。

上面這步里邊,客戶(hù)端發(fā)送了三個(gè)請(qǐng)求。服務(wù)器先將收到的 Pre-master 用自己的私鑰解密出來(lái)。然后驗(yàn)證客戶(hù)端用對(duì)稱(chēng)加密發(fā)過(guò)來(lái)的數(shù)據(jù),如果通過(guò),則也會(huì)告知客戶(hù)端后續(xù)的通信都采用協(xié)商的密鑰與算法進(jìn)行加密通信。

并且服務(wù)端也會(huì)用對(duì)稱(chēng)加密生成一段加密信息給客戶(hù)端讓客戶(hù)端試試(對(duì)稱(chēng)密鑰)。

客戶(hù)端使用對(duì)稱(chēng)密鑰正確完成解密。握手結(jié)束。開(kāi)始使用對(duì)稱(chēng)密鑰的方式進(jìn)行數(shù)據(jù)傳輸。

總結(jié)

由于不讓文章顯得過(guò)于復(fù)雜,我只介紹了最簡(jiǎn)單的單向認(rèn)證。這種安全性并不是最高,單日常中也足夠了。

本文從源頭講了為什么只有對(duì)稱(chēng)加密搞不定這件事;一步步演化出HTTPS的整個(gè)過(guò)程。

首先,為了效率,整個(gè)過(guò)程只采用了一次非對(duì)稱(chēng)加密來(lái)加密 Pre-master;

其次,客戶(hù)端、服務(wù)端分別使用了一次對(duì)稱(chēng)加密來(lái)進(jìn)行密鑰有效性的驗(yàn)證,來(lái)防止中間人攻擊;

最后,也說(shuō)了為什么整個(gè)過(guò)程需要CA機(jī)構(gòu)的參與。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2022-04-29 09:00:00

Platform架構(gòu)內(nèi)核線程

2022-06-07 14:38:40

云原生架構(gòu)云計(jì)算

2020-05-07 10:14:00

企業(yè)架構(gòu)師CIOIT網(wǎng)絡(luò)

2011-09-20 10:56:35

云計(jì)算PaaS

2018-09-10 09:26:33

2022-08-10 09:03:35

TypeScript前端

2024-06-04 16:51:11

2018-05-30 15:15:47

混合云公共云私有云

2019-10-23 10:36:46

DevSecOpsDevOps

2014-07-31 17:13:50

編碼程序員

2020-03-27 12:30:39

python開(kāi)發(fā)代碼

2023-01-30 11:43:04

開(kāi)源代碼

2018-02-08 08:08:12

2023-01-09 17:23:14

CSS技巧

2015-06-30 10:59:22

MobileWeb適配

2023-02-10 08:44:05

KafkaLinkedIn模式

2013-03-04 09:34:48

CSSWeb

2018-06-27 15:14:31

HTTP編碼內(nèi)容

2024-04-03 10:29:13

JavaScrip優(yōu)化技巧

2022-08-05 11:03:59

TCP 四次揮手三次握手
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)