日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

1、一個(gè)http請(qǐng)求的流程

在分布式架構(gòu)中,有一個(gè)很重要的環(huán)節(jié),就是分布式網(wǎng)絡(luò)中的計(jì)算機(jī)節(jié)點(diǎn)彼此之間需要通信。這個(gè)通信的過(guò)程一定會(huì)涉及到通信協(xié)議相關(guān)的知識(shí)點(diǎn),

我們每天都在用瀏覽器訪問(wèn)各種網(wǎng)站,作為用戶(hù)來(lái)說(shuō),只需要需要輸入一個(gè)網(wǎng)址并且正確跳轉(zhuǎn)就行。但是作為程序員,看到的可能就是這個(gè)響應(yīng)背后的整體流程。所以我們通過(guò)一個(gè) http請(qǐng)求的整個(gè)流程來(lái)進(jìn)行說(shuō)明遠(yuǎn)程通信的原理

域名解析服務(wù)DNS

首先,用戶(hù)訪問(wèn)一個(gè)域名,會(huì)經(jīng)過(guò) DNS 解析DNS(DomAIn Name System),它和 HTTP 協(xié)議一樣是位于應(yīng)用層的協(xié)議,主要提供域名到IP 的解析服務(wù)。我們其實(shí)不用域名也可以訪問(wèn)目標(biāo)主機(jī)的服務(wù),但是 IP 本身不是那么容易記,所以使用域名進(jìn)行替換使得用戶(hù)更容易記住。

 

靜態(tài)內(nèi)容分發(fā)CDN

在很多大型網(wǎng)站,會(huì)引入 CDN 來(lái)加速靜態(tài)內(nèi)容的訪問(wèn),這里簡(jiǎn)單給大家解釋一下什么是 CDN(Content Delivery.NETwork),表示的是內(nèi)容分發(fā)網(wǎng)絡(luò)。CDN 其實(shí)就是一種網(wǎng)絡(luò)緩存技術(shù),能夠把一些相對(duì)穩(wěn)定的資源放到距離最終用戶(hù)較近的地方,一方面可以節(jié)省整個(gè)廣域網(wǎng)的帶寬消耗,另外一方面可以提升用戶(hù)的訪問(wèn)速度,改進(jìn)用戶(hù)體驗(yàn)。我們一般會(huì)把靜態(tài)的文件(圖片、腳本、靜態(tài)頁(yè)面)放到 CDN 中。

http協(xié)議通信原理

域名被成功解析以后,客戶(hù)端和服務(wù)端之間,是怎么建立連接并且如何通信的呢?

說(shuō)到通信,大家一定聽(tīng)過(guò) tcp 和 udp 這兩種通信協(xié)議,以及建立連接的握手過(guò)程。而 http 協(xié)議的通信是基于 tcp/ip 協(xié)議之上的一個(gè)應(yīng)用層協(xié)議,應(yīng)用層協(xié)議除了 http 還有哪些呢(FTP、DNS、SMTP、Telnet 等)。

涉及到網(wǎng)絡(luò)協(xié)議,我們一定需要知道 OSI 七層網(wǎng)絡(luò)模型和 TCP/IP 四層概念模型,OSI 七層網(wǎng)絡(luò)模型包含(應(yīng)用層、表示層、會(huì)話(huà)層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層)、TCP/IP 五層概念模型包含(應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層)。

 

請(qǐng)求發(fā)起過(guò)程

當(dāng)應(yīng)用程序用 T C P 傳送數(shù)據(jù)時(shí),數(shù)據(jù)被送入?yún)f(xié)議棧中,然后逐個(gè)通過(guò)每一層直到被當(dāng)作一串bit流送入網(wǎng)絡(luò)。其中每一層對(duì)收到的數(shù)據(jù)都要增加一些首部信息(有時(shí)還要增加尾部信息)

 

客戶(hù)端如何找到目標(biāo)服務(wù)

在客戶(hù)端發(fā)起請(qǐng)求的時(shí)候,我們會(huì)在數(shù)據(jù)鏈路層去組裝目標(biāo)機(jī)器的 mac 地址,目標(biāo)機(jī)器的mac 地址怎么得到呢?

這里就涉及到一個(gè) ARP 協(xié)議,這個(gè)協(xié)議簡(jiǎn)單來(lái)說(shuō)就是已知目標(biāo)機(jī)器的 ip,需要獲得目標(biāo)機(jī)器的 mac 地址。(發(fā)送一個(gè)廣播消息,這個(gè) ip 是誰(shuí)的,請(qǐng)來(lái)認(rèn)領(lǐng)。認(rèn)領(lǐng) ip 的機(jī)器會(huì)發(fā)送一個(gè) mac 地址的響應(yīng),為了避免每次都用 ARP 請(qǐng)求,機(jī)器本地也會(huì)進(jìn)行 ARP 緩存。當(dāng)然機(jī)器會(huì)不斷地上線下線,IP 也可能會(huì)變,所以 ARP 的 MAC 地址緩存過(guò)一段時(shí)間就會(huì)過(guò)期。)

有了這個(gè)目標(biāo) MAC 地址,數(shù)據(jù)包在鏈路上廣播,MAC 的網(wǎng)卡才能發(fā)現(xiàn),這個(gè)包是給它的。MAC 的網(wǎng)卡把包收進(jìn)來(lái),然后打開(kāi) IP 包,發(fā)現(xiàn) IP 地址也是自己的,再打開(kāi) TCP 包,發(fā)現(xiàn)端口是自己,也就是 80 端口,而這個(gè)時(shí)候這臺(tái)機(jī)器上有一個(gè) Nginx 是監(jiān)聽(tīng) 80 端口。于是將請(qǐng)求提交給 nginx,nginx 返回一個(gè)網(wǎng)頁(yè)。然后將網(wǎng)頁(yè)需要發(fā)回請(qǐng)求的機(jī)器。然后層層封裝,最后到 MAC 層。因?yàn)閬?lái)的時(shí)候有源 MAC 地址,返回的時(shí)候,源 MAC 就變成了目標(biāo) MAC,再返給請(qǐng)求的機(jī)器。

接收端收到數(shù)據(jù)包以后的處理過(guò)程

當(dāng)目的主機(jī)收到一個(gè)以太網(wǎng)數(shù)據(jù)幀時(shí),數(shù)據(jù)就開(kāi)始從協(xié)議棧中由底向上升,同時(shí)去掉各層協(xié)議加上的報(bào)文首部。每層協(xié)議都要去檢查報(bào)文首部中的協(xié)議標(biāo)識(shí),以確定接收數(shù)據(jù)的上層協(xié)議。

 

為什么有了 MAC 層還要走 IP 層呢?

之前我們提到,mac 地址是唯一的,那理論上,在任何兩個(gè)設(shè)備之間,我應(yīng)該都可以通過(guò)mac 地址發(fā)送數(shù)據(jù),為什么還需要 ip 地址?

mac 地址就好像個(gè)人的身份證號(hào),人的身份證號(hào)和人戶(hù)口所在的城市,出生的日期有關(guān),但是和人所在的位置沒(méi)有關(guān)系,人是會(huì)移動(dòng)的,知道一個(gè)人的身份證號(hào),并不能找到它這個(gè)人,mac 地址類(lèi)似,它是和設(shè)備的生產(chǎn)者,批次,日期之類(lèi)的關(guān)聯(lián)起來(lái),知道一個(gè)設(shè)備的mac,并不能在網(wǎng)絡(luò)中將數(shù)據(jù)發(fā)送給它,除非它和發(fā)送方的在同一個(gè)網(wǎng)絡(luò)內(nèi)。

所以要實(shí)現(xiàn)機(jī)器之間的通信,我們還需要有 ip 地址的概念,ip 地址表達(dá)的是當(dāng)前機(jī)器在網(wǎng)絡(luò)中的位置,類(lèi)似于城市名+道路號(hào)+門(mén)牌號(hào)的概念。通過(guò) ip 層的尋址,我們能知道按何種路徑在全世界任意兩臺(tái) Internet 上的的機(jī)器間傳輸數(shù)據(jù)

 

TCP/IP 的分層管理

TCP/IP 協(xié)議按照層次分為 5 層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層,復(fù)雜的程序都需要分層,這個(gè)是軟件設(shè)計(jì)的要求,每一層專(zhuān)注于當(dāng)前領(lǐng)域的事情。如果某些地方需要修改,我們只需要把變動(dòng)的層替換掉就行,一方面改動(dòng)影響較少,另一方面整個(gè)架構(gòu)的靈活性也更高。最后,在分層之后,整個(gè)架構(gòu)的設(shè)計(jì)也變得相對(duì)簡(jiǎn)單了。

 

分層負(fù)載

了解了分層的概念以后,我們?cè)偃ダ斫馑^的二層負(fù)載、三層負(fù)載、四層負(fù)載、七層負(fù)載就容易多了。

一次 http 請(qǐng)求過(guò)來(lái),一定會(huì)從應(yīng)用層到傳輸層,完成整個(gè)交互。只要是在網(wǎng)絡(luò)上跑的數(shù)據(jù)包,都是完整的。可以有下層沒(méi)上層,絕對(duì)不可能有上層沒(méi)下層。

二層負(fù)載

二層負(fù)載是針對(duì) MAC,負(fù)載均衡服務(wù)器對(duì)外依然提供一個(gè) VIP(虛 IP),集群中不同的機(jī)器采用相同 IP 地址,但是機(jī)器的 MAC 地址不一樣。當(dāng)負(fù)載均衡服務(wù)器接受到請(qǐng)求之后,通過(guò)改寫(xiě)報(bào)文的目標(biāo) MAC 地址的方式將請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)機(jī)器實(shí)現(xiàn)負(fù)載均衡

二層負(fù)載均衡會(huì)通過(guò)一個(gè)虛擬 MAC 地址接收請(qǐng)求,然后再分配到真實(shí)的 MAC 地址

三層負(fù)載均衡

三層負(fù)載是針對(duì) IP,和二層負(fù)載均衡類(lèi)似,負(fù)載均衡服務(wù)器對(duì)外依然提供一個(gè) VIP(虛 IP),但是集群中不同的機(jī)器采用不同的 IP 地址。當(dāng)負(fù)載均衡服務(wù)器接受到請(qǐng)求之后,根據(jù)不同的負(fù)載均衡算法,通過(guò) IP 將請(qǐng)求轉(zhuǎn)發(fā)至不同的真實(shí)服務(wù)器

三層負(fù)載均衡會(huì)通過(guò)一個(gè)虛擬 IP 地址接收請(qǐng)求,然后再分配到真實(shí)的 IP 地址

四層負(fù)載均衡

四層負(fù)載均衡工作在 OSI 模型的傳輸層,由于在傳輸層,只有 TCP/UDP 協(xié)議,這兩種協(xié)議中除了包含源 IP、目標(biāo) IP 以外,還包含源端口號(hào)及目的端口號(hào)。四層負(fù)載均衡服務(wù)器在接受到客戶(hù)端請(qǐng)求后,以后通過(guò)修改數(shù)據(jù)包的地址信息(IP+端口號(hào))將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器。

四層通過(guò)虛擬 IP + 端口接收請(qǐng)求,然后再分配到真實(shí)的服務(wù)器

 

七層負(fù)載均衡

七層負(fù)載均衡工作在 OSI 模型的應(yīng)用層,應(yīng)用層協(xié)議較多,常用 http、radius、dns 等。七層負(fù)載就可以基于這些協(xié)議來(lái)負(fù)載。這些應(yīng)用層協(xié)議中會(huì)包含很多有意義的內(nèi)容。比如同一個(gè)Web 服務(wù)器的負(fù)載均衡,除了根據(jù) IP 加端口進(jìn)行負(fù)載外,還可根據(jù)七層的 URL、瀏覽器類(lèi)別來(lái)決定是否要進(jìn)行負(fù)載均衡

七層通過(guò)虛擬的 URL 或主機(jī)名接收請(qǐng)求,然后再分配到真實(shí)的服務(wù)器。

2、tcp/ip協(xié)議深入分析

通過(guò)上面基本清楚了網(wǎng)絡(luò)的通信流程,在 http 協(xié)議中,底層用到了 tcp 的通信協(xié)議,接下來(lái)看看 tcp 的通信協(xié)議原理

 

tcp握手協(xié)議

所以 TCP 消息的可靠性首先來(lái)自于有效的連接建立,所以在數(shù)據(jù)進(jìn)行傳輸前,需要通過(guò)三次握手建立一個(gè)連接,所謂的三次握手,就是在建立 TCP 鏈接時(shí),需要客戶(hù)端和服務(wù)端總共發(fā)送 3 個(gè)包來(lái)確認(rèn)連接的建立,在 socket 編程中,這個(gè)過(guò)程由客戶(hù)端執(zhí)行 connect 來(lái)觸發(fā)

  1. 第 一 次 握 手(SYN=1, seq=x)客 戶(hù) 端 發(fā) 送 一 個(gè)TCP 的 SYN 標(biāo)志位置 1 的包,指明客戶(hù)端打算連接的服務(wù)器的端口,以及初始序號(hào) X,保存在 包 頭 的 序 列 號(hào)(SequenceNumber)字段里。發(fā)送完畢后,客戶(hù)端 進(jìn) 入SYN_SEND 狀態(tài)。
  2. 第 二 次 握 手(SYN=1, ACK=1,seq=y,ACKnum=x+1):服務(wù)器發(fā)回確認(rèn)包(ACK) 應(yīng) 答 。即SYN 標(biāo)志位和ACK 標(biāo) 志 位 均 為1。服務(wù)器端選擇自己 ISN 序列號(hào),放到 Seq 域里,同時(shí)將 確 認(rèn) 序 號(hào)(Acknowledgement Number)設(shè)置為客戶(hù)的 ISN 加 1,即 X+1。發(fā)送完畢后,服務(wù)器 端 進(jìn) 入SYN_RCVD 狀態(tài)。
  3. 第 三 次 握 手(ACK=1 ,ACKnum=y+1)客戶(hù)端再次發(fā)送確認(rèn)包(ACK),SYN 標(biāo)志位為 0,ACK 標(biāo)志位為 1,并且把服務(wù)器發(fā)來(lái) ACK 的序號(hào)字段+1,放在確定字段中發(fā)送給對(duì)方,并且在數(shù)據(jù)段放寫(xiě) ISN 發(fā)完畢后 , 客 戶(hù) 端 進(jìn) 入ESTABLISHED 狀態(tài),當(dāng)服務(wù)器端接收到這個(gè)包時(shí),也進(jìn) 入ESTABLISHED 狀態(tài),TCP 握手結(jié)束。

SYN 攻擊

在三次握手過(guò)程中,Server 發(fā)送 SYN-ACK 之后,收到 Client 的 ACK 之前的 TCP 連接稱(chēng)為半連接(half-open connect),此時(shí) Server 處于 SYN_RCVD 狀態(tài),當(dāng)收到 ACK 后,Server轉(zhuǎn)入 ESTABLISHED 狀態(tài)。SYN 攻擊就是 Client 在短時(shí)間內(nèi)偽造大量不存在的 IP 地址,并向Server 不斷地發(fā)送 SYN 包,Server 回復(fù)確認(rèn)包,并等待 Client 的確認(rèn),由于源地址是不存在的,因此,Server 需要不斷重發(fā)直至超時(shí),這些偽造的 SYN 包將產(chǎn)時(shí)間占用未連接隊(duì)列,導(dǎo)致正常的 SYN 請(qǐng)求因?yàn)殛?duì)列滿(mǎn)而被丟棄,從而引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓。SYN 攻擊時(shí)一種典型的 DDoS 攻擊,檢測(cè) SYN 攻擊的方式非常簡(jiǎn)單,即當(dāng) Server 上有大量半連接狀態(tài)且源 IP 地址是隨機(jī)的,則可以斷定遭到 SYN 攻擊了

 

TCP 四次揮手協(xié)議

四次揮手表示 TCP 斷開(kāi)連接的時(shí)候,需要客戶(hù)端和服務(wù)端總共發(fā)送 4 個(gè)包以確認(rèn)連接的斷開(kāi);客戶(hù)端或服務(wù)器均可主動(dòng)發(fā)起揮手動(dòng)作(因?yàn)?TCP 是一個(gè)全雙工協(xié)議),在 socket 編程中,任何一方執(zhí)行 close() 操作即可產(chǎn)生揮手操作

 

  1. 第一次揮手(FIN=1,seq=x):假設(shè)客戶(hù)端想要關(guān)閉連接,客戶(hù)端發(fā)送一個(gè) FIN 標(biāo)志位置為 1 的包,表示自己已經(jīng)沒(méi)有數(shù)據(jù)可以發(fā)送了,但是仍然可以接受數(shù)據(jù)。發(fā)送完畢后,客戶(hù)端進(jìn)入 FIN_WAIT_1 狀態(tài)。
  2. 第二次揮手(ACK=1,ACKnum=x+1):服務(wù)器端確認(rèn)客戶(hù)端的 FIN 包,發(fā)送一個(gè)確認(rèn)包,表明自己接受到了客戶(hù)端關(guān)閉連接的請(qǐng)求,但還沒(méi)有準(zhǔn)備好關(guān)閉連接。發(fā)送完畢后,服務(wù)器端進(jìn)入 CLOSE_WAIT 狀態(tài),客戶(hù)端接收到這個(gè)確認(rèn)包之后,進(jìn)入 FIN_WAIT_2 狀態(tài),等待服務(wù)器端關(guān)閉連接。
  3. 第三次揮手(FIN=1,seq=w):服務(wù)器端準(zhǔn)備好關(guān)閉連接時(shí),向客戶(hù)端發(fā)送結(jié)束連接請(qǐng)求,F(xiàn)IN 置為 1。發(fā)送完畢后,服務(wù)器端進(jìn)入 LAST_ACK 狀態(tài),等待來(lái)自客戶(hù)端的最后一個(gè) ACK。
  4. 第四次揮手(ACK=1,ACKnum=w+1):客戶(hù)端接收到來(lái)自服務(wù)器端的關(guān)閉請(qǐng)求,發(fā)送一個(gè)確認(rèn)包,并進(jìn)入 TIME_WAIT 狀態(tài),等待可能出現(xiàn)的要求重傳的 ACK 包。服務(wù)器端接收到這個(gè)確認(rèn)包之后,關(guān)閉連接,進(jìn)入 CLOSED 狀態(tài)。

客戶(hù)端等待了某個(gè)固定時(shí)間(兩個(gè)最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,沒(méi)有收到服務(wù)器端的 ACK,認(rèn)為服務(wù)器端已經(jīng)正常關(guān)閉連接,于是自己也關(guān)閉連接,進(jìn)入 CLOSED 狀態(tài)

問(wèn)題

【問(wèn)題 1】為什么連接的時(shí)候是三次握手,關(guān)閉的時(shí)候卻是四次握手?

答:三次握手是因?yàn)橐驗(yàn)楫?dāng) Server 端收到 Client 端的 SYN 連接請(qǐng)求報(bào)文后,可以直接發(fā)送SYN+ACK 報(bào)文。其中 ACK 報(bào)文是用來(lái)應(yīng)答的,SYN 報(bào)文是用來(lái)同步的。但是關(guān)閉連接時(shí),當(dāng) Server 端收到 FIN 報(bào)文時(shí),很可能并不會(huì)立即關(guān)閉 SOCKET(因?yàn)榭赡苓€有消息沒(méi)處理完),所以只能先回復(fù)一個(gè) ACK 報(bào)文,告訴 Client 端,"你發(fā)的 FIN 報(bào)文我收到了"。只有等到我 Server 端所有的報(bào)文都發(fā)送完了,我才能發(fā)送 FIN 報(bào)文,因此不能一起發(fā)送。故需要四步握手。

【問(wèn)題 2】為什么 TIME_WAIT 狀態(tài)需要經(jīng)過(guò) 2MSL(最大報(bào)文段生存時(shí)間)才能返回到 CLOSE狀態(tài)?

答:雖然按道理,四個(gè)報(bào)文都發(fā)送完畢,我們可以直接進(jìn)入 CLOSE 狀態(tài)了,但是我們必須假象網(wǎng)絡(luò)是不可靠的,有可以最后一個(gè) ACK 丟失。所以 TIME_WAIT 狀態(tài)就是用來(lái)重發(fā)可能丟失的 ACK 報(bào)文。

分享到:
標(biāo)簽:分布式 架構(gòu)
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定