本章是‘網絡是怎么連接的--讀后感’第五章
前言
本章是系列博客的第五章;第一章講數據發送的場景;第二章主要講敘消息是如何發送出去的;第三章主要闡述數據包在客戶端局域網中的傳輸;第四章詳細闡述數據在互聯網中是如何傳輸的;本章講接入端局域網中的通信。
實現需求
前面講到了數據傳輸到互聯網中;接下來本章將繼續延續這個思路,對數據傳輸到接收端也就是服務器局域網中的通信進行闡述;主要講如下幾點:
- web服務器的部署
- 防火牆結構和原理
- 負載均衡--平均分配請求到多台服務器實現負載均衡
- 負載和代理服務器--利用緩存服務器來分擔負載
- 通過內容分發服務商租用緩存服務器
正文
一、web服務器的部署
web服務器的部署有三種方式:
- 部署在公司內網,直接通過運營商提供的網絡路由器或BAS路由器連接,從而接入互聯網(數據包的發送和前面一樣;這種方式現在已經被淘汰了)
- 同樣是部署在公司內網在數據流入服務器之前,先經過防火牆程序檢測(在路由器/服務器中均可有防火牆),防火牆屏蔽了不允許外部訪問的程序,禁止不合法的數據包通過,可以降低一些風險.
- 部署在運營商的數據中心,也可以直接租用運營商數據中心的服務器,由於數據中心放置着運營商的NOC或IX,因此服務器通過高速線路可以直接連接NOC等核心節點;可以有效提升在互聯網中的訪問速度(如我以前所在的程序化廣告項目就是購買了十幾萬太服務器組建的數據中心來處理海量數據)
如圖所示:
二、防火牆結構和原理
前面講了在部署服務器時,一般會在服務器前部署一個防火牆來保護服務器,攔截惡意程序;那么防火牆是如何實現保護的呢?
- 防火牆常用包過濾方式來限定;通過對發送端的IP地址端口和接收端的IP端口進行限定;只允許滿足規則的包收發來實現對數據傳輸的控制;
示例如圖,圖中規則表是抽象出來的,實際防火牆規則並不是表的形式:
第一行規則防火牆允對數據發送端/互聯網輸入端的IP不做限制,任意設備發送過來的包都能通過;但會限定傳過來的包的IP頭部接收方地址必須是192.0.2.0/24,端口必須是80端口;如果不是則攔截包,不讓數據通過。
第二行規則是對服務器訪問互聯網做的限制;發送發IP地址和端口是記錄在發送包IP頭部的信息,代表發送端服務器端的地址;如果TCP控制位為SYN=1,則代表這個數據包是TCP建立連接發送的第一個數據包,代表服務器發起對互聯網的連接請求;由於狀態是阻止,因此阻止服務器訪問互聯網。
第三行規則是防火牆允許通過從IP為192.0.2.0/24端口為80的設備發送的數據包,由圖可知這是允許服務器的響應數據包通過。
同時防火牆還具有地址轉換功能;在前面介紹了公司內網和互聯網通信需要通過路由器進行地址轉換,實際上防火牆的地址轉換實現和它是一樣的,也是通過設定規則來實現的,一旦發送端/接收端的IP和端口滿足規則就進行地址轉換。
注意:防火牆的包過濾技術並不是它獨有的機制;實際上是在路由器包轉發基礎上發展起來的,路由器的包轉發功能其實也具有包過濾的特點;如果判斷規則不是特別復雜的話,通過路由器的命令可以維護這些規則,就無需使用專門的硬件和軟件搭建防火牆來進行過濾。(包過濾式防火牆是通過起點和終點來過濾數據的,因此他並不能杜絕所有風險)
三、負載和代理服務器--利用緩存服務器來分擔負載
在用戶較多,訪問量較大的網站僅靠一台服務器是無法滿足需求的;因此一般需要多台服務器來分擔線上的壓力,稱這種服務器架構方式為分布式架構;分布式架構有多種:
- 最簡單:通過dns服務器實現,對同一個網址在dns服務器中保存多條IP記錄;當多個用戶請求該地址時,dns服務器對查詢該地址的請求,依次循環返回不同的服務器IP;
- 常用的:通過負載均衡器來判斷對請求的分配;原理是將負載均衡器的IP記錄在dns表中和請求地址關聯,當用戶發起請求首先會根據域名解析到負載均衡器,負載均衡器在根據“設定的規則”來將請求分配給服務器;
- 通過負載均衡器分配請求的核心,是分配請求的規則;通常可根據定期采集的web服務器的cpu、內存使用率等、來判斷服務器的負載從而分配請求;也可以根據事先設置的服務器的性能指數,按比例分配請求;
- 特殊請求:當操作跨多個頁面時,此時則必須將請求發送到同一個web服務器;至於判斷操作之間的關聯性可以根據http協議消息頭中的cookie來判斷,同一會話就會發送給同一服務器處理;
負載均衡器工作示例如圖:
除了上面說的分擔負載的方式外;還能通過緩存服務器分擔負載,緩存服務器是部署在客戶端和服務器之間的中轉服務器;反向緩存服務器實現負載均衡的方式和負載均衡器有點類似(負載均衡器是在緩存服務器基礎上發展而來的)
- 首先還是需要將緩存服務器的IP記錄在dns服務器上(只有反向緩存服務器需要);用戶通過域名解析首先將請求發送到緩存服務器,緩存服務器收到請求后首先會查下本地有沒有緩存數據;
- 如果沒有緩存數據的話;會將收到的數據包中的http消息加一個via參數發給服務器(via參數用來表示數據經過了緩存服務器中轉);
- 當存在多台服務器時;緩存服務器會根據http消息中的請求地址的目錄來確定將請求發送給哪個服務器;(反向緩存服務器通過目錄關聯目的服務器)
- 緩存服務器發送數據的方式和客戶端是一樣的;服務器接收到請求消息后,返回響應的數據包;
- 響應的數據包也會先發送到緩存服務器上;緩存服務器會在數據包的消息中加入via參數后,將數據轉發給客戶端,同時會將數據保存一份在緩存服務器上;
- 如果緩存服務器有緩存數據;在收到客戶端請求時,則會將在數據包的http消息中加入via參數和if-modified-since參數(緩存數據上次保存時間)並轉發給服務器;(使用cds服務就無需這個操作)
- 服務器收到請求會在根據緩存數據保存時間,和請求數據更新時間來判斷數據是否有變化;如無變化;則返回很短的響應消息告訴緩存服務器數據無變化;
- 然后緩存服務器就會將緩存的數據發給請求的客戶端;
- 如果服務器收到請求后;根據緩存數據保存時間和服務器數據更新時間判斷數據有變化;則會將更新的數據返回給緩存服務器(這和緩存服務器無緩存時的情況是一樣的);
示例圖如下:
上方使用的是在服務器的一端部署一個代理;同時還能在客戶端的一側部署代理服務器,用作緩存服務器;這種將代理服務器放置在客戶端一側的代理是正向代理;
正向代理常用來做緩存服務器;除了緩存功能外,一般還用來設定防火牆,原理如下:
客戶端的請求和服務端的響應都會通過代理服務器;進入代理服務器后能對數據包傳輸的消息內容進行檢測,因此就可以設計規則攔截某些訪問(活脫脫就是個牆啊,vpn使用的就是這種技術,注意使用正向代理需要先在瀏覽器中配置代理)
補充:由於在瀏覽器輸入地址時,輸入的是完整地址,因此可以發送給任意服務器;這和服務器端的緩存服務器不同;他只能向事先設置好的目標轉發,並且通過請求地址中目錄名關聯服務器,這種方式稱為反向代理,能轉發不包含完整網址的請求。
還有一種透明代理,無需在瀏覽器上配置代理;也不是和反向代理一樣通過dns解析來實現代理;而是直接在包發送/接收的路徑上攔截或過濾出數據包,從而實現轉發。
四、緩存服務器的實現內容分發服務
緩存服務器常見有這三種部署方式,各有優缺點如圖:
其中第三種方式是和內容分發服務運營商簽約來選擇租用合適的服務器作為緩存服務器;這種服務稱為內容分發服務cds。
通過cds服務租用了大量的緩存服務器后,我們希望用戶發起的請求會首先發給離他最近的緩存服務器;請求分配給最近的緩存服務器有兩種方式如下圖:
- 將所有緩存服務器的路由信息記錄到服務器端的dns服務器上,客戶端dns服務器發起的域名解析的請求,服務器端的dns服務器做出響應時需要通過路由轉發,通過路由信息計算出最近的緩存服務器的轉發路由即可將最近的緩存服務器確定下來;然后在請求地址時,將地址解析到該IP就能利用最近的緩存服務器實現代理了;
- 通過重定向的方式來使用最近的緩存服務器;最近的位置計算方式和上面一致;然后利用http消息中的重定向參數,將請求發送給重定向服務器該服務器在將請求轉發到最近的緩存服務器;
補充:CDS服務提供的緩存服務器具有在目標服務器數據有更新時;直接將更新數據推送到CDS服務的緩存服務器的機制;這樣能減少轉發用戶端的請求到目的服務器的操作;有效提升訪問速度。