十八、数据中心

数据中心里面是服务器。服务器被放在一个个叫作机架(Rack)的架子上面。数据中心的入口和出口也是路由器,由于在数据中心的边界,就像在一个国家的边境,称为边界路由器(Border Router)。为了高可用,边界路由器会有多个。一般家里只会连接一个运营商的网络,而为了高可用, 为了当一个运营商出问题的时候,还可以通过另外一个运营商来提供服务,所以数据中心的边界路由器会连接多个运营商网络。

既然是路由器,就需要跑路由协议,数据中心往往就是路由协议中的自治区域(AS)。数据中心里面的机器要想访问外面的网站,数据中心里面也是有对外提供服务的机器,都可以通过 BGP 协议,获取内外互通的路由信息。这就是我们常听到的多线 BGP的概念。

交换机将这些服务器连接起来,可以互相通信。这些交换机往往是放在机架顶端的,所以经常称为TOR(Top OfRack)交换机。这一层的交换机常常称为接入层(Access Layer)。注意这个接入层和原来讲过的应用的接入层不是一个概念。
image.png
当一个机架放不下的时候,就需要多个机架,还需要有交换机将多个机架连接在一起。这些交换机对性能的要求更高,带宽也更大。这些交换机称为汇聚层交换机(AggregationLayer)。

数据中心里面的每一个连接都是需要考虑高可用的。这里首先要考虑的是,如果一台机器只有一个网卡,上面连着一个网线,接入到 TOR 交换机上。如果网卡坏了,或者不小心网线掉了,机器就上不去了。所以,需要至少两个网卡、两个网线插到 TOR 交换机上,但是两个网卡要工作得像一张网卡一样,这就是常说的网卡绑定(bond)。

这就需要服务器和交换机都支持一种协议LACP(Link Aggregation ControlProtocol)。它们互相通信,将多个网卡聚合称为一个网卡,多个网线聚合成一个网线,在网线之间可以进行负载均衡,也可以为了高可用作准备。
image.png
网卡有了高可用保证,但交换机还有问题。如果一个机架只有一个交换机,它挂了,那整个机架都不能上网了。因而 TOR 交换机也需要高可用,同理接入层和汇聚层的连接也需要高可用性,也不能单线连着。

最传统的方法是,部署两个接入交换机、两个汇聚交换机。服务器和两个接入交换机都连接,接入交换机和两个汇聚都连接,当然这样会形成环,所以需要启用 STP 协议,去除环,但是这样两个汇聚就只能一主一备了。STP 协议里我们学过,只有一条路会起作用。
image.png

交换机有一种技术叫作堆叠,所以另一种方法是,将多个交换机形成一个逻辑的交换机,服务器通过多根线分配连到多个接入层交换机上,而接入层交换机多根线分别连接到多个交换机上,并且通过堆叠的私有协议,形成双活的连接方式。
image.png
由于对带宽要钱求更大,而且挂了影响也更大,所以两个堆叠可能就不够了,可以就会有更多的,比如四个堆叠为一个逻辑的交换机。汇聚层将大量的计算节点相互连接在一起,形成一个集群。在这个集群里面,服务器之间通过二层互通,这个区域常称为一个POD(Point Of Delivery),有时候也称为一个可用区(Available Zone)。当节点数目再多的时候,一个可用区放不下,需要将多个可用区连在一起,连接多个可用区的交换机称为核心交换机。
image.png
核心交换机吞吐量更大,高可用要求更高,肯定需要堆叠,但是往往仅仅堆叠,不足以满足吞吐量,因而还是需要部署多组核心交换机。核心和汇聚交换机之间为了高可用,也是全互连模式的

这个时候还存在那个问题,出现环路怎么办?
一种方式是,不同的可用区在不同的二层网络,需要分配不同的网段。汇聚和核心之间通过三层网络互通的,二层都不在一个广播域里面,不会存在二层环路的问题。三层有环是没有问题的,只要通过路由协议选择最佳的路径就可以了。那为啥二层不能有环路,而三层可以呢?你可以回忆一下二层环路的情况。
image.png
如图,核心层和汇聚层之间通过内部的路由协议 OSPF,找到最佳的路径进行访问,而且还可以通过 ECMP 等价路由,在多个路径之间进行负载均衡和高可用。

但是随着数据中心里面的机器越来越多,尤其是有了云计算、大数据,集群规模非常大,而且都要求在一个二层网络里面。这就需要二层互连从汇聚层上升为核心层,也即在核心以下,全部是二层互连,全部在一个广播域里面,这就是常说的大二层。
image.png
但是随着数据中心里面的机器越来越多,尤其是有了云计算、大数据,集群规模非常大,而且都要求在一个二层网络里面。这就需要二层互连从汇聚层上升为核心层,也即在核心以下,全部是二层互连,全部在一个广播域里面,这就是常说的大二层。A如果大二层横向流量不大,核心交换机数目不多,可以做堆叠,但是如果横向流量很大,仅仅堆叠满足不了,就需要部署多组核心交换机,而且要和汇聚层进行全互连。由于堆叠只解决一个核心交换机组内的无环问题,而组之间全互连,还需要其他机制进行解决。如果是 STP,那部署多组核心无法扩大横向流量的能力,因为还是只有一组起作用。于是大二层就引入了TRILL(Transparent Interconnection of Lots of Link),即多链接透明互联协议。它的基本思想是,二层环有问题,三层环没有问题,那就把三层的路由能力模拟在二层实现。

运行 TRILL 协议的交换机称为RBridge,是具有路由转发特性的网桥设备,只不过这个路由是根据 MAC 地址来的,不是根据 IP 来的。
Rbridage 之间通过链路状态协议运作。记得这个路由协议吗?通过它可以学习整个大二层的拓扑,知道访问哪个 MAC 应该从哪个网桥走;还可以计算最短的路径,也可以通过等价的路由进行负载均衡和高可用性。
image.png
TRILL 协议在原来的 MAC 头外面加上自己的头,以及外层的 MAC 头。TRILL 头里面的Ingress RBridge,有点像 IP 头里面的源 IP 地址,Egress RBridge 是目标 IP 地址,这两个地址是端到端的,在中间路由的时候,不会发生改变。而外层的 MAC,可以有下一跳的Bridge,就像路由的下一跳,也是通过 MAC 地址来呈现的一样。

如图中所示的过程,有一个包要从主机 A 发送到主机 B,中间要经过 RBridge 1、RBridge2、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 广播,实现负载均衡和高可用。
image.png
核心交换机之外,就是边界路由器了。至此从服务器到数据中心边界的层次情况已经清楚了。在核心交换上面,往往会挂一些安全设备,例如入侵检测、DDoS 防护等等。这是整个数据中心的屏障,防止来自外来的攻击。核心交换机上往往还有负载均衡器,原理前面的章节已经说过了。

在有的数据中心里面,对于存储设备,还会有一个存储网络,用来连接 SAN 和 NAS。但是对于新的云计算来讲,往往不使用传统的 SAN 和 NAS,而使用部署在 x86 机器上的软件定义存储,这样存储也是服务器了,而且可以和计算节点融合在一个机架上,从而更加有效率,也就没有了单独的存储网络了。于是整个数据中心的网络如下图所示。
image.png
这是一个典型的三层网络结构。这里的三层不是指 IP 层,而是指接入层、汇聚层、核心层三层。这种模式非常有利于外部流量请求到内部应用。这个类型的流量,是从外到内或者从内到外,对应到上面那张图里,就是从上到下,从下到上,上北下南,所以称为南北流量。但是随着云计算和大数据的发展,节点之间的交互越来越多,例如大数据计算经常要在不同的节点将数据拷贝来拷贝去,这样需要经过交换机,使得数据从左到右,从右到左,左西右东,所以称为东西流量。

为了解决东西流量的问题,演进出了叶脊网络(Spine/Leaf)。
叶子交换机(leaf),直接连接物理服务器。L2/L3 网络的分界点在叶子交换机上,叶子交换机之上是三层网络。
脊交换机(spine switch),相当于核心交换机。叶脊之间通过 ECMP 动态选择多条路径。脊交换机现在只是为叶子交换机提供一个弹性的 L3 路由网络。南北流量可以不用直接从脊交换机发出,而是通过与 leaf 交换机并行的交换机,再接到边界路由器出去。
image.png
传统的三层网络架构是垂直的结构,而叶脊网络架构是扁平的结构,更易于水平扩展。

十九、VVCPPNN

数据中心,里面很复杂,但是有的公司有多个数据中心,需要将多个数据中

心连接起来,或者需要办公室和数据中心连接起来。这该怎么办呢?

  1. 走公网,但是公网太不安全,你的隐私可能会被别人偷窥。
  2. 租用专线的方式把它们连起来,这是土豪的做法,需要花很多钱。‘’3. 用 VVCPPNN 来连接,这种方法比较折中,安全又不贵。

image.png
VVCPPNN,全名Virtual Private Network,虚拟专用网,就是利用开放的公众网络,建立专用数据传输通道,将远程的分支机构、移动办公人员等连接起来。

VVCPPNN 是如何工作的?
VVCPPNN 通过隧道技术在公众网络上仿真一条点到点的专线,是通过利用一种协议来传输另外一种协议的技术,这里面涉及三种协议:乘客协议、隧道协议和承载协议。我们以 IPsec 协议为例来说明。
image.png
你知道如何通过自驾进行海南游吗?这其中,你的车怎么通过琼州海峡呢?这里用到轮渡,其实这就用到隧道协议。
在广州这边开车是有“协议”的,例如靠右行驶、红灯停、绿灯行,这个就相当于“被封装”的乘客协议。当然在海南那面,开车也是同样的协议。这就相当于需要连接在一起的一个公司的两个分部。

你知道如何通过自驾进行海南游吗?这其中,你的车怎么通过琼州海峡呢?这里用到轮渡,其实这就用到隧道协议。
在广州这边开车是有“协议”的,例如靠右行驶、红灯停、绿灯行,这个就相当于“被封装”的乘客协议。当然在海南那面,开车也是同样的协议。这就相当于需要连接在一起的一个公司的两个分部。但是在海上坐船航行,也有它的协议,例如要看灯塔、要按航道航行等。这就是外层的承载协议。那我的车如何从广州到海南呢?这就需要你遵循开车的协议,将车开上轮渡,所有通过轮渡的车都关在船舱里面,按照既定的规则排列好,这就是隧道协议。在大海上,你的车是关在船舱里面的,就像在隧道里面一样,这个时候内部的乘客协议,也即驾驶协议没啥用处,只需要船遵从外层的承载协议,到达海南就可以了。到达之后,外部承载协议的任务就结束了,打开船舱,将车开出来,就相当于取下承载协议和隧道协议的头。接下来,在海南该怎么开车,就怎么开车,还是内部的乘客协议起作用。

在最前面的时候说了,直接使用公网太不安全,所以接下来我们来看一种十分安全的VVCPPNN,IPsec VVCPPNN。这是基于 IP 协议的安全隧道协议,为了保证在公网上面信息的安全,因而采取了一定的机制保证安全性。

  1. 私密性,防止信息泄漏给未经授权的个人,通过加密把数据从明文变成无法读懂的密文,从而确保数据的私密性。前面讲 HTTPS 的时候,说过加密可以分为对称加密和非对称加密。对称加密速度快一些。而 VVCPPNN 一旦建立,需要传输大量数据,因而我们采取对称加密。但是同样,对称加密还是存在加密秘钥如何传输的问题,这里需要用到因特网密钥交换(IKE,InternetKey Exchange)协议。
  2. 完整性,数据没有被非法篡改,通过对数据进行 hash 运算,产生类似于指纹的数据摘要,以保证数据的完整性。
  3. 真实性,数据确实是由特定的对端发出,通过身份认证可以保证数据的真实性。

那如何保证对方就是真正的那个人呢?
第一种方法就是预共享密钥,也就是双方事先商量好一个暗号,比如“天王盖地虎,宝塔镇河妖”,对上了,就说明是对的。
另外一种方法就是用数字签名来验证。咋签名呢?当然是使用私钥进行签名,私钥只有我自己有,所以如果对方能用我的数字证书里面的公钥解开,就说明我是我。

基于以上三个特性,组成了IPsec VVCPPNN 的协议簇。这个协议簇内容比较丰富。
image.png
在这个协议簇里面,有两种协议,这两种协议的区别在于封装网络包的格式不一样。
一种协议称为AH(Authentication Header),只能进行数据摘要 ,不能实现数据加密。还有一种ESP(Encapsulating Security Payload),能够进行数据加密和数据摘要。

在这个协议簇里面,还有两类算法,分别是加密算法和摘要算法。

这个协议簇还包含两大组件,一个用于 VVCPPNN 的双方要进行对称密钥的交换的IKE 组件,另一个是 VVCPPNN 的双方要对连接进行维护的SA(Security Association)组件

IPsec VVCPPNN 的建立过程

下面来看 IPsec VVCPPNN 的建立过程,这个过程分两个阶段。
第一个阶段,建立 IKE 自己的 SA。这个 SA 用来维护一个通过身份认证和安全保护的通道,为第二个阶段提供服务。在这个阶段,通过 DH(Diffie-Hellman)算法计算出一个对称密钥 K。

DH 算法是一个比较巧妙的算法。客户端和服务端约定两个公开的质数 p 和 q,然后客户端随机产生一个数 a 作为自己的私钥,服务端随机产生一个 b 作为自己的私钥,客户端可以根据 p、q 和 a 计算出公钥 A,服务端根据 p、q 和 b 计算出公钥 B,然后双方交换公钥A 和 B。

到此客户端和服务端可以根据已有的信息,各自独立算出相同的结果 K,就是对称密钥。但是这个过程,对称密钥从来没有在通道上传输过,只传输了生成密钥的材料,通过这些材料,截获的人是无法算出的。
image.png
有了这个对称密钥 K,接下来是第二个阶段,建立 IPsec SA。在这个 SA 里面,双方会生成一个随机的对称密钥 M,由 K 加密传给对方,然后使用 M 进行双方接下来通信的数据。对称密钥 M 是有过期时间的,会过一段时间,重新生成一次,从而防止被破解。
IPsec SA 里面有以下内容:

  1. SPI(Security Parameter Index),用于标识不同的连接;
  2. 双方商量好的加密算法、哈希算法和封装模式;
  3. 生存周期,超过这个周期,就需要重新生成一个 IPsec SA,重新生成对称密钥。

image.png
当 IPsec 建立好,接下来就可以开始打包封装传输了。
image.png
左面是原始的 IP 包,在 IP 头里面,会指定上一层的协议为 TCP。ESP 要对 IP 包进行封装,因而 IP 头里面的上一层协议为 ESP。在 ESP 的正文里面,ESP 的头部有双方商讨好的SPI,以及这次传输的序列号。

接下来全部是加密的内容。可以通过对称密钥进行解密,解密后在正文的最后,指明了里面的协议是什么。如果是 IP,则需要先解析 IP 头,然后解析 TCP 头,这是从隧道出来后解封装的过程。

有了 IPsec VVCPPNN 之后,客户端发送的明文的 IP 包,都会被加上 ESP 头和 IP 头,在公网上传输,由于加密,可以保证不被窃取,到了对端后,去掉 ESP 的头,进行解密。
image.png
这种点对点的基于 IP 的 VVCPPNN,能满足互通的要求,但是速度往往比较慢,这是由底层 IP协议的特性决定的。IP 不是面向连接的,是尽力而为的协议,每个 IP 包自由选择路径,到每一个路由器,都自己去找下一跳,丢了就丢了,是靠上一层 TCP 的重发来保证可靠性。
image.png

因为 IP 网络从设计的时候,就认为是不可靠的,所以即使同一个连接,也可能选择不同的道路,这样的好处是,一条道路崩溃的时候,总有其他的路可以走。当然,带来的代价就是,不断的路由查找,效率比较差。

和 IP 对应的另一种技术称为 ATM。这种协议和 IP 协议的不同在于,它是面向连接的。你可以说 TCP 也是面向连接的啊。这两个不同,ATM 和 IP 是一个层次的,和 TCP 不是一个层次的。

另外,TCP 所谓的面向连接,是不停地重试来保证成功,其实下层的 IP 还是不面向连接的,丢了就丢了。ATM 是传输之前先建立一个连接,形成一个虚拟的通路,一旦连接建立了,所有的包都按照相同的路径走,不会分头行事。
image.png
好处是不需要每次都查路由表的,虚拟路径已经建立,打上了标签,后续的包傻傻的跟着走就是了,不用像 IP 包一样,每个包都思考下一步怎么走,都按相同的路径走,这样效率会高很多。

但是一旦虚拟路径上的某个路由器坏了,则这个连接就断了,什么也发不过去了,因为其他的包还会按照原来的路径走,都掉坑里了,它们不会选择其他的路径走。ATM 技术虽然没有成功,但其屏弃了繁琐的路由查找,改为简单快速的标签交换,将具有全局意义的路由表改为只有本地意义的标签表,这些都可以大大提高一台路由器的转发功力。

有没有一种方式将两者的优点结合起来呢?这就是多协议标签交换(MPLS,Multi-Protocol Label Switching)。MPLS 的格式如图所示,在原始的 IP 头之外,多了 MPLS的头,里面可以打标签。
image.png
在二层头里面,有类型字段,0x0800 表示 IP,0x8847 表示 MPLS Label。

在 MPLS 头里面,首先是标签值占 20 位,接着是 3 位实验位,再接下来是 1 位栈底标志位,表示当前标签是否位于栈底了。这样就允许多个标签被编码到同一个数据包中,形成标签栈。最后是 8 位 TTL 存活时间字段,如果标签数据包的出发 TTL 值为 0,那么该数据包在网络中的生命期被认为已经过期了。

有了标签,还需要设备认这个标签,并且能够根据这个标签转发,这种能够转发标签的路由器称为标签交换路由器(LSR,Label Switching Router)。

这种路由器会有两个表格,一个就是传统的 FIB,也即路由表,另一个就是 LFIB,标签转发表。有了这两个表,既可以进行普通的路由转发,也可以进行基于标签的转发。
image.png
有了标签转发表,转发的过程如图所示,就不用每次都进行普通路由的查找了。

这里我们区分 MPLS 区域和非 MPLS 区域。在 MPLS 区域中间,使用标签进行转发,非MPLS 区域,使用普通路由转发,在边缘节点上,需要有能力将对于普通路由的转发,变成对于标签的转发。

例如图中要访问 114.1.1.1,在边界上查找普通路由,发现马上要进入 MPLS 区域了,进去了对应标签 1,于是在 IP 头外面加一个标签 1,在区域里面,标签 1 要变成标签 3,标签3 到达出口边缘,将标签去掉,按照路由发出。

这样一个通过标签转换而建立的路径称为 LSP,标签交换路径。在一条 LSP 上,沿数据包传送的方向,相邻的 LSR 分别叫上游 LSR(upstream LSR)和下游 LSR(downstreamLSR)。有了标签,转发是很简单的事,但是如何生成标签,却是 MPLS 中最难修炼的部分。在MPLS 秘笈中,这部分被称为LDP(Label Distribution Protocol),是一个动态的生成标签的协议。

其实 LDP 与 IP 帮派中的路由协议十分相像,通过 LSR 的交互,互相告知去哪里应该打哪个标签,称为标签分发,往往是从下游开始的。
image.png
如果有一个边缘节点发现自己的路由表中出现了新的目的地址,它就要给别人说,我能到达一条新的路径了。

如果此边缘节点存在上游 LSR,并且尚有可供分配的标签,则该节点为新的路径分配标签,并向上游发出标签映射消息,其中包含分配的标签等信息。收到标签映射消息的 LSR 记录相应的标签映射信息,在其标签转发表中增加相应的条目。此 LSR 为它的上游 LSR 分配标签,并继续向上游 LSR 发送标签映射消息。当入口 LSR 收到标签映射消息时,在标签转发表中增加相应的条目。这时,就完成了 LSP的建立。有了标签,转发轻松多了,但是这个和 VVCPPNN 什么关系呢?可以想象,如果我们 VVCPPNN 通道里面包的转发,都是通过标签的方式进行,效率就会高很多。所以要想个办法把 MPLS 应用于 VVCPPNN。
image.png
在 MPLS VVCPPNN 中,网络中的路由器分成以下几类:
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 协议,既然 VVCPPNN 将两个数据中心连起来,应该看起来像一个数据中心一样,那么如何到达另一端需要通过 BGP 将路由广播过去,传统 BGP 无法正确处理地址空间重叠的 VVCPPNN 的路由。

假设机构 A 和机构 B 都使用了 192.168.101.0/24 网段的地址,并各自发布了一条去往此网段的路由,BGP 将只会选择其中一条路由,从而导致去往另一个 VVCPPNN 的路由丢失。所以 PE 路由器之间使用特殊的 MP-BGP 来发布 VVCPPNN 路由,在相互沟通的消息中,在一般 32 位 IPv4 的地址之前加上一个客户标示的区分符用于客户地址的区分,这种称为VVCPPNN-IPv4 地址族,这样 PE 路由器会收到如下的消息,机构 A 的 192.168.101.0/24 应该往这面走,机构 B 的 192.168.101.0/24 则应该去另外一个方向。

另外困惑的是路由表,当两个客户的 IP 包到达 PE 的时候,PE 就困惑了,因为网段是重复的。如何区分哪些路由是属于哪些客户 VVCPPNN 内的?如何保证 VVCPPNN 业务路由与普通路由不相互干扰?PE(Provider Edge):运营商网络与客户网络相连的边缘网络设备;CE(Customer Edge):客户网络与 PE 相连接的边缘设备;P(Provider):这里特指运营商网络中除 PE 之外的其他运营商网络设备。
在 PE 上,可以通过 VRF(VVCPPNN Routing&Forwarding Instance)建立每个客户一个路由表,与其它 VVCPPNN 客户路由和普通路由相互区分。可以理解为专属于客户的小路由器。远端 PE 通过 MP-BGP 协议把业务路由放到近端 PE,近端 PE 根据不同的客户选择出相关客户的业务路由放到相应的 VRF 路由表中。

VVCPPNN 报文转发采用两层标签方式:
第一层(外层)标签在骨干网内部进行交换,指示从 PE 到对端 PE 的一条 LSP。VVCPPNN 报文利用这层标签,可以沿 LSP 到达对端 PE;
第二层(内层)标签在从对端 PE 到达 CE 时使用,在 PE 上,通过查找 VRF 表项,指示报文应被送到哪个 VVCPPNN 用户,或者更具体一些,到达哪一个 CE。这样,对端 PE 根据内层标签可以找到转发报文的接口。
image.png
我们来举一个例子,看 MPLS VVCPPNN 的包发送过程。

  1. 机构 A 和机构 B 都发出一个目的地址为 192.168.101.0/24 的 IP 报文,分别由各自的CE 将报文发送至 PE。
  2. PE 会根据报文到达的接口及目的地址查找 VVCPPNN 实例表项 VRF,匹配后将报文转发出去,同时打上内层和外层两个标签。假设通过 MP-BGP 配置的路由,两个报文在骨干网走相同的路径。
  3. MPLS 网络利用报文的外层标签,将报文传送到出口 PE,报文在到达出口 PE 2 前一跳时已经被剥离外层标签,仅含内层标签。
  4. 出口 PE 根据内层标签和目的地址查找 VVCPPNN 实例表项 VRF,确定报文的出接口,将报文转发至各自的 CE。
  5. CE 根据正常的 IP 转发过程将报文传送到目的地。

二十、移动网络

移动网络的发展历程

2G 网络

手机本来是用来打电话的,不是用来上网的,所以原来在 2G 时代,上网使用的不是 IP 网络,而是电话网络,走模拟信号,专业名称为公共交换电话网(PSTN,Public SwitchedTelephone Network)。

那手机不连网线,也不连电话线,它是怎么上网的呢?
手机是通过收发无线信号来通信的,专业名称是 Mobile Station,简称 MS,需要嵌入SIM。手机是客户端,而无线信号的服务端,就是基站子系统(BSS,Base StationSubsystemBSS)。至于什么是基站,你可以回想一下,你在爬山的时候,是不是看到过信号塔?我们平时城市里面的基站比较隐蔽,不容易看到,所以只有在山里才会注意到。正是这个信号塔,通过无线信号,让你的手机可以进行通信。

无论无线通信如何无线,最终还是要连接到有线的网络里。
因而,基站子系统分两部分,一部分对外提供无线通信,叫作基站收发信台(BTS,Base Transceiver Station),另一部分对内连接有线网络,叫作基站控制器(BSC,Base Station Controller)。基站收发信台通过无线收到数据后,转发给基站控制器。这部分属于无线的部分,统称为无线接入网(RAN,Radio Access Network)。

基站控制器通过有线网络,连接到提供手机业务的运营商的数据中心,这部分称为核心网(CN,Core Network)。核心网还没有真的进入互联网,这部分还是主要提供手机业务,是手机业务的有线部分。

首先接待基站来的数据的是移动业务交换中心(MSC,Mobile Service SwitchingCenter),它是进入核心网的入口,但是它不会让你直接连接到互联网上。因为在让你的手机真正进入互联网之前,提供手机业务的运营商,需要认证是不是合法的手机接入。别你自己造了一张手机卡,就连接上来。鉴权中心(AUC,AuthenticationCenter)和设备识别寄存器(EIR,Equipment Identity Register)主要是负责安全性的。

另外,需要看你是本地的号,还是外地的号,这个牵扯到计费的问题,异地收费还是很贵的。访问位置寄存器(VLR,Visit Location Register)是看你目前在的地方,归属位置寄存器(HLR,Home Location Register)是看你的号码归属地。

当你的手机卡既合法又有钱的时候,才允许你上网,这个时候需要一个网关,连接核心网和真正的互联网。网关移动交换中心(GMSC ,Gateway Mobile Switching Center)就是干这个的,然后是真正的互连网。在 2G 时代,还是电话网络 PSTN。数据中心里面的这些模块统称为网络子系统(NSS,Network and Switching Subsystem)。

image.png
因而 2G 时代的上网如图所示,总结一下:
手机通过无线信号连接基站;
基站一面朝前接无线,一面朝后接核心网;
核心网一面朝前接到基站请求,一是判断你是否合法,二是判断你是不是本地号,还有没有钱,一面通过网关连接电话网络。

2.5G 网络

后来从 2G 到了 2.5G,也即在原来电路交换的基础上,加入了分组交换业务,支持 Packet的转发,从而支持 IP 网络。在上述网络的基础上,基站一面朝前接无线,一面朝后接核心网。在朝后的组件中,多了一个分组控制单元(PCU,Packet Control Unit),用以提供分组交换通道。在核心网里面,有个朝前的接待员(SGSN,Service GPRS Supported Node)和朝后连接 IP 网络的网关型 GPRS 支持节点(GGSN,Gateway GPRS Supported Node)。

image.png

3G 网络

到了 3G 时代,主要是无线通信技术有了改进,大大增加了无线的带宽。
以 W-CDMA 为例,理论最高 2M 的下行速度,因而基站改变了,一面朝外的是 Node B,一面朝内连接核心网的是无线网络控制器(RNC,Radio Network Controller)。核心网以及连接的 IP 网络没有什么变化。
image.png

4G 网络

基站为 eNodeB,包含了原来 NodeB 和 RNC 的功能,下行速度向百兆级别迈进。另外,核心网实现了控制面和数据面的分离,这个怎么理解呢?

在前面的核心网里面,有接待员 MSC 或者 SGSN,你会发现检查是否合法是它负责,转发数据也是它负责,也即控制面和数据面是合二为一的,这样灵活性比较差,因为控制面主要是指令,多是小包,往往需要高的及时性;数据面主要是流量,多是大包,往往需要吞吐量。于是有了下面这个架构。
image.png
HSS 用于存储用户签约信息的数据库,其实就是你这个号码归属地是哪里的,以及一些认证信息。MME 是核心控制网元,是控制面的核心,当手机通过 eNodeB 连上的时候,MME 会根据 HSS 的信息,判断你是否合法。如果允许连上来,MME 不负责具体的数据的流量,而是 MME 会选择数据面的 SGW 和 PGW,然后告诉 eNodeB,我允许你连上来了,你连接它们吧。

于是手机直接通过 eNodeB 连接 SGW,连上核心网,SGW 相当于数据面的接待员,并通过 PGW 连到 IP 网络。PGW 就是出口网关。在出口网关,有一个组件 PCRF,称为策略和计费控制单元,用来控制上网策略和流量的计费。

4G 网络协议解析

image.png

控制面协议

其中虚线部分是控制面的协议。当一个手机想上网的时候,先要连接 eNodeB,并通过S1-MME 接口,请求 MME 对这个手机进行认证和鉴权。S1-MME 协议栈如下图所示。
image.png
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,还有序列号。
image.png
通过序列号,不用 TCP,GTP-C 自己就可以实现可靠性,为每个输出信令消息分配一个依次递增的序列号,以确保信令消息的按序传递,并便于检测重复包。对于每个输出信令消息启动定时器,在定时器超时前未接收到响应消息则进行重发。

数据面协议

当两个隧道都打通,接在一起的时候,PGW 会给手机分配一个 IP 地址,这个 IP 地址是隧道内部的 IP 地址,可以类比为 IPsec 协议里面的 IP 地址。这个 IP 地址是归手机运营商管理的。然后,手机可以使用这个 IP 地址,连接 eNodeB,从 eNodeB 经过 S1-U 协议,通过第一段隧道到达 SGW,再从 SGW 经过 S8 协议,通过第二段隧道到达 PGW,然后通过 PGW 连接到互联网。数据面的协议都是通过 GTP-U,如图所示。
image.png
手机每发出的一个包,都由 GTP-U 隧道协议封装起来,格式如下:
image.png
和 IPsec 协议很类似,分为乘客协议、隧道协议、承载协议。其中乘客协议是手机发出来的包,IP 是手机的 IP,隧道协议里面有隧道 ID,不同的手机上线会建立不同的隧道,因而需要隧道 ID 来标识。承载协议的 IP 地址是 SGW 和 PGW 的 IP 地址。

手机上网流程

接下来,我们来看一个手机开机之后上网的流程,这个过程称为Attach。可以看出来,移动网络还是很复杂的。因为这个过程要建立很多的隧道,分配很多的隧道 ID,所以我画了一个图来详细说明这个过程。
image.png

  1. 手机开机以后,在附近寻找基站 eNodeB,找到后给 eNodeB 发送 Attach Request,说“我来啦,我要上网”。
  2. eNodeB 将请求发给 MME,说“有个手机要上网”。
  3. MME 去请求手机,一是认证,二是鉴权,还会请求 HSS 看看有没有钱,看看是在哪里上网。
  4. 当 MME 通过了手机的认证之后,开始分配隧道,先告诉 SGW,说要创建一个会话(Create Session)。在这里面,会给 SGW 分配一个隧道 ID t1,并且请求 SGW 给自己也分配一个隧道 ID。
  5. SGW 转头向 PGW 请求建立一个会话,为 PGW 的控制面分配一个隧道 ID t2,也给PGW 的数据面分配一个隧道 ID t3,并且请求 PGW 给自己的控制面和数据面分配隧道ID。
  6. PGW 回复 SGW 说“创建会话成功”,使用自己的控制面隧道 ID t2,回复里面携带着给 SGW 控制面分配的隧道 ID t4 和控制面的隧道 ID t5,至此 SGW 和 PGW 直接的隧道建设完成。双方请求对方,都要带着对方给自己分配的隧道 ID,从而标志是这个手机的请求。
  7. 接下来 SGW 回复 MME 说“创建会话成功”,使用自己的隧道 ID t1 访问 MME,回复里面有给 MME 分配隧道 ID t6,也有 SGW 给 eNodeB 分配的隧道 ID t7。
  8. 当 MME 发现后面的隧道都建设成功之后,就告诉 eNodeB,“后面的隧道已经建设完毕,SGW 给你分配的隧道 ID 是 t7,你可以开始连上来了,但是你也要给 SGW 分配一个隧道 ID”。
  9. eNodeB 告诉 MME 自己给 SGW 分配一个隧道,ID 为 t8。
  10. MME 将 eNodeB 给 SGW 分配的隧道 ID t8 告知 SGW,从而前面的隧道也建设完毕。

异地上网问题

为什么要分 SGW 和 PGW 呢,一个 GW 不可以吗?SGW 是你本地的运营商的设备,而PGW 是你所属的运营商的设备。如果你在巴塞罗那,一下飞机,手机开机,周围搜寻到的肯定是巴塞罗那的 eNodeB。通过 MME 去查寻国内运营商的 HSS,看你是否合法,是否还有钱。如果允许上网,你的手机和巴塞罗那的 SGW 会建立一个隧道,然后巴塞罗那的 SGW 和国内运营商的 PGW 建立一个隧道,然后通过国内运营商的 PGW 上网。
image.png
这样判断你是否能上网的在国内运营商的 HSS,控制你上网策略的是国内运营商的 PCRF,给手机分配的 IP 地址也是国内运营商的 PGW 负责的,给手机分配的 IP 地址也是国内运营商里统计的。运营商由于是在 PGW 里面统计的,这样你的上网流量全部通过国内运营商即可,只不过巴塞罗那运营商也要和国内运营商进行流量结算。由于你的上网策略是由国内运营商在 PCRF 中控制的,因而你还是上不了脸书。


拿骚的莫里斯
25 声望4 粉丝