以網購下單爲例詳細串講碎片的網絡協議(上)

網購下單在我們手中簡單的一步操作,在互聯網世界真正要完成這個動作,過程其實很繁雜,這裏把這個過程分爲十個階段,從雲平臺中搭建一個帶你上開始,到 BGP 路由廣播,再到 DNS 域名解析,從客戶看商品圖片,到最終下單的整個過程,每一步會詳細說明。

1. 部署一個高可用高併發的電商平臺

首先,咱們要有個電商平臺。假設已經有了一個特別大的電商平臺,這個平臺應該部署在哪里呢?若我們用公有云,一般公有云會有多個位置,比如在華東、華北、華南都有。畢竟咱們的電商是要服務全國的,當然到處都要部署了。我們把主站點放在華東。
在這裏插入圖片描述
爲了每個點都能有,也爲了高可用性,往往需要有多個機房,形成多個可用區(Available Zone)。由於咱們的應用是分佈在兩個可用區的,所以假如任何一個可用區掛了,都不會受影響。每個可用區數據中心里有一片一片的機櫃,每個機櫃上有一排一排的服務器,每個機櫃都有一個接入交換機,有一個匯聚交換機將多個機櫃連在一起。這些服務器里面部署的都是計算節點,每臺上面都有 Open vSwitch 創建的虛擬交換機,將來在這臺機器上創建的虛擬機,都會連到 Open vSwitch 上。
在這裏插入圖片描述
接下來,在雲計算的界面上創建一個 VPC(Virtual Private Cloud,虛擬私有網絡),指定一個 IP 段,這樣以後部署的所有應用都會在這個虛擬網絡里,使用你分配的這個 IP 段。爲了不同的 VPC 相互隔離,每個 VPC 都會被分配一個 VXLAN 的 ID。儘管不同用戶的虛擬機有可能在同一個物理機上,但是不同的 VPC 二層壓根兒是不通的。

由於有兩個可用區,在這個 VPC 里面,要爲每一個可用區分配一個 Subnet,也就是在大的網段里分配兩個小的網段。當兩個可用區里面網段不同的時候,就可以配置路由策略,訪問另外一個可用區,走某一條路由了。

接下來,應該創建數據庫持久化層。大部分雲平臺都會提供 PaaS 服務,也就是說,不需要你自己搭建數據庫,而是採用直接提供數據庫的服務,並且單機房的主備切換都是默認做好的,數據庫也是部署在虛擬機里面的,只不過從界面上,你看不到數據庫所在的虛擬機而已。

雲平臺會給每個 Subnet 的數據庫實例分配一個域名。創建數據庫實例的時候,需要你指定可用區和 Subnet,這樣創建出來的數據庫實例可以通過這個 Subnet 的私網 IP 進行訪問。

爲了分庫分表實現高併發的讀寫,在創建的多個數據庫實例之上,會創建一個分佈式數據庫的實例,也需要指定可用區和 Subnet,還會爲分佈式數據庫分配一個私網 IP 和域名。

對於數據庫這種高可用性比較高的,需要進行跨機房高可用,因而兩個可用區都要部署一套,但是隻有一個是主,另外一個是備,雲平臺往往會提供數據庫同步工具,將應用寫入主的數據同步給備數據庫集羣。

接下來是創建緩存集羣。雲平臺也會提供 PaaS 服務,也需要每個可用區和 Subnet 創建一套,緩存的數據在內存中,由於讀寫性能要求高,一般不要求跨可用區讀寫。

再往上層就是部署咱們自己寫的程序了。基礎服務層、組合服務層、Controller 層,以及 Nginx 層、API 網關等等,這些都是部署在虛擬機里面的。它們之間通過 RPC 相互調用,需要到註冊中心進行註冊。

它們之間的網絡通信是虛擬機和虛擬機之間的。如果是同一臺物理機,則那臺物理機上的 OVS就能轉發過去;如果是不同的物理機,這臺物理機的 OVS 和另一臺物理機的 OVS 中間有一個 VXLAN 的隧道,將請求轉發過去。

再往外就是負載均衡了,負載均衡也是雲平臺提供的 PaaS 服務,也是屬於某個 VPC 的,部署在虛擬機里面的,但是負載均衡有個外網的 IP,這個外網的 IP 地址就是在網關節點的外網網口上的。在網關節點上,會有 NAT 規則,將外網 IP 地址轉換爲 VPC 里面的私網 IP 地址,通過這些私網 IP 地址訪問到虛擬機上的負載均衡節點,然後通過負載均衡節點轉發到 API 網關的節點。

網關節點的外網網口是帶公網 IP 地址的,里面有一個虛擬網關轉發模塊,還會有一個 OVS,將私網 IP 地址放到 VXLAN 隧道里面,轉發到虛擬機上,從而實現外網和虛擬機網絡之間的互通。

不同的可用區之間,通過核心交換機連在一起,核心交換機之外是邊界路由器。

在華北、華東、華南同樣也部署了一整套,每個地區都創建了 VPC,這就需要有一種機制將VPC 連接到一起。雲平臺一般會提供硬件的 VPC 互連的方式,當然也可以使用軟件互連的方式,也就是使用 v*n 網關,通過 IPsec v*n 將不同地區的不同 VPC 通過 v*n 連接起來。

對於不同地區和不同運營商的用戶,我們希望他能夠就近訪問到網站,而且當一個點出了故障之後,我們希望能夠在不同的地區之間切換,這就需要有智能 DNS,這個也是雲平臺提供的。對於一些靜態資源,可以保持在對象存儲里面,通過 CDN 下發到邊緣節點,這樣客戶端就能儘快加載出來。

2. 大聲告訴全世界,可以來這裏買東西

當帶你上應用搭建完畢之後,接下來需要將如何讓訪問到這個電商網站廣播給全網。
剛纔那張圖畫的是一個可用區的情況,對於多個可用區的情況,我們可以隱去計算節點的情況,將外網訪問區域放大。
在這裏插入圖片描述
外網 IP 是放在虛擬網關的外網網口上的,這個 IP 如何上全世界知道呢?通過 BGP 路由協議。

在覈心交換外面是安全設備,然後就是邊界路由器。邊界路由器會和多個運營商連接,從而每個運營商都能夠訪問到這個網站。邊界路由器可以通過 BGP 協議,將自己數據中心里面的外網 IP向外廣播,也就是告訴全世界,如果要訪問這些外網 IP,都來我這里。

每個運營商也有很多的路由器、很多的點,於是就可以將如何到達這些 IP 地址的路由信息,廣播到全國乃至全世界。

3. 打開手機來上網,域名解析得地址

這個時候,不但你的這個網站的 IP 地址全世界都知道了,你打的廣告可能大家也都看到了,於是有客戶下載 App 來買東西了。
在這裏插入圖片描述
客戶的手機開機以後,在附近尋找基站 eNodeB,發送請求,申請上網。基站將請求發給
MME,MME 對手機進行認證和鑑權,還會請求 HSS 看有沒有錢,看看是在哪里上網。

當 MME 通過了手機的認證之後,開始建立隧道,建設的數據通路分兩段路,其實是兩個隧道。一段是從 eNodeB 到 SGW,第二段是從 SGW 到 PGW,在 PGW 之外,就是互聯網。

PGW 會爲手機分配一個 IP 地址,手機上網都是帶着這個 IP 地址的。

當在手機上面打開一個 App 的時候,首先要做的事情就是解析這個網站的域名。

在手機運營商所在的互聯網區域里,有一個本地的 DNS,手機會向這個 DNS 請求解析 DNS。當這個 DNS 本地有緩存,則直接返回;如果沒有緩存,本地 DNS 才需要遞歸地從根 DNS 服務器,查到.com 的頂級域名服務器,最終查到權威 DNS 服務器。

如果你使用雲平臺的時候,配置了智能 DNS 和全局負載均衡,在權威 DNS 服務中,一般是通過配置 CNAME 的方式,我們可以起一個別名,例如 vip.yourcomany.com ,然後告訴本地DNS 服務器,讓它請求 GSLB 解析這個域名,GSLB 就可以在解析這個域名的過程中,通過自己的策略實現負載均衡。

GSLB 通過查看請求它的本地 DNS 服務器所在的運營商和地址,就知道用戶所在的運營商和地址,然後將距離用戶位置比較近的 Region 里面,三個負載均衡 SLB 的公網 IP 地址,返回給本地 DNS 服務器。本地 DNS 解析器將結果緩存後,返回給客戶端。

對於手機 App 來說,可以繞過剛纔的傳統 DNS 解析機制,直接只要 HTTPDNS 服務,通過直接調用 HTTPDNS 服務器,得到這三個 SLB 的公網 IP 地址。

看,經過了如此複雜的過程,也剛剛得到 IP 地址,包還沒發呢?話說手機 App 拿到了公網 IP 地址,接下來應該做什麼呢?