數據中心
數據中心是一個大雜燴,幾乎要用到前面學過的所有知識。
前面講辦公室網絡的時候,我們知道辦公室里面有很多台電腦。如果要訪問外網,需要經過一個叫網關的東西,而網關往往是一個路由器。
數據中心里面也有一大堆的電腦,但是它和咱們辦公室里面的筆記本或者台式機不一樣。數據中心里面是服務器。服務器被放在一個個叫作機架(Rack)的架子上面。
數據中心的入口和出口也是路由器,由於在數據中心的邊界,就像在一個國家的邊境,稱為邊界路由器(Border Router)。為了高可用,邊界路由器會有多個。
一般家里只會連接一個運營商的網絡,而為了高可用, 為了當一個運營商出問題的時候,還可以通過另外一個運營商來提供服務,所以數據中心的邊界路由器會連接多個運營商網絡。
既然是路由器,就需要跑路由協議,數據中心往往就是路由協議中的自治區域(AS)。數據中心里面的機器要想訪問外面的網站,數據中心里面也是有對外提供服務的機器,都可以通過BGP協議,獲取內外互通的路由信息。這就是我們常聽到的多線BGP的概念。
如果數據中心非常簡單,沒幾台機器,那就像家里或者宿舍一樣,所有的服務器都直接連到路由器上就可以了。但是數據中心里面往往有非常多的機器,當塞滿一機架的時候,需要有交換機將這些服務器連接起來,可以互相通信。
這些交換機往往是放在機架頂端的,所以經常稱為TOR(Top Of Rack)交換機。這一層的交換機常常稱為接入層(Access Layer)。注意這個接入層和原來講過的應用的接入層不是一個概念。

當一個機架放不下的時候,就需要多個機架,還需要有交換機將多個機架連接在一起。這些交換機對性能的要求更高,帶寬也更大。這些交換機稱為匯聚層交換機(Aggregation Layer)。
數據中心里面的每一個連接都是需要考慮高可用的。這里首先要考慮的是,如果一台機器只有一個網卡,上面連着一個網線,接入到TOR交換機上。如果網卡壞了,或者不小心網線掉了,機器就上不去了。所以,需要至少兩個網卡、兩個網線插到TOR交換機上,但是兩個網卡要工作得像一張網卡一樣,這就是常說的網卡綁定(bond)。
這就需要服務器和交換機都支持一種協議LACP(Link Aggregation Control Protocol)。它們互相通信,將多個網卡聚合稱為一個網卡,多個網線聚合成一個網線,在網線之間可以進行負載均衡,也可以為了高可用作准備。

網卡有了高可用保證,但交換機還有問題。如果一個機架只有一個交換機,它掛了,那整個機架都不能上網了。因而TOR交換機也需要高可用,同理接入層和匯聚層的連接也需要高可用性,也不能單線連着。
最傳統的方法是,部署兩個接入交換機、兩個匯聚交換機。服務器和兩個接入交換機都連接,接入交換機和兩個匯聚都連接,當然這樣會形成環,所以需要啟用STP協議,去除環,但是這樣兩個匯聚就只能一主一備了。STP協議里我們學過,只有一條路會起作用。

交換機有一種技術叫作堆疊,所以另一種方法是,將多個交換機形成一個邏輯的交換機,服務器通過多根線分配連到多個接入層交換機上,而接入層交換機多根線分別連接到多個交換機上,並且通過堆疊的私有協議,形成雙活的連接方式。

由於對帶寬要錢求更大,而且掛了影響也更大,所以兩個堆疊可能就不夠了,可以就會有更多的,比如四個堆疊為一個邏輯的交換機。
匯聚層將大量的計算節點相互連接在一起,形成一個集群。在這個集群里面,服務器之間通過二層互通,這個區域常稱為一個POD(Point Of Delivery),有時候也稱為一個可用區(Available Zone)。
當節點數目再多的時候,一個可用區放不下,需要將多個可用區連在一起,連接多個可用區的交換機稱為核心交換機。

核心交換機吞吐量更大,高可用要求更高,肯定需要堆疊,但是往往僅僅堆疊,不足以滿足吞吐量,因而還是需要部署多組核心交換機。核心和匯聚交換機之間為了高可用,也是全互連模式的。
這個時候還存在那個問題,出現環路怎么辦?
一種方式是,不同的可用區在不同的二層網絡,需要分配不同的網段。匯聚和核心之間通過三層網絡互通的,二層都不在一個廣播域里面,不會存在二層環路的問題。三層有環是沒有問題的,只要通過路由協議選擇最佳的路徑就可以了。那為啥二層不能有環路,而三層可以呢?你可以回憶一下二層環路的情況。

如圖,核心層和匯聚層之間通過內部的路由協議OSPF,找到最佳的路徑進行訪問,而且還可以通過ECMP等價路由,在多個路徑之間進行負載均衡和高可用。
但是隨着數據中心里面的機器越來越多,尤其是有了雲計算、大數據,集群規模非常大,而且都要求在一個二層網絡里面。這就需要二層互連從匯聚層上升為核心層,也即在核心以下,全部是二層互連,全部在一個廣播域里面,這就是常說的大二層。

如果大二層橫向流量不大,核心交換機數目不多,可以做堆疊,但是如果橫向流量很大,僅僅堆疊滿足不了,就需要部署多組核心交換機,而且要和匯聚層進行全互連。由於堆疊只解決一個核心交換機組內的無環問題,而組之間全互連,還需要其他機制進行解決。
如果是STP,那部署多組核心無法擴大橫向流量的能力,因為還是只有一組起作用。
於是大二層就引入了TRILL(Transparent Interconnection of Lots of Link),即多鏈接透明互聯協議。它的基本思想是,二層環有問題,三層環沒有問題,那就把三層的路由能力模擬在二層實現。
運行TRILL協議的交換機稱為RBridge,是具有路由轉發特性的網橋設備,只不過這個路由是根據MAC地址來的,不是根據IP來的。
Rbridage之間通過鏈路狀態協議運作。記得這個路由協議嗎?通過它可以學習整個大二層的拓撲,知道訪問哪個MAC應該從哪個網橋走;還可以計算最短的路徑,也可以通過等價的路由進行負載均衡和高可用性。

TRILL協議在原來的MAC頭外面加上自己的頭,以及外層的MAC頭。TRILL頭里面的Ingress RBridge,有點像IP頭里面的源IP地址,Egress RBridge是目標IP地址,這兩個地址是端到端的,在中間路由的時候,不會發生改變。而外層的MAC,可以有下一跳的Bridge,就像路由的下一跳,也是通過MAC地址來呈現的一樣。
如圖中所示的過程,有一個包要從主機A發送到主機B,中間要經過RBridge 1、RBridge 2、RBridge X等等,直到RBridge 3。在RBridge 2收到的包里面,分內外兩層,內層就是傳統的主機A和主機B的MAC地址以及內層的VLAN。
在外層首先加上一個TRILL頭,里面描述這個包從RBridge 1進來的,要從RBridge 3出去,並且像三層的IP地址一樣有跳數。然后再外面,目的MAC是RBridge 2,源MAC是RBridge 1,以及外層的VLAN。
當RBridge 2收到這個包之后,首先看MAC是否是自己的MAC,如果是,要看自己是不是Egress RBridge,也即是不是最后一跳;如果不是,查看跳數是不是大於0,然后通過類似路由查找的方式找到下一跳RBridge X,然后將包發出去。
RBridge 2發出去的包,內層的信息是不變的,外層的TRILL頭里面。同樣,描述這個包從RBridge 1進來的,要從RBridge 3出去,但是跳數要減1。外層的目標MAC變成RBridge X,源MAC變成RBridge 2。
如此一直轉發,直到RBridge 3,將外層解出來,發送內層的包給主機B。
這個過程是不是和IP路由很像?
對於大二層的廣播包,也需要通過分發樹的技術來實現。我們知道STP是將一個有環的圖,通過去掉邊形成一棵樹,而分發樹是一個有環的圖形成多棵樹,不同的樹有不同的VLAN,有的廣播包從VLAN A廣播,有的從VLAN B廣播,實現負載均衡和高可用。

核心交換機之外,就是邊界路由器了。至此從服務器到數據中心邊界的層次情況已經清楚了。
在核心交換上面,往往會掛一些安全設備,例如入侵檢測、DDoS防護等等。這是整個數據中心的屏障,防止來自外來的攻擊。核心交換機上往往還有負載均衡器,原理前面的章節已經說過了。
在有的數據中心里面,對於存儲設備,還會有一個存儲網絡,用來連接SAN和NAS。但是對於新的雲計算來講,往往不使用傳統的SAN和NAS,而使用部署在x86機器上的軟件定義存儲,這樣存儲也是服務器了,而且可以和計算節點融合在一個機架上,從而更加有效率,也就沒有了單獨的存儲網絡了。
於是整個數據中心的網絡如下圖所示。

這是一個典型的三層網絡結構。這里的三層不是指IP層,而是指接入層、匯聚層、核心層三層。這種模式非常有利於外部流量請求到內部應用。這個類型的流量,是從外到內或者從內到外,對應到上面那張圖里,就是從上到下,從下到上,上北下南,所以稱為南北流量。
但是隨着雲計算和大數據的發展,節點之間的交互越來越多,例如大數據計算經常要在不同的節點將數據拷貝來拷貝去,這樣需要經過交換機,使得數據從左到右,從右到左,左西右東,所以稱為東西流量。
為了解決東西流量的問題,演進出了葉脊網絡(Spine/Leaf)。
- 葉子交換機(leaf),直接連接物理服務器。L2/L3網絡的分界點在葉子交換機上,葉子交換機之上是三層網絡。
- 脊交換機(spine switch),相當於核心交換機。葉脊之間通過ECMP動態選擇多條路徑。脊交換機現在只是為葉子交換機提供一個彈性的L3路由網絡。南北流量可以不用直接從脊交換機發出,而是通過與leaf交換機並行的交換機,再接到邊界路由器出去。

傳統的三層網絡架構是垂直的結構,而葉脊網絡架構是扁平的結構,更易於水平擴展。
總結
好了,復雜的數據中心就講到這里了。我們來總結一下,你需要記住這三個重點。
- 數據中心分為三層。服務器連接到接入層,然后是匯聚層,再然后是核心層,最外面是邊界路由器和安全設備。
- 數據中心的所有鏈路都需要高可用性。服務器需要綁定網卡,交換機需要堆疊,三層設備可以通過等價路由,二層設備可以通過TRILL協議。
- 隨着雲和大數據的發展,東西流量相對於南北流量越來越重要,因而演化為葉脊網絡結構。
VPN
數據中心,里面很復雜,但是有的公司有多個數據中心,需要將多個數據中心連接起來,或者需要辦公室和數據中心連接起來。這該怎么辦呢?
- 第一種方式是走公網,但是公網太不安全,你的隱私可能會被別人偷窺。
- 第二種方式是租用專線的方式把它們連起來,這是土豪的做法,需要花很多錢。
- 第三種方式是用VPN來連接,這種方法比較折中,安全又不貴。

VPN,全名Virtual Private Network,虛擬專用網,就是利用開放的公眾網絡,建立專用數據傳輸通道,將遠程的分支機構、移動辦公人員等連接起來。
VPN是如何工作的?
VPN通過隧道技術在公眾網絡上仿真一條點到點的專線,是通過利用一種協議來傳輸另外一種協議的技術,這里面涉及三種協議:乘客協議、隧道協議和承載協議。
我們以IPsec協議為例來說明。

你知道如何通過自駕進行海南游嗎?這其中,你的車怎么通過瓊州海峽呢?這里用到輪渡,其實這就用到隧道協議。
在廣州這邊開車是有“協議”的,例如靠右行駛、紅燈停、綠燈行,這個就相當於“被封裝”的乘客協議。當然在海南那面,開車也是同樣的協議。這就相當於需要連接在一起的一個公司的兩個分部。
但是在海上坐船航行,也有它的協議,例如要看燈塔、要按航道航行等。這就是外層的承載協議。
那我的車如何從廣州到海南呢?這就需要你遵循開車的協議,將車開上輪渡,所有通過輪渡的車都關在船艙里面,按照既定的規則排列好,這就是隧道協議。
在大海上,你的車是關在船艙里面的,就像在隧道里面一樣,這個時候內部的乘客協議,也即駕駛協議沒啥用處,只需要船遵從外層的承載協議,到達海南就可以了。
到達之后,外部承載協議的任務就結束了,打開船艙,將車開出來,就相當於取下承載協議和隧道協議的頭。接下來,在海南該怎么開車,就怎么開車,還是內部的乘客協議起作用。
在最前面的時候說了,直接使用公網太不安全,所以接下來我們來看一種十分安全的VPN,IPsec VPN。這是基於IP協議的安全隧道協議,為了保證在公網上面信息的安全,因而采取了一定的機制保證安全性。
- 機制一:私密性,防止信息泄漏給未經授權的個人,通過加密把數據從明文變成無法讀懂的密文,從而確保數據的私密性。
加密可以分為對稱加密和非對稱加密。對稱加密速度快一些。而VPN一旦建立,需要傳輸大量數據,因而我們采取對稱加密。但是同樣,對稱加密還是存在加密秘鑰如何傳輸的問題,這里需要用到因特網密鑰交換(IKE,Internet Key Exchange)協議。 - 機制二:完整性,數據沒有被非法篡改,通過對數據進行hash運算,產生類似於指紋的數據摘要,以保證數據的完整性。
- 機制三:真實性,數據確實是由特定的對端發出,通過身份認證可以保證數據的真實性。
那如何保證對方就是真正的那個人呢?
- 第一種方法就是預共享密鑰,也就是雙方事先商量好一個暗號,比如“天王蓋地虎,寶塔鎮河妖”,對上了,就說明是對的。
- 另外一種方法就是用數字簽名來驗證。咋簽名呢?當然是使用私鑰進行簽名,私鑰只有我自己有,所以如果對方能用我的數字證書里面的公鑰解開,就說明我是我。
基於以上三個特性,組成了IPsec VPN的協議簇。這個協議簇內容比較豐富。

在這個協議簇里面,有兩種協議,這兩種協議的區別在於封裝網絡包的格式不一樣。
- 一種協議稱為AH(Authentication Header),只能進行數據摘要 ,不能實現數據加密。
- 還有一種ESP(Encapsulating Security Payload),能夠進行數據加密和數據摘要。
在這個協議簇里面,還有兩類算法,分別是加密算法和摘要算法。
這個協議簇還包含兩大組件,
一個用於VPN的雙方要進行對稱密鑰的交換的IKE組件,
另一個是VPN的雙方要對連接進行維護的SA(Security Association)組件。
IPsec VPN的建立過程
下面來看IPsec VPN的建立過程,這個過程分兩個階段。
第一個階段,建立IKE自己的SA
這個SA用來維護一個通過身份認證和安全保護的通道,為第二個階段提供服務。在這個階段,通過DH(Diffie-Hellman)算法計算出一個對稱密鑰K。
DH算法是一個比較巧妙的算法。客戶端和服務端約定兩個公開的質數p和q,然后客戶端隨機產生一個數a作為自己的私鑰,服務端隨機產生一個b作為自己的私鑰,客戶端可以根據p、q和a計算出公鑰A,服務端根據p、q和b計算出公鑰B,然后雙方交換公鑰A和B。
到此客戶端和服務端可以根據已有的信息,各自獨立算出相同的結果K,就是對稱密鑰。但是這個過程,對稱密鑰從來沒有在通道上傳輸過,只傳輸了生成密鑰的材料,通過這些材料,截獲的人是無法算出的。

建立IPsec SA
在這個SA里面,雙方會生成一個隨機的對稱密鑰M,由K加密傳給對方,然后使用M進行雙方接下來通信的數據。對稱密鑰M是有過期時間的,會過一段時間,重新生成一次,從而防止被破解。
IPsec SA里面有以下內容:
- SPI(Security Parameter Index),用於標識不同的連接;
- 雙方商量好的加密算法、哈希算法和封裝模式;
- 生存周期,超過這個周期,就需要重新生成一個IPsec SA,重新生成對稱密鑰。

打包封裝傳輸

左面是原始的IP包,在IP頭里面,會指定上一層的協議為TCP。ESP要對IP包進行封裝,因而IP頭里面的上一層協議為ESP。在ESP的正文里面,ESP的頭部有雙方商討好的SPI,以及這次傳輸的序列號。
接下來全部是加密的內容。可以通過對稱密鑰進行解密,解密后在正文的最后,指明了里面的協議是什么。如果是IP,則需要先解析IP頭,然后解析TCP頭,這是從隧道出來后解封裝的過程。
有了IPsec VPN之后,客戶端發送的明文的IP包,都會被加上ESP頭和IP頭,在公網上傳輸,由於加密,可以保證不被竊取,到了對端后,去掉ESP的頭,進行解密。

這種點對點的基於IP的VPN,能滿足互通的要求,但是速度往往比較慢,這是由底層IP協議的特性決定的。IP不是面向連接的,是盡力而為的協議,每個IP包自由選擇路徑,到每一個路由器,都自己去找下一跳,丟了就丟了,是靠上一層TCP的重發來保證可靠性。

因為IP網絡從設計的時候,就認為是不可靠的,所以即使同一個連接,也可能選擇不同的道路,這樣的好處是,一條道路崩潰的時候,總有其他的路可以走。當然,帶來的代價就是,不斷的路由查找,效率比較差。
ATM
和IP對應的另一種技術稱為ATM。這種協議和IP協議的不同在於,它是面向連接的。你可以說TCP也是面向連接的啊。這兩個不同,ATM和IP是一個層次的,和TCP不是一個層次的。
另外,TCP所謂的面向連接,是不停地重試來保證成功,其實下層的IP還是不面向連接的,丟了就丟了。ATM是傳輸之前先建立一個連接,形成一個虛擬的通路,一旦連接建立了,所有的包都按照相同的路徑走,不會分頭行事。

好處是不需要每次都查路由表的,虛擬路徑已經建立,打上了標簽,后續的包傻傻的跟着走就是了,不用像IP包一樣,每個包都思考下一步怎么走,都按相同的路徑走,這樣效率會高很多。
但是一旦虛擬路徑上的某個路由器壞了,則這個連接就斷了,什么也發不過去了,因為其他的包還會按照原來的路徑走,都掉坑里了,它們不會選擇其他的路徑走。
ATM技術雖然沒有成功,但其屏棄了繁瑣的路由查找,改為簡單快速的標簽交換,將具有全局意義的路由表改為只有本地意義的標簽表,這些都可以大大提高一台路由器的轉發功力。
MPLS
有沒有一種方式將兩者的優點結合起來呢?這就是多協議標簽交換(MPLS,Multi-Protocol Label Switching)。MPLS的格式如圖所示,在原始的IP頭之外,多了MPLS的頭,里面可以打標簽。

在二層頭里面,有類型字段,0x0800表示IP,0x8847表示MPLS Label。
在MPLS頭里面,首先是標簽值占20位,接着是3位實驗位,再接下來是1位棧底標志位,表示當前標簽是否位於棧底了。這樣就允許多個標簽被編碼到同一個數據包中,形成標簽棧。最后是8位TTL存活時間字段,如果標簽數據包的出發TTL值為0,那么該數據包在網絡中的生命期被認為已經過期了。
有了標簽,還需要設備認這個標簽,並且能夠根據這個標簽轉發,這種能夠轉發標簽的路由器稱為標簽交換路由器(LSR,Label Switching Router)。
這種路由器會有兩個表格,
一個就是傳統的FIB,也即路由表,另一個就是LFIB,標簽轉發表。
有了這兩個表,既可以進行普通的路由轉發,也可以進行基於標簽的轉發。

有了標簽轉發表,轉發的過程如圖所示,就不用每次都進行普通路由的查找了。
這里我們區分MPLS區域和非MPLS區域。在MPLS區域中間,使用標簽進行轉發,非MPLS區域,使用普通路由轉發,在邊緣節點上,需要有能力將對於普通路由的轉發,變成對於標簽的轉發。
例如圖中要訪問114.1.1.1,在邊界上查找普通路由,發現馬上要進入MPLS區域了,進去了對應標簽1,於是在IP頭外面加一個標簽1,在區域里面,標簽1要變成標簽3,標簽3到達出口邊緣,將標簽去掉,按照路由發出。
這樣一個通過標簽轉換而建立的路徑稱為LSP,標簽交換路徑。在一條LSP上,沿數據包傳送的方向,相鄰的LSR分別叫上游LSR(upstream LSR)和下游LSR(downstream LSR)。
有了標簽,轉發是很簡單的事,但是如何生成標簽,卻是MPLS中最難修煉的部分。在MPLS秘笈中,這部分被稱為LDP(Label Distribution Protocol),是一個動態的生成標簽的協議。
其實LDP與IP幫派中的路由協議十分相像,通過LSR的交互,互相告知去哪里應該打哪個標簽,稱為標簽分發,往往是從下游開始的。

如果有一個邊緣節點發現自己的路由表中出現了新的目的地址,它就要給別人說,我能到達一條新的路徑了。
如果此邊緣節點存在上游LSR,並且尚有可供分配的標簽,則該節點為新的路徑分配標簽,並向上游發出標簽映射消息,其中包含分配的標簽等信息。
收到標簽映射消息的LSR記錄相應的標簽映射信息,在其標簽轉發表中增加相應的條目。此LSR為它的上游LSR分配標簽,並繼續向上游LSR發送標簽映射消息。
當入口LSR收到標簽映射消息時,在標簽轉發表中增加相應的條目。這時,就完成了LSP的建立。有了標簽,轉發輕松多了,但是這個和VPN什么關系呢?
可以想象,如果我們VPN通道里面包的轉發,都是通過標簽的方式進行,效率就會高很多。所以要想個辦法把MPLS應用於VPN。

MPLS VPN
在MPLS VPN中,網絡中的路由器分成以下幾類:
- PE(Provider Edge):運營商網絡與客戶網絡相連的邊緣網絡設備;
- CE(Customer Edge):客戶網絡與PE相連接的邊緣設備;
- P(Provider):這里特指運營商網絡中除PE之外的其他運營商網絡設備。
為什么要這樣分呢?
因為我們發現,在運營商網絡里面,也即P Router之間,使用標簽是沒有問題的,因為都在運營商的管控之下,對於網段,路由都可以自己控制。但是一旦客戶要接入這個網絡,就復雜得多。
首先是客戶地址重復的問題。客戶所使用的大多數都是私網的地址(192.168.X.X;10.X.X.X;172.X.X.X),而且很多情況下都會與其它的客戶重復。
比如,機構A和機構B都使用了192.168.101.0/24網段的地址,這就發生了地址空間重疊(Overlapping Address Spaces)。
首先困惑的是BGP協議,既然VPN將兩個數據中心連起來,應該看起來像一個數據中心一樣,那么如何到達另一端需要通過BGP將路由廣播過去,傳統BGP無法正確處理地址空間重疊的VPN的路由。
假設機構A和機構B都使用了192.168.101.0/24網段的地址,並各自發布了一條去往此網段的路由,BGP將只會選擇其中一條路由,從而導致去往另一個VPN的路由丟失。
所以PE路由器之間使用特殊的MP-BGP來發布VPN路由,在相互溝通的消息中,在一般32位IPv4的地址之前加上一個客戶標示的區分符用於客戶地址的區分,這種稱為VPN-IPv4地址族,這樣PE路由器會收到如下的消息,機構A的192.168.101.0/24應該往這面走,機構B的192.168.101.0/24則應該去另外一個方向。
另外困惑的是路由表,當兩個客戶的IP包到達PE的時候,PE就困惑了,因為網段是重復的。
如何區分哪些路由是屬於哪些客戶VPN內的?如何保證VPN業務路由與普通路由不相互干擾?
在PE上,可以通過VRF(VPN Routing&Forwarding Instance)建立每個客戶一個路由表,與其它VPN客戶路由和普通路由相互區分。可以理解為專屬於客戶的小路由器。
遠端PE通過MP-BGP協議把業務路由放到近端PE,近端PE根據不同的客戶選擇出相關客戶的業務路由放到相應的VRF路由表中。
VPN報文轉發采用兩層標簽方式:
- 第一層(外層)標簽在骨干網內部進行交換,指示從PE到對端PE的一條LSP。VPN報文利用這層標簽,可以沿LSP到達對端PE;
- 第二層(內層)標簽在從對端PE到達CE時使用,在PE上,通過查找VRF表項,指示報文應被送到哪個VPN用戶,或者更具體一些,到達哪一個CE。這樣,對端PE根據內層標簽可以找到轉發報文的接口。

我們來舉一個例子,看MPLS VPN的包發送過程。
- 機構A和機構B都發出一個目的地址為192.168.101.0/24的IP報文,分別由各自的CE將報文發送至PE。
- PE會根據報文到達的接口及目的地址查找VPN實例表項VRF,匹配后將報文轉發出去,同時打上內層和外層兩個標簽。假設通過MP-BGP配置的路由,兩個報文在骨干網走相同的路徑。
- MPLS網絡利用報文的外層標簽,將報文傳送到出口PE,報文在到達出口PE 2前一跳時已經被剝離外層標簽,僅含內層標簽。
- 出口PE根據內層標簽和目的地址查找VPN實例表項VRF,確定報文的出接口,將報文轉發至各自的CE。
- CE根據正常的IP轉發過程將報文傳送到目的地。
總結
- VPN可以將一個機構的多個數據中心通過隧道的方式連接起來,讓機構感覺在一個數據中心里面,就像自駕游通過瓊州海峽一樣;
- 完全基於軟件的IPsec VPN可以保證私密性、完整性、真實性、簡單便宜,但是性能稍微差一些;
- MPLS-VPN綜合和IP轉發模式和ATM的標簽轉發模式的優勢,性能較好,但是需要從運營商購買。
移動網絡
移動網絡的發展歷程
你一定知道手機上網有2G、3G、4G的說法,究竟這都是什么意思呢?有一個通俗的說法就是:用2G看txt,用3G看jpg,用4G看avi。
2G網絡
手機本來是用來打電話的,不是用來上網的,所以原來在2G時代,上網使用的不是IP網絡,而是電話網絡,走模擬信號,專業名稱為公共交換電話網(PSTN,Public Switched Telephone Network)。
那手機不連網線,也不連電話線,它是怎么上網的呢?
手機是通過收發無線信號來通信的,專業名稱是Mobile Station,簡稱MS,需要嵌入SIM。手機是客戶端,而無線信號的服務端,就是基站子系統(BSS,Base Station SubsystemBSS)。至於什么是基站,你可以回想一下,你在爬山的時候,是不是看到過信號塔?我們平時城市里面的基站比較隱蔽,不容易看到,所以只有在山里才會注意到。正是這個信號塔,通過無線信號,讓你的手機可以進行通信。
但是你要知道一點,無論無線通信如何無線,最終還是要連接到有線的網絡里。
因而,基站子系統分兩部分,一部分對外提供無線通信,叫作基站收發信台(BTS,Base Transceiver Station),另一部分對內連接有線網絡,叫作基站控制器(BSC,Base Station Controller)。基站收發信台通過無線收到數據后,轉發給基站控制器。
這部分屬於無線的部分,統稱為無線接入網(RAN,Radio Access Network)。
基站控制器通過有線網絡,連接到提供手機業務的運營商的數據中心,這部分稱為核心網(CN,Core Network)。核心網還沒有真的進入互聯網,這部分還是主要提供手機業務,是手機業務的有線部分。
首先接待基站來的數據的是移動業務交換中心(MSC,Mobile Service Switching Center),它是進入核心網的入口,但是它不會讓你直接連接到互聯網上。
因為在讓你的手機真正進入互聯網之前,提供手機業務的運營商,需要認證是不是合法的手機接入。別你自己造了一張手機卡,就連接上來。鑒權中心(AUC,Authentication Center)和設備識別寄存器(EIR,Equipment Identity Register)主要是負責安全性的。
另外,需要看你是本地的號,還是外地的號,這個牽扯到計費的問題,異地收費還是很貴的。訪問位置寄存器(VLR,Visit Location Register)是看你目前在的地方,歸屬位置寄存器(HLR,Home Location Register)是看你的號碼歸屬地。
當你的手機卡既合法又有錢的時候,才允許你上網,這個時候需要一個網關,連接核心網和真正的互聯網。網關移動交換中心(GMSC ,Gateway Mobile Switching Center)就是干這個的,然后是真正的互連網。在2G時代,還是電話網絡PSTN。
數據中心里面的這些模塊統稱為網絡子系統(NSS,Network and Switching Subsystem)。

因而2G時代的上網如圖所示,我們總結一下,有這幾個核心點:
- 手機通過無線信號連接基站;
- 基站一面朝前接無線,一面朝后接核心網;
- 核心網一面朝前接到基站請求,一是判斷你是否合法,二是判斷你是不是本地號,還有沒有錢,一面通過網關連接電話網絡。
2.5G網絡
后來從2G到了2.5G,也即在原來電路交換的基礎上,加入了分組交換業務,支持Packet的轉發,從而支持IP網絡。
在上述網絡的基礎上,基站一面朝前接無線,一面朝后接核心網。在朝后的組件中,多了一個分組控制單元(PCU,Packet Control Unit),用以提供分組交換通道。
在核心網里面,有個朝前的接待員(SGSN,Service GPRS Supported Node)和朝后連接IP網絡的網關型GPRS支持節點(GGSN,Gateway GPRS Supported Node)。

3G網絡
到了3G時代,主要是無線通信技術有了改進,大大增加了無線的帶寬。
以W-CDMA為例,理論最高2M的下行速度,因而基站改變了,一面朝外的是Node B,一面朝內連接核心網的是無線網絡控制器(RNC,Radio Network Controller)。核心網以及連接的IP網絡沒有什么變化。

4G網絡
然后就到了今天的4G網絡,基站為eNodeB,包含了原來Node B和RNC的功能,下行速度向百兆級別邁進。另外,核心網實現了控制面和數據面的分離,這個怎么理解呢?
在前面的核心網里面,有接待員MSC或者SGSN,你會發現檢查是否合法是它負責,轉發數據也是它負責,也即控制面和數據面是合二為一的,這樣靈活性比較差,因為控制面主要是指令,多是小包,往往需要高的及時性;數據面主要是流量,多是大包,往往需要吞吐量。
於是有了下面這個架構。

HSS用於存儲用戶簽約信息的數據庫,其實就是你這個號碼歸屬地是哪里的,以及一些認證信息。
MME是核心控制網元,是控制面的核心,當手機通過eNodeB連上的時候,MME會根據HSS的信息,判斷你是否合法。如果允許連上來,MME不負責具體的數據的流量,而是MME會選擇數據面的SGW和PGW,然后告訴eNodeB,我允許你連上來了,你連接它們吧。
於是手機直接通過eNodeB連接SGW,連上核心網,SGW相當於數據面的接待員,並通過PGW連到IP網絡。PGW就是出口網關。在出口網關,有一個組件PCRF,稱為策略和計費控制單元,用來控制上網策略和流量的計費。
4G網絡協議解析
我們來仔細看一下4G網絡的協議,真的非常復雜。我們將幾個關鍵組件放大來看。

控制面協議
其中虛線部分是控制面的協議。當一個手機想上網的時候,先要連接eNodeB,並通過S1-MME接口,請求MME對這個手機進行認證和鑒權。S1-MME協議棧如下圖所示。

UE就是你的手機,eNodeB還是兩面派,朝前對接無線網絡,朝后對接核心網絡,在控制面對接的是MME。
eNodeB和MME之間的連接就是很正常的IP網絡,但是這里面在IP層之上,卻既不是TCP,也不是UDP,而是SCTP。這也是傳輸層的協議,也是面向連接的,但是更加適合移動網絡。 它繼承了TCP較為完善的擁塞控制並改進TCP的一些不足之處。
SCTP的第一個特點是多宿主。
一台機器可以有多個網卡,而對於TCP連接來講,雖然服務端可以監聽0.0.0.0,也就是從哪個網卡來的連接都能接受,但是一旦建立了連接,就建立了四元組,也就選定了某個網卡。
SCTP引入了聯合(association)的概念,將多個接口、多條路徑放到一個聯合中來。當檢測到一條路徑失效時,協議就會通過另外一條路徑來發送通信數據。應用程序甚至都不必知道發生了故障、恢復,從而提供更高的可用性和可靠性。
SCTP的第二個特點是將一個聯合分成多個流。
一個聯合中的所有流都是獨立的,但均與該聯合相關。每個流都給定了一個流編號,它被編碼到SCTP報文中,通過聯合在網絡上傳送。在TCP的機制中,由於強制順序,導致前一個不到達,后一個就得等待,SCTP的多個流不會相互阻塞。
SCTP的第三個特點是四次握手,防止SYN攻擊。
在TCP中是三次握手,當服務端收到客戶的SYN之后,返回一個SYN-ACK之前,就建立數據結構,並記錄下狀態,等待客戶端發送ACK的ACK。當惡意客戶端使用虛假的源地址來偽造大量SYN報文時,服務端需要分配大量的資源,最終耗盡資源,無法處理新的請求。
SCTP可以通過四次握手引入Cookie的概念,來有效地防止這種攻擊的產生。
-
在SCTP中,客戶機使用一個INIT報文發起一個連接。
-
服務器使用一個INIT-ACK報文進行響應,其中就包括了Cookie。
-
然后客戶端就使用一個COOKIE-ECHO報文進行響應,其中包含了服務器所發送的Cookie。
-
這個時候,服務器為這個連接分配資源,並通過向客戶機發送一個COOKIE-ACK報文對其進行響應。
SCTP的第四個特點是將消息分幀。
TCP是面向流的,也即發送的數據沒頭沒尾,沒有明顯的界限。這對於發送數據沒有問題,但是對於發送一個個消息類型的數據,就不太方便。有可能客戶端寫入10個字節,然后再寫入20個字節。服務端不是讀出10個字節的一個消息,再讀出20個字節的一個消息,而有可能讀入25個字節,再讀入5個字節,需要業務層去組合成消息。
SCTP借鑒了UDP的機制,在數據傳輸中提供了消息分幀功能。當一端對一個套接字執行寫操作時,可確保對等端讀出的數據大小與此相同。
SCTP的第五個特點是斷開連接是三次揮手。
在TCP里面,斷開連接是四次揮手,允許另一端處於半關閉的狀態。SCTP選擇放棄這種狀態,當一端關閉自己的套接字時,對等的兩端全部需要關閉,將來任何一端都不允許再進行數據的移動了。
當MME通過認證鑒權,同意這個手機上網的時候,需要建立一個數據面的數據通路。建立通路的過程還是控制面的事情,因而使用的是控制面的協議GTP-C。
建設的數據通路分兩段路,其實是兩個隧道。
一段是從eNodeB到SGW,這個數據通路由MME通過S1-MME協議告訴eNodeB,它是隧道的一端,通過S11告訴SGW,它是隧道的另一端。
第二端是從SGW到PGW,SGW通過S11協議知道自己是其中一端,並主動通過S5協議,告訴PGW它是隧道的另一端。
GTP-C協議是基於UDP的。如果看GTP頭,我們可以看到,這里面有隧道的ID,還有序列號。

通過序列號,不用TCP,GTP-C自己就可以實現可靠性,為每個輸出信令消息分配一個依次遞增的序列號,以確保信令消息的按序傳遞,並便於檢測重復包。對於每個輸出信令消息啟動定時器,在定時器超時前未接收到響應消息則進行重發。
數據面協議
當兩個隧道都打通,接在一起的時候,PGW會給手機分配一個IP地址,這個IP地址是隧道內部的IP地址,可以類比為IPsec協議里面的IP地址。這個IP地址是歸手機運營商管理的。然后,手機可以使用這個IP地址,連接eNodeB,從eNodeB經過S1-U協議,通過第一段隧道到達SGW,再從SGW經過S8協議,通過第二段隧道到達PGW,然后通過PGW連接到互聯網。
數據面的協議都是通過GTP-U,如圖所示。

手機每發出的一個包,都由GTP-U隧道協議封裝起來,格式如下。

和IPsec協議很類似,分為乘客協議、隧道協議、承載協議。其中乘客協議是手機發出來的包,IP是手機的IP,隧道協議里面有隧道ID,不同的手機上線會建立不同的隧道,因而需要隧道ID來標識。承載協議的IP地址是SGW和PGW的IP地址。
手機上網流程
接下來,我們來看一個手機開機之后上網的流程,這個過程稱為Attach。可以看出來,移動網絡還是很復雜的。因為這個過程要建立很多的隧道,分配很多的隧道ID,所以畫了一個圖來詳細說明這個過程。

- 手機開機以后,在附近尋找基站eNodeB,找到后給eNodeB發送Attach Request,說“我來啦,我要上網”。
- eNodeB將請求發給MME,說“有個手機要上網”。
- MME去請求手機,一是認證,二是鑒權,還會請求HSS看看有沒有錢,看看是在哪里上網。
- 當MME通過了手機的認證之后,開始分配隧道,先告訴SGW,說要創建一個會話(Create Session)。在這里面,會給SGW分配一個隧道ID t1,並且請求SGW給自己也分配一個隧道ID。
- SGW轉頭向PGW請求建立一個會話,為PGW的控制面分配一個隧道ID t2,也給PGW的數據面分配一個隧道ID t3,並且請求PGW給自己的控制面和數據面分配隧道ID。
- PGW回復SGW說“創建會話成功”,使用自己的控制面隧道ID t2,回復里面攜帶着給SGW控制面分配的隧道ID t4和控制面的隧道ID t5,至此SGW和PGW直接的隧道建設完成。雙方請求對方,都要帶着對方給自己分配的隧道ID,從而標志是這個手機的請求。
- 接下來SGW回復MME說“創建會話成功”,使用自己的隧道ID t1訪問MME,回復里面有給MME分配隧道ID t6,也有SGW給eNodeB分配的隧道ID t7。
- 當MME發現后面的隧道都建設成功之后,就告訴eNodeB,“后面的隧道已經建設完畢,SGW給你分配的隧道ID是t7,你可以開始連上來了,但是你也要給SGW分配一個隧道ID”。
- eNodeB告訴MME自己給SGW分配一個隧道,ID為t8。
- MME將eNodeB給SGW分配的隧道ID t8告知SGW,從而前面的隧道也建設完畢。
這樣,手機就可以通過建立的隧道成功上網了。
異地上網問題
接下來我們考慮異地上網的事情。
為什么要分SGW和PGW呢,一個GW不可以嗎?SGW是你本地的運營商的設備,而PGW是你所屬的運營商的設備。
如果你在巴塞羅那,一下飛機,手機開機,周圍搜尋到的肯定是巴塞羅那的eNodeB。通過MME去查尋國內運營商的HSS,看你是否合法,是否還有錢。
如果允許上網,你的手機和巴塞羅那的SGW會建立一個隧道,然后巴塞羅那的SGW和國內運營商的PGW建立一個隧道,然后通過國內運營商的PGW上網。

這樣判斷你是否能上網的在國內運營商的HSS,控制你上網策略的是國內運營商的PCRF,給手機分配的IP地址也是國內運營商的PGW負責的,給手機分配的IP地址也是國內運營商里統計的。
運營商由於是在PGW里面統計的,這樣你的上網流量全部通過國內運營商即可,只不過巴塞羅那運營商也要和國內運營商進行流量結算。
由於你的上網策略是由國內運營商在PCRF中控制的,因而你還是上不了臉書。
總結
- 移動網絡的發展歷程從2G到3G,再到4G,逐漸從打電話的功能為主,向上網的功能為主轉變;
- 請記住4G網絡的結構,有eNodeB、MME、SGW、PGW等,分控制面協議和數據面協議,你可以對照着結構,試着說出手機上網的流程;
- 即便你在國外的運營商下上網,也是要通過國內運營商控制的,因而也上不了臉書。
