摘要:本系列按照負(fù)載均衡器對數(shù)據(jù)包的處理方式分類,從計算機(jī)間通信的角度出發(fā),淺談模型的實現(xiàn)原理。將請求分?jǐn)偨o多臺服務(wù)器的行為,就稱之為負(fù)載均衡。真實服務(wù)器返回的數(shù)據(jù)包的下一個目的地必須是負(fù)載均衡器。
LVS(Linux Virtual Server)是一個虛擬服務(wù)器集群系統(tǒng)。工作在 OSI 模型的傳輸層,即四層負(fù)載均衡。LVS 本身實現(xiàn)了 NAT、DR、TUN 模型,這些模型僅做數(shù)據(jù)包的轉(zhuǎn)發(fā),而不會與客戶端建立連接,成本低效率高。FULLNAT 基于 NAT 實現(xiàn),LVS 本身不支持,需要額外對內(nèi)核打補(bǔ)丁后才能使用。
本系列按照負(fù)載均衡器對數(shù)據(jù)包的處理方式分類,從計算機(jī)間通信的角度出發(fā),淺談 NAT、FULLNAT、DR、TUN 模型的實現(xiàn)原理。
兩臺計算機(jī)如何在互聯(lián)網(wǎng)中通信
在了解 LVS 負(fù)載均衡之前,先要搞清楚兩臺計算機(jī)如何在互聯(lián)網(wǎng)中通信。茫茫互聯(lián)網(wǎng)中,兩臺計算機(jī)如何才能找到對方?
我們先來看看,快遞是如何被快遞小哥完美地送到你手上的。根據(jù)你填寫的地址,快遞先送到你所在的省市區(qū),接著在當(dāng)前省市區(qū)找到你的門牌號,最后根據(jù)門牌號和姓名,再親手把快遞交給你。
兩臺計算機(jī)在互聯(lián)網(wǎng)中的通信也是如此。首先需要知道雙方的 IP 地址,即省市區(qū),其次需要知道雙方的 MAC 地址,即門牌號。MAC 地址標(biāo)志著唯一的計算機(jī)。在同一臺計算機(jī)上,可能有多個不同的服務(wù),如何能像快遞小哥按照姓名找到你一樣,在計算機(jī)上找到對應(yīng)的服務(wù)呢?沒錯,就是按照端口號。
這樣,通信中每臺計算機(jī)需要提供的信息就很清晰了,即 IP 地址、MAC 地址、端口號。總結(jié)一下,計算機(jī)之間通信必需的六個要素就是,源 IP 地址、端口號、源 MAC 地址,目標(biāo) IP 地址、端口號、目標(biāo) MAC 地址。
假設(shè)計算機(jī) A 和計算機(jī) B 在上述的網(wǎng)絡(luò)拓?fù)鋱D(不在同一局域網(wǎng))中。可以很清晰地看到 計算機(jī) A 和 計算機(jī) B 通信需要五個步驟,其中 ①② 和 ④⑤ 的原理相同。現(xiàn)在我們來看看具體的每個步驟在計算機(jī)的世界中是如何實現(xiàn)的。
首先 A 和 B 的 IP 地址和端口號是已知的,即一個數(shù)據(jù)包從哪來要發(fā)往哪去。所以現(xiàn)在的問題是:A 如何能知道 B 的 MAC 地址?
最簡單的方式就是 A 保存網(wǎng)絡(luò)中全部設(shè)備的 MAC 地址,在發(fā)送時查詢一下,這樣就能得到 B 的 MAC 地址。但是網(wǎng)絡(luò)中的設(shè)備有幾十億個,還在不斷地增長,顯然這種方式是不可取的。如果按照快遞發(fā)送過程中,在每個驛站之間進(jìn)行轉(zhuǎn)移,這樣只需要知道該發(fā)往的下一目的地在哪里,最終也能將快遞成功地交到你的手上。在實際網(wǎng)絡(luò)中發(fā)送數(shù)據(jù)包也是這樣,現(xiàn)在的目標(biāo)就是確定 “下一個目的地” 的 MAC 地址。
步驟 ①②:發(fā)送數(shù)據(jù)包至網(wǎng)關(guān)
A 不知道 B 的 MAC 地址,且 A 和 B 也不在同一個局域網(wǎng)中。這時 A 會根據(jù) ARP 協(xié)議先發(fā)出一個廣播包,即目標(biāo) MAC 地址是 FF:FF:FF:FF:FF:FF 的數(shù)據(jù)包。當(dāng) 交換機(jī)1 收到這個廣播包之后,會將這個數(shù)據(jù)包轉(zhuǎn)發(fā)給其他端口,并且記錄 A 的 MAC 地址和交換機(jī)端口之間的映射關(guān)系,后續(xù)再看到這個 MAC 地址,就知道該從哪個端口轉(zhuǎn)發(fā)出去。當(dāng) 路由器1 收到廣播包后,會將自己的 MAC 地址返回。A 接收到返回后,就知道 “下一個目的地” 的 MAC 地址了。A 重新發(fā)送數(shù)據(jù)包,將目標(biāo) MAC 地址填寫為 路由器1 的 MAC 地址,并在本地的緩存表中記錄返回的 MAC 地址。
查看當(dāng)前設(shè)備緩存表里已存的 MAC 地址:arp -a
ARP 協(xié)議的目的就是找到“下一個目的地”的 MAC 地址,即 IP 地址和 MAC 地址之間的映射關(guān)系。當(dāng)兩臺設(shè)備同處于一個局域網(wǎng)時,“下一個目的地” 就是目標(biāo)設(shè)備的 MAC 地址,當(dāng)兩臺設(shè)備不處于同一個局域網(wǎng)時,“下一個目的地” 就是網(wǎng)關(guān)的 MAC 地址。
步驟 ③:網(wǎng)關(guān)間跳轉(zhuǎn)
經(jīng)過步驟 ①②,此時 路由器1 收到的數(shù)據(jù)包為 { A_IP、PORT、A_MAC } ? { B_IP、PORT、路由器1_MAC } 。收到數(shù)據(jù)包后,路由器1 查看自己的路由表,如下圖所示。
查看當(dāng)前設(shè)備設(shè)置的路由表:route -n
路由器1 會將 B_IP 與 路由表中每條記錄的子網(wǎng)掩碼(Genmask)做按位與運(yùn)算。如果得到的結(jié)果和目的網(wǎng)絡(luò)(Destination)相同,那么 “下一個目的地“ 的 MAC 地址,就是配置的網(wǎng)關(guān)(Gateway)的 MAC 地址,這種找到相鄰網(wǎng)絡(luò)的方式叫做 “下一跳機(jī)制”。如果網(wǎng)關(guān)的地址為 0.0.0.0,說明可以在局域網(wǎng)中直接通信,不需要 “下一跳”。至此,再次找到了 “下一個目的地” 的 MAC 地址,即 路由器2 的 MAC 地址。此時 路由器2 收到的數(shù)據(jù)包為 { A_IP、PORT、路由器1_MAC } ? { B_IP、PORT、路由器2_MAC } 。步驟 ④⑤ 和 ①② 的原理相同,在這里就不贅述了。
下一跳的目的就是找到“下一個目的地”,即下一步該到達(dá)哪里,側(cè)重 “路線” 的選擇,并由此獲取到對應(yīng)的 MAC 地址,繼續(xù)傳送數(shù)據(jù)包。
?總結(jié)一下:
1.使用 ARP 協(xié)議找到網(wǎng)關(guān)出口或同一局域網(wǎng)內(nèi)設(shè)備的 MAC 地址
2.按照路由表的每條規(guī)則和 目標(biāo) IP 地址做按位與運(yùn)算,找到相鄰網(wǎng)關(guān)入口的 MAC 地址
3.“下一個目的地” 和當(dāng)前地址都僅僅相鄰一步,且每次 “跳躍” 后的源 MAC 地址 和 目標(biāo) MAC 地址都會發(fā)生對應(yīng)的替換
4.數(shù)據(jù)包中,IP 地址指明起點(diǎn)終點(diǎn),MAC 地址指明跳躍的節(jié)點(diǎn),端口號指明對應(yīng)的應(yīng)用服務(wù)
當(dāng)然,光是找到對方還不夠,還需要一個約定的交流方式,平時我們所熟知的各種協(xié)議,都是計算機(jī)「約定的交流方式」。
LVS 負(fù)載均衡
隨著使用互聯(lián)網(wǎng)的設(shè)備不斷增長,服務(wù)端對應(yīng)接收到的 HTTP 請求更是呈指數(shù)型的增長。當(dāng)一臺服務(wù)器無法承載非常大的請求量時,使用多臺服務(wù)器來分?jǐn)傉埱蟆⒄埱蠓謹(jǐn)偨o多臺服務(wù)器的行為,就稱之為負(fù)載均衡。
ULB(UCloud Load Balancer)是UCloud提供的負(fù)載均衡服務(wù),能夠為多個主機(jī)或其它服務(wù)實例提供基于網(wǎng)絡(luò)報文或代理方式的流量分發(fā)功能。在高并發(fā)服務(wù)環(huán)境下,通過ULB構(gòu)建由多個服務(wù)節(jié)點(diǎn)組成的服務(wù)集群。服務(wù)集群能夠擴(kuò)展服務(wù)的處理及容錯能力,并自動消除由于單一服務(wù)節(jié)點(diǎn)故障對服務(wù)整體的影響,提高服務(wù)的可用性。ULB針對七層協(xié)議支持HTTP、HTTPS協(xié)議(類Nginx或HAPproxy);四層協(xié)議支持TCP協(xié)議及UDP協(xié)議(類LVS)。
從網(wǎng)絡(luò)中計算機(jī)通信的角度,而非使用更上層的應(yīng)用(如 Nginx)出發(fā),搭建四層負(fù)載均衡器后,數(shù)據(jù)包的發(fā)送鏈路為:CIP ? VIP ? DIP ? RIP,即 客戶端 IP ? 虛擬 IP ? 分發(fā) IP ? 真實服務(wù)器 IP。對于客戶端來說,只需要知道請求到達(dá)的地址是 VIP,不需要考慮負(fù)載,即 CIP ? VIP 是固定的。
所以負(fù)載均衡器要做的事情,就是將 CIP 發(fā)送到 VIP 的數(shù)據(jù)包,經(jīng)由 DIP 轉(zhuǎn)發(fā)給 RIP,服務(wù)響應(yīng)后再將響應(yīng)的數(shù)據(jù)包返回給 CIP。
NAT 模式
紅色表示發(fā)出的數(shù)據(jù)包,綠色表示返回的數(shù)據(jù)包,黃色表示負(fù)載均衡器修改的內(nèi)容 ,虛線表示經(jīng)過 N 個下一跳,即可以不在同一局域網(wǎng)內(nèi),實線表示只能 “跳躍一次”,即必須在同一局域網(wǎng)內(nèi)。
1.當(dāng)計算機(jī)發(fā)出一個請求的數(shù)據(jù)包到達(dá)負(fù)載均衡器后,負(fù)載均衡器將發(fā)送數(shù)據(jù)包的 { 目標(biāo) IP 地址、端口號、目標(biāo) MAC 地址 } 轉(zhuǎn)換為 { 某臺真實服務(wù)器的 IP 地址、真實服務(wù)的端口號、真實服務(wù)器的 MAC 地址 } ,其余信息不變。這種只轉(zhuǎn)換數(shù)據(jù)包的目標(biāo)設(shè)備信息,而不修改數(shù)據(jù)包的源設(shè)備信息,稱之為 DNAT,即目標(biāo)網(wǎng)絡(luò)地址轉(zhuǎn)換。
2.真實服務(wù)器收到請求的數(shù)據(jù)包,返回響應(yīng)的數(shù)據(jù)包:{ 某臺真實服務(wù)器的 IP 地址、真實服務(wù)的端口號、真實服務(wù)器的 MAC 地址 } ?? { 原始請求的 IP 地址、端口號、跳躍的 MAC 地址 } 。所以此時在服務(wù)器上查看 TCP 連接為:CIP ?? RIP。
3.真實服務(wù)器返回的數(shù)據(jù)包的 “下一個目的地” 必須是負(fù)載均衡器。如果返回數(shù)據(jù)包直接返回給客戶端,客戶端發(fā)現(xiàn)返回數(shù)據(jù)包的源設(shè)備信息和發(fā)出數(shù)據(jù)包的目標(biāo)設(shè)備信息不一致,將會丟棄返回數(shù)據(jù)包。所以真實服務(wù)器的默認(rèn)網(wǎng)關(guān)必須是 DIP,保證返回數(shù)據(jù)包的 “下一個目的地” 是負(fù)載均衡器。
4.當(dāng)返回的數(shù)據(jù)包到達(dá)負(fù)載均衡器后,負(fù)載均衡器將返回數(shù)據(jù)包的 { 原始請求的 IP 地址、端口號、跳躍的 MAC 地址 } 轉(zhuǎn)換為原始請求的 { 目標(biāo) IP 地址、端口號、目標(biāo) MAC 地址 } 。這種只轉(zhuǎn)換數(shù)據(jù)包的源設(shè)備信息,而不修改數(shù)據(jù)包的目標(biāo)設(shè)備信息,稱之為 SNAT,即源網(wǎng)絡(luò)地址轉(zhuǎn)換。
5.負(fù)載均衡器返回數(shù)據(jù)包給客戶端。
?總結(jié)一下 NAT 模式的特點(diǎn):
1.修改數(shù)據(jù)包的「源 IP 地址」或 「目標(biāo) IP 地址」,可以對端口進(jìn)行轉(zhuǎn)發(fā)
2.真實服務(wù)器的默認(rèn)網(wǎng)關(guān)必須是負(fù)載均衡器,所以真實服務(wù)器和負(fù)載均衡器必須在同一個局域網(wǎng)內(nèi)
3.所有的請求數(shù)據(jù)包、響應(yīng)數(shù)據(jù)包都要經(jīng)過負(fù)載均衡器
FULLNAT 模式
NAT 模式中,負(fù)載均衡器和真實服務(wù)器必須在同一局域網(wǎng)內(nèi),但在實際的開發(fā)過程中,真實服務(wù)器可能分布在不同的網(wǎng)段,甚至不同的城市。如何能將 NAT 模式應(yīng)用在真實服務(wù)器分布在不同網(wǎng)段的場景下?
紅色表示發(fā)出的數(shù)據(jù)包,綠色表示返回的數(shù)據(jù)包,黃色表示負(fù)載均衡器修改的內(nèi)容 ,虛線表示經(jīng)過 N 個下一跳,即可以不在同一局域網(wǎng)內(nèi),實線表示只能 “跳躍一次”,即必須在同一局域網(wǎng)。
1.當(dāng)計算機(jī)發(fā)出一個請求的數(shù)據(jù)包到達(dá)負(fù)載均衡器后,負(fù)載均衡器會對請求數(shù)據(jù)包同時做 SNAT 和 DNAT,將請求數(shù)據(jù)包修改為:{ 均衡出口 IP 地址、端口號、負(fù)載均衡器的 MAC 地址 } ?? { 某臺真實服務(wù)器的 IP 地址、真實服務(wù)的端口號、真實服務(wù)器的 MAC 地址 }。
2.這樣負(fù)載均衡器就可以獨(dú)立的和真實服務(wù)器進(jìn)行數(shù)據(jù)包的傳送。
3.真實服務(wù)器收到請求的數(shù)據(jù)包,返回響應(yīng)的數(shù)據(jù)包:{ 某臺真實服務(wù)器的 IP 地址、真實服務(wù)的端口號、真實服務(wù)器的 MAC 地址 } ?? { 負(fù)載均衡器的 IP 地址、端口號、負(fù)載均衡器的 MAC 地址 } 。此時在真實服務(wù)器上查看 TCP 連接為:DIP ?? RIP。
4.當(dāng)返回的數(shù)據(jù)包到達(dá)負(fù)載均衡器后,負(fù)載均衡器將返回數(shù)據(jù)包再次同時做 DNAT 和 SNAT。
5.負(fù)載均衡器返回數(shù)據(jù)包給客戶端。
?總結(jié)一下FULL NAT 模式的特點(diǎn):
1.同時修改數(shù)據(jù)包的「源 IP 地址」和「目標(biāo) IP 地址」,可以對端口進(jìn)行轉(zhuǎn)發(fā)
2.負(fù)載均衡器不需要以網(wǎng)關(guān)的形式存在,即負(fù)載均衡器可以和真實服務(wù)器在不同的網(wǎng)絡(luò)中
3.真實服務(wù)器最終建立的連接是 DIP ?? RIP,無法獲取真實客戶端的 IP 地址
4.所有的請求數(shù)據(jù)包、響應(yīng)數(shù)據(jù)包都要經(jīng)過負(fù)載均衡器
LVS 本身不支持 FULLNAT 模式,需要額外對內(nèi)核打補(bǔ)丁后才能使用。
可以看到在 NAT 和 FULLNAT 模式中,不管是請求數(shù)據(jù)包還是響應(yīng)數(shù)據(jù)包,都要經(jīng)過負(fù)載均衡器。但是響應(yīng)數(shù)據(jù)包一般要比請求數(shù)據(jù)包大很多,這可能會成為系統(tǒng)的瓶頸。如果能夠?qū)⒄埱髷?shù)據(jù)包轉(zhuǎn)發(fā)到真實服務(wù)器之后,響應(yīng)數(shù)據(jù)包由真實服務(wù)器直接返回,這樣對負(fù)載均衡器的壓力就小很多。這種模式又該如何實現(xiàn)?
文章來源:U-Star技術(shù)創(chuàng)作者
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/126459.html
摘要:本系列按照負(fù)載均衡器對數(shù)據(jù)包的處理方式分類,從計算機(jī)間通信的角度出發(fā),淺談模型的實現(xiàn)原理。將請求分?jǐn)偨o多臺服務(wù)器的行為,就稱之為負(fù)載均衡。真實服務(wù)器返回的數(shù)據(jù)包的下一個目的地必須是負(fù)載均衡器。LVS(Linux Virtual Server)是一個虛擬服務(wù)器集群系統(tǒng)。工作在 OSI 模型的傳輸層,即四層負(fù)載均衡。LVS 本身實現(xiàn)了 NAT、DR、TUN 模型,這些模型僅做數(shù)據(jù)包的轉(zhuǎn)發(fā),而不會...
摘要:本系列按照負(fù)載均衡器對數(shù)據(jù)包的處理方式分類,從計算機(jī)間通信的角度出發(fā),淺談模型的實現(xiàn)原理。將請求分?jǐn)偨o多臺服務(wù)器的行為,就稱之為負(fù)載均衡。真實服務(wù)器返回的數(shù)據(jù)包的下一個目的地必須是負(fù)載均衡器。LVS(Linux Virtual Server)是一個虛擬服務(wù)器集群系統(tǒng)。工作在 OSI 模型的傳輸層,即四層負(fù)載均衡。LVS 本身實現(xiàn)了 NAT、DR、TUN 模型,這些模型僅做數(shù)據(jù)包的轉(zhuǎn)發(fā),而不會...
摘要:本系列按照負(fù)載均衡器對數(shù)據(jù)包的處理方式分類,從計算機(jī)間通信的角度出發(fā),淺談模型的實現(xiàn)原理。將請求分?jǐn)偨o多臺服務(wù)器的行為,就稱之為負(fù)載均衡。真實服務(wù)器返回的數(shù)據(jù)包的下一個目的地必須是負(fù)載均衡器。LVS(Linux Virtual Server)是一個虛擬服務(wù)器集群系統(tǒng)。工作在 OSI 模型的傳輸層,即四層負(fù)載均衡。LVS 本身實現(xiàn)了 NAT、DR、TUN 模型,這些模型僅做數(shù)據(jù)包的轉(zhuǎn)發(fā),而不會...
摘要:本系列按照負(fù)載均衡器對數(shù)據(jù)包的處理方式分類,從計算機(jī)間通信的角度出發(fā),淺談模型的實現(xiàn)原理。將請求分?jǐn)偨o多臺服務(wù)器的行為,就稱之為負(fù)載均衡。真實服務(wù)器返回的數(shù)據(jù)包的下一個目的地必須是負(fù)載均衡器。LVS(Linux Virtual Server)是一個虛擬服務(wù)器集群系統(tǒng)。工作在 OSI 模型的傳輸層,即四層負(fù)載均衡。LVS 本身實現(xiàn)了 NAT、DR、TUN 模型,這些模型僅做數(shù)據(jù)包的轉(zhuǎn)發(fā),而不會...
摘要:本系列按照負(fù)載均衡器對數(shù)據(jù)包的處理方式分類,從計算機(jī)間通信的角度出發(fā),淺談模型的實現(xiàn)原理。將請求分?jǐn)偨o多臺服務(wù)器的行為,就稱之為負(fù)載均衡。真實服務(wù)器返回的數(shù)據(jù)包的下一個目的地必須是負(fù)載均衡器。LVS(Linux Virtual Server)是一個虛擬服務(wù)器集群系統(tǒng)。工作在 OSI 模型的傳輸層,即四層負(fù)載均衡。LVS 本身實現(xiàn)了 NAT、DR、TUN 模型,這些模型僅做數(shù)據(jù)包的轉(zhuǎn)發(fā),而不會...
閱讀 3514·2023-04-25 20:09
閱讀 3720·2022-06-28 19:00
閱讀 3035·2022-06-28 19:00
閱讀 3058·2022-06-28 19:00
閱讀 3131·2022-06-28 19:00
閱讀 2859·2022-06-28 19:00
閱讀 3014·2022-06-28 19:00
閱讀 2610·2022-06-28 19:00