网络层里分为两层: Control Plane 和 Data Plane,之前我有篇博客是写 Data Plane 的,这篇就写写 Control Plane 吧。先来说说这两个 Plane 是啥。
- Data Plane 一般用来将路由器里的包从 Input 送到 Output,这个过程叫做 Forwarding。
- Control Plane 用于将包从一个路由器发到另一个路由器,这个过程叫做 Routing。
而如何去管理,构建 Control Plane 是个非常重要的问题,因为它牵涉到如何将包从一个路由器发到另一个路由器,这也是本篇文章的重点内容。
Per-Router 构建法
什么是 Per-Router 呢?就是在每个路由器里都算出路由表,以此作为基础发信息。比如从要从北京发到广州,其中要经过杭州,上海,厦门,那么这些城市都要自己去算一张路由表。信息从这些“中间”城市经过时就会去看这个路由表,来确定下一站要去哪。
但这种方法有个大问题,2,3个路由器好说,全球几十亿个路由器,每个路由器都要存一张到所有路由器的表那不是存数据存爆炸了?还有啊,每个路由器之间是要互相交换信息的,如果数据要共享那交换数据就跟下载 4K 视频差不多了。
要解决这个问题,我们可以想想一个国家是怎么治理地区的——分治法!想想新疆和西藏这些自治区,都是自己管理自己的。所以网络世界多了一个名词——Autonomous System,简写为 AS。
我们将路由器分在不同的 AS 里,每个 AS 去管理自己的路由器,那么路由器存的数据也就是 AS 里所有路由器的数据了,数据量一下子就减少了很多!
Autonomous System
每个 Autonomous System 都会有自己的 ID,也叫做 ASN (Autonomous System Number),一般为 16~32 位。下面就是 AS 的一个例子。
先来介绍一下 AS 里的术语:
- Local Traffic: 起点路由器到终点路由器的信息传输。
- Transit Traffic: 这种传输会被别的 AS 传递到下一个 AS。
- Transit AS: 这种 AS 可以传递 Transit Traffic 到下一个 AS。
- Stub AS: Stub 英文就是根,所以这种类型的 AS 一般是叶子节点,一般只和一个 AS 有连接,而且只有 Local Traffic。
- Multihomed Stub AS: 这种 AS 会连接多个 AS,但是只能有 Local Trafic。
上面的图中 AS1 是 Multi-homed stub,AS3 和 AS4 是 Transit AS,AS2 和 AS5 是 Stub AS。
AS 相关协议
AS 就相当于将大堆路由器分成很多小堆,所以 AS 之间沟通本质上也是路由器在沟通,不同的是沟通的路由器在不同的 AS 里。这些路由器就像是外交大使一样,而外交大使一般要求会别国的语言吧,这些“别国的语言”在这里就是协议。
AS 的协议分成两种:
- Interior Gateway Protocol: 简写成 IGP,其实是一系列协议的统称,如 RIP,OSPF 等,这些协议主要是用来告诉 AS 里面路由器如何将包发到别的 AS,或者其他 AS 的信息。
- Exterior Gateway Protocol: 简写成 EGP,这也是一系列协议的统称,在这些协议中 BGP (Border Gateway Protocol) 是用的最多的。这个是解决 AS 之间如何交流问题的。
路由协议
上面说到的 RIP,OSPF 和 BGP 都是路由协议,后面还会介绍,不过现在我们要理解为什么要这些协议。上面我只是模糊地说这些协议都是用来告知“信息”的,那到底是什么信息呢?还记得刚开始说 Control Plane 的作用么?就是用来 Routing 的,那怎么做 Routing 呢?用 Routing Table 呀。Routing Table 怎么造起来呢?这些“信息”就是用来造 Routing Table 的。
所以现在我先介绍路由协议是什么(其实就是路由算法),再去讲这三个协议,其实他们都是路由协议的实现方式而已。
组成部分
路由协议重要的点有下面三个:
- 要有一种方式让路由器知道和别的路由器到底能不能通信。
- 要有一种方式让路由器知道要走哪条最短的路可以到达别的路由器。
- 要有一种方式使得改了网络结构后,上面两点会自动更新。
Link State 算法
- 每个路由器都会知道相邻路由器的信息
- 距离信息会广播到每个路由器,相当于是全局信息
- 每个路由器会使用自己的算法去计算 Routing Table
关键词:动态更新,使用局部数据
Distance Vector 算法
- 每个路由器都会知道相邻路由器的信息(没看错和上面的一样)
- 每个路由器会周期性地将自己的信息发给相邻的路由器
- 如果网络结构改变了,那么会更新相邻的路由器,最终整个网络都会完成更新
关键词:全局一波更新,使用全局数据
还是路由协议
下面开始讲对上面两种算法的应用,也就是上面提到的 RIP,OSPF 和 BGP。
RIP
RIP 也叫做 Routing Information Protocol。 先说明,这个协议是属于内部 Routing 的也就是属于 IGP。
- 使用 Distance Vector 算法
- 每个路由器都知道相邻路由器的 Link 权重
- Link 的权重通常都是按 Hop 来算的
- 将自己 Routing Table 广播到相邻路由器
- 使用 Bellman-Ford 算法来计算 Routing Table
- 路由器会以下信息发给自己邻居
- 通过 UDP 发送 RIP 信息
- Routing Table
这个怎么感觉和上面的讲的 Distance Vector 算法差不多呀?哎,你有这感觉就对了。所以说这些协议就是上面算法的实现而已。我们来看个例子吧。
A 将自己的 Routing Table 发给 B,B 就会更新自己的 Routing Table,就是这么简单!
不过呢,这个协议也有自己的缺点:
- 特别依赖邻居的信息,如果不设置一个值,路由器之间会不断发自己的 Routing Table 给对方,严重一点还会出现循环发包情况。所以一般会设置一个 Counter 值来看这个信息已经经过多少个路由器了。
- 因为每个路由器更新信息都依赖于相邻的人,所以当网络结构变了后,要一个一个传来更新,更新速度比较慢。
- 要关键的是,这个协议已经不用了,Rest In Peace.
OSPF
OSPF 也叫做 Open Shortest Path First。这个协议也是属于 IGP 的。下面是它的实现。
- 使用 Link-State 算法
- 每个路由器都会存放一个完整的 AS 网络结构
- 会将 Link State 信息发给每个路由器
- 使用 Dijkstra 算法
- OSPF 会在整个 AS 里将信息广播到全部路由器
- 使用 IP 层来完成
既然要存放全局信息就要存在大容量数据结构里,而不是一张小表格,所以这些数据存放在数据库里,其中包含了 LSDB (Link State Database) 和存放整个网络拓扑结构的数据库。流程如下
当 AS 的网络结构发生变化后,会产生 LSA (Link State Announcement) 来通过所有路由器去完成数据库的更新。每个 LSA 会有一个 ID ,路由器以此来判断是否已经接收过这个 LSA 了。
这些 LSA 有下面几种类型
- hello:用于与相邻 router 构建连接的,并用来选出 Designated Router (DR) and BackupDesignated Router (BDR )
- database description (DBD, DD), 包含了简短的数据库信息,用于检测是否和本地数据库一样,不一样就更新
- link-state request: router 用于获取数据库信息
- link-state update: 用于回应 LSR,还有更新最新信息
- link-state acknowledge (LSACK):告知已经收到了 LSU
再来说说 OSPF 的特点
- 安全:所有的 OSPF 都会有鉴权,会更安全
- 在相同总权重数下允许多条路
- 可以在同一个 domain 下分层
这上面的分层过程中,要注意下面几个点
- 双层结构
- LSA 只会在同一个 area 出现
- 每个节点都会有完整的 area 信息
- 只从 border router 里知道到别的 area 最短路径
- Area Border Router
- 知道到别的网络最短路径
- Backbone Router
- Route 会受限于 Backbone Router
- Boundary Router (Gateway) 会连接到别的 AS
BGP
OSPF 说了很多,因为这是比较主流的,下面说一个用于 EGP 的主流协议——BGP (Border Gateway Protocol)。
BGP 又可以分成下面两个
- eBGP (external Border Gateway Protocol): Border Router 从相邻的 AS 里获取子网的 reachability
- iBGP (internal Border Gateway Protocol): 将别的 AS 的 reachability 传给 AS 里的路由器
看起来 iBGP 属于内部 Routing 呀,不对,因为这个主要是用来告知该 AS 路由器里别的 AS 的情况,所以属于外部 Routing。
AS 之间交换 BGP 流程如下
- AS1 和 AS 2 构建 TCP 连接
- 交换 BGP 信息
- 只要是还有连接,那么就会周期性地更新信息
其实 BGP 到这里就没有了,BGP 就是传递其他 AS 的信息的,不是说好要造一个 Routing Table,然后用 XXX 算法来实现么?这就要扯到 Policy 了。
AS 之间的交互
现在要解决的是 AS 之间的交互,就是刚刚说的外部 Routing。我们先想一个简单的思路:求 AS 的最短路径来完成 Routing,好,我给下面的例子
如果用最短路径,左边路径是 3 个 hop,右边是 1 个 hop,难道我就要走右边了么?不见得吧,那有 4 个 Router 呢。所以外部 Routing 要比我们想像得要复杂,不能简简单单地用算法解决,而是应该在不同悦下用不同的方式去做 Routing,这里的 “不同方式” 就是所说的 Policy。流程如下
选择 route
主流怎么选择最“好”路径可以参考下面的标准
- Local preference
- Shortest AS-PATH
- Closest NEXT-HOP
- 额外的标准