門戶網(wǎng)站開發(fā)價(jià)格競(jìng)價(jià)排名適合百度嗎
1. TCP/IP四層協(xié)議
? ? ? ? 記得大學(xué)學(xué)網(wǎng)絡(luò)課程的時(shí)候,學(xué)的都是OSI/RM七層協(xié)議,應(yīng)用層 -> 表示層 -> 會(huì)話層 -> 傳輸層->網(wǎng)絡(luò)層->數(shù)據(jù)鏈路層->物理層,當(dāng)時(shí)學(xué)的時(shí)候,感覺太抽象了,學(xué)得個(gè)一知半解。大腦在接收新東西時(shí),需要有個(gè)具體實(shí)物或模型對(duì)應(yīng),將知識(shí)具像化,再高深的知識(shí)都容易理解。
? ? ? ? 言歸正傳,本文主要是總結(jié)一下HTTP通信過程,以及HTTPS是在HTTP基礎(chǔ)上干了什么,而HTTP2.0又是對(duì)HTTP1.1做了啥大刀闊斧的改進(jìn)。在講這些之前,先講講TCP/IP四層協(xié)議。雖然OSI/RM七層協(xié)議是理論標(biāo)準(zhǔn),TPC/IP四層協(xié)議是事實(shí)標(biāo)準(zhǔn),多少層都無所謂,只是計(jì)算機(jī)/網(wǎng)絡(luò)科學(xué)家按一定規(guī)則分的,便于理解和傳播。
? ? ? ? TCP/IP四層協(xié)議:應(yīng)用層 -> 傳輸層 -> 網(wǎng)絡(luò)層 -> 數(shù)據(jù)鏈路層,此處“應(yīng)用層”對(duì)應(yīng)OSI/RM的“應(yīng)用層 -> 表示層 -> 會(huì)議層”,此處“數(shù)據(jù)鏈路層”對(duì)應(yīng)OSI/RM的“數(shù)據(jù)鏈路層->物理層”(后續(xù)筆者再補(bǔ)個(gè)映射圖吧)。
1.1 應(yīng)用層協(xié)議
舉例:HTTP、FTP、SMTP、POP3......
作用:應(yīng)用層負(fù)責(zé)為用戶提供網(wǎng)絡(luò)服務(wù),例如電子郵件、文件傳輸和遠(yuǎn)程登錄
1.2 傳輸層協(xié)議
舉例:TCP、UDP
作用:傳輸層負(fù)責(zé)在網(wǎng)絡(luò)中建立端到端的連接,提供可靠的數(shù)據(jù)傳輸。注:
- TCP協(xié)議是一種可靠的傳輸協(xié)議,通過三次握手建立連接,并通過序列號(hào)和確認(rèn)號(hào)來保證數(shù)據(jù)的可靠傳輸。
- UDP協(xié)議是一種無連接的傳輸協(xié)議,是基于IP協(xié)議的傳輸協(xié)議,不提供可靠的數(shù)據(jù)傳輸服務(wù),較低的延遲和較小的數(shù)據(jù)包頭部開銷。
1.3 網(wǎng)絡(luò)層協(xié)議
舉例:IP、ARP、ICMP、IGMP......
作用:網(wǎng)絡(luò)層負(fù)責(zé)將數(shù)據(jù)包從一個(gè)節(jié)點(diǎn)傳輸?shù)搅硪粋€(gè)節(jié)點(diǎn),并提供尋址和路由功能
- IP協(xié)議是一種無連接的協(xié)議,是基于ARP協(xié)議的網(wǎng)絡(luò)層協(xié)議,IP協(xié)議負(fù)責(zé)將數(shù)據(jù)從源主機(jī)發(fā)送到目的主機(jī),通過IP地址來標(biāo)識(shí)主機(jī)位置。
- ARP協(xié)議是一種用于解析IP地址和MAC地址之間映射關(guān)系的協(xié)議,它是基于IP協(xié)議的網(wǎng)絡(luò)層協(xié)議,ARP負(fù)責(zé)將IP地址轉(zhuǎn)換為MAC地址,以便在局域網(wǎng)中進(jìn)行數(shù)據(jù)通信。
- ICMP協(xié)議是一種用于網(wǎng)絡(luò)管理的協(xié)議,是基于IP協(xié)議的網(wǎng)絡(luò)層協(xié)議,ICMP負(fù)責(zé)報(bào)告網(wǎng)絡(luò)錯(cuò)誤和狀態(tài)信息,例如:網(wǎng)絡(luò)不可達(dá)、主機(jī)不可達(dá)。
1.4 數(shù)據(jù)鏈路層協(xié)議
舉例:Ethernet、Wi-Fi、PPP(Point-to-Point Procotol)、ATM(Asynchronous Transfer Mode)
作用:數(shù)據(jù)鏈路層負(fù)責(zé)將數(shù)據(jù)包從一個(gè)節(jié)點(diǎn)傳輸?shù)搅硪粋€(gè)節(jié)點(diǎn),并提供錯(cuò)誤檢測(cè)和修復(fù)功能
2. HTTP協(xié)議和TCP三次握手/四次揮手
2.1 HTTP協(xié)議數(shù)據(jù)包裝過程
應(yīng)用層:上層數(shù)據(jù)(HTTP頭部 + HTTP body)
傳輸層:TCP頭 + 上層數(shù)據(jù)
網(wǎng)絡(luò)層:IP頭 + TCP頭 + 上層數(shù)據(jù)
數(shù)據(jù)鏈路層:LLC頭 +?IP頭 + TCP頭 + 上層數(shù)據(jù) + FCS
MAC頭 + LLC頭 +?IP頭 + TCP頭 + 上層數(shù)據(jù) + FCS
2.2?TCP建立連接-三次握手
SYN seq=x(client -> sever)
SYN seq=y?ACK=x+1(server -> client)
ACK=y+1(client -> server)
2.3 TCP斷開連接-四次揮手
FIN seq=x+2 ACK=y+1(client -> server)
ACK=x+3(server -> client)
FIN seq=y+1(server -> client)
ACK=y+2(client -> server)
3. HTTPS
????????HTTP數(shù)據(jù)是未加密的,別有用心者在網(wǎng)絡(luò)某個(gè)節(jié)點(diǎn)上抓包,可以很容易知道傳了什么數(shù)據(jù)。為了數(shù)據(jù)安全的傳輸,提出來超文本傳輸安全協(xié)議HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer)。HTTPS涉及對(duì)稱加密和非對(duì)稱加密:
3.1 對(duì)稱加密
- 明文 + 密鑰 -> 密文
- 密文 + 密鑰 -> 明文
即加密和解密是用同一個(gè)密鑰,需要保障密鑰的安全。
3.2 非對(duì)稱加密
- 明文 + 私鑰?-> 密文1
- 密文1+ 公鑰 -> 明文
- 明文 + 公鑰?-> 密文2
- 密鑰2 + 私鑰 -> 明文
即私鑰加密公鑰解密,公鑰加密私鑰解密。
由于公鑰是公開的,也即私鑰加密的數(shù)據(jù),沒有安全性,因此需要結(jié)果對(duì)稱加密一起使用。例如:對(duì)稱加密的密鑰Key,通過非對(duì)稱加密的公鑰PublicKey加密,傳給對(duì)端;對(duì)端使用私鑰PrivateKey解密拿到對(duì)稱加密的密鑰Key,后續(xù)二者就通過對(duì)稱加密來交換數(shù)據(jù)即可。
(PS:對(duì)稱和非對(duì)稱加密,是一種比較有趣的二進(jìn)制數(shù)學(xué)運(yùn)算,有興趣的同學(xué)可以了解一下,筆者后續(xù)推出詳細(xì)介紹加解密的文章)
3.3 對(duì)稱加密+非對(duì)稱加密
- 客戶端向服務(wù)器請(qǐng)求公鑰
- 服務(wù)器響應(yīng)公鑰信息給客戶端
- 客戶端隨機(jī)生成一個(gè)隨機(jī)數(shù)(對(duì)稱加密的密鑰),并使用公鑰進(jìn)行加密,發(fā)送給服務(wù)端
- 服務(wù)端根據(jù)私鑰對(duì)數(shù)據(jù)進(jìn)行解密,得到對(duì)稱加密的密鑰
- 后續(xù)客戶端與服務(wù)端對(duì)稱加密的方式進(jìn)行通信
兩個(gè)問題:
- 數(shù)字簽名解決報(bào)文被篡改的問題:將發(fā)送的數(shù)據(jù)用Hash算法生成消息摘要,然后用私鑰生成數(shù)字簽名,與原文一起發(fā)送,接收者用公鑰解開得到摘要信息A,再用Hash對(duì)接收到的原文生成一個(gè)摘要信息B,A和B進(jìn)行比較,說明信息未被篡改。
- 數(shù)字證書解決通信身份被偽裝的問題
3.4 HTTPS通信
TLS握手過程:明文 -> 非對(duì)稱加密 -> 對(duì)稱加密
Step 1:TCP三次握手
Step 2:瀏覽器給出TLS協(xié)議版本號(hào)、客戶端生成隨機(jī)數(shù)1、客戶端支持的加密方法(明文通信)?
Step 3:服務(wù)器確認(rèn)雙方使用的加密方法,給出數(shù)字證書、服務(wù)器生成隨機(jī)數(shù)2(明文通信)
Step 4:瀏覽器確認(rèn)證書有效,生成隨機(jī)數(shù)3,使用數(shù)字證書的公鑰加密隨機(jī)數(shù)3,發(fā)給服務(wù)器
Step 5:服務(wù)器使用私鑰解密出隨機(jī)數(shù)3(Premaster secret)
Step 6:客戶端和服務(wù)器根據(jù)約定的加密方法,使用隨機(jī)數(shù)1(Client random)、隨機(jī)數(shù)2(Pre-mastersecret)、隨機(jī)數(shù)3(Pre-mastersecret),經(jīng)過特定算法生成對(duì)話密鑰(session key),用來加密接下來的對(duì)話過程
Step 7:客戶端和服務(wù)器都會(huì)第一次使用會(huì)話密鑰加密一個(gè)消息發(fā)送給對(duì)方
簡單一點(diǎn)說,HTTPS就是在在HTTP和TCP之間,多了一層TLS/SSL層,在TCP三次握手之后,TLS再和服務(wù)器交換加密信息,得到加密密鑰
(PS:握草,在瀏覽器F12 network只看到一條HTTPS請(qǐng)求,底層程序已經(jīng)干了這么多事情)。
4. HTTP2.0
這里參考深入理解http2.0協(xié)議,看這篇就夠了! - 知乎 (zhihu.com)整理。
4.1 二進(jìn)制分幀
????????HTTP2.0更牛逼一些,在原來HTTP基礎(chǔ),對(duì)HTTP報(bào)文進(jìn)行分幀,即新增了Binary Framing層(PS:不是四層協(xié)議么?怎么又多了TLS層、多了BinaryFraming層?筆者:別再提層不層的,科學(xué)家們都是為了技術(shù)的傳播和理解吶)。
4.2 多路復(fù)用(Multiplexing)/連接共享
????????在http1.1中,瀏覽器客戶端在同一時(shí)間,針對(duì)同一域名下的請(qǐng)求有一定數(shù)量的限制,超過限制數(shù)目的請(qǐng)求會(huì)被阻塞。這也是為何一些站點(diǎn)會(huì)有多個(gè)靜態(tài)資源 CDN 域名的原因之一。
?????????而http2.0中的多路復(fù)用優(yōu)化了這一性能。多路復(fù)用允許同時(shí)通過單一的http/2 連接發(fā)起多重的請(qǐng)求-響應(yīng)消息。有了新的分幀機(jī)制后,http/2 不再依賴多個(gè)TCP連接去實(shí)現(xiàn)多流并行了。每個(gè)數(shù)據(jù)流都拆分成很多互不依賴的幀,而這些幀可以交錯(cuò)(亂序發(fā)送),還可以分優(yōu)先級(jí),最后再在另一端把它們重新組合起來。
4.3?頭部壓縮
????????http1.x的頭帶有大量信息,而且每次都要重復(fù)發(fā)送。http/2使用encoder來減少需要傳輸?shù)膆eader大小,通訊雙方各自緩存一份頭部字段表,既避免了重復(fù)header的傳輸,又減小了需要傳輸?shù)拇笮 ?/p>
????????對(duì)于相同的數(shù)據(jù),不再通過每次請(qǐng)求和響應(yīng)發(fā)送,通信期間幾乎不會(huì)改變通用鍵-值對(duì)(用戶代理、可接受的媒體類型,等等)只需發(fā)送一次。
4.4 請(qǐng)求優(yōu)先級(jí)
????????把http消息分為很多獨(dú)立幀之后,就可以通過優(yōu)化這些幀的交錯(cuò)和傳輸順序進(jìn)一步優(yōu)化性能。每個(gè)流都可以帶有一個(gè)31比特的優(yōu)先值:0 表示最高優(yōu)先級(jí);2的31次方-1 表示最低優(yōu)先級(jí)。
????????服務(wù)器可以根據(jù)流的優(yōu)先級(jí),控制資源分配(CPU、內(nèi)存、帶寬),而在響應(yīng)數(shù)據(jù)準(zhǔn)備好之后,優(yōu)先將最高優(yōu)先級(jí)的幀發(fā)送給客戶端。高優(yōu)先級(jí)的流都應(yīng)該優(yōu)先發(fā)送,但又不會(huì)絕對(duì)的。絕對(duì)地準(zhǔn)守,可能又會(huì)引入首隊(duì)阻塞的問題:高優(yōu)先級(jí)的請(qǐng)求慢導(dǎo)致阻塞其他資源交付。
4.5 服務(wù)器推送
????????服務(wù)器可以對(duì)一個(gè)客戶端請(qǐng)求發(fā)送多個(gè)響應(yīng),服務(wù)器向客戶端推送資源無需客戶端明確地請(qǐng)求。并且,服務(wù)端推送能把客戶端所需要的資源伴隨著index.html一起發(fā)送到客戶端,省去了客戶端重復(fù)請(qǐng)求的步驟。
5. 總結(jié)
? ? ? ? 知識(shí)點(diǎn)真的很多很多,如果不是長時(shí)間從事或使用相關(guān)技術(shù)的人員,真心記不住,有個(gè)大概印象就好。
注:本篇僅為學(xué)習(xí)筆記,如有不合理之處,還請(qǐng)幫忙指出,大家一起交流學(xué)習(xí)~