← 返回 计算机网络原理

计算机网络原理

第五章 第3节

回顾一下前面的

数据平面:分组来了,查表转发。 控制平面:路由表、转发表是怎么算出来的。

这一部分我们大概来看一下:

距离向量路由算法 DV;

DV 的信息扩散、链路变化、无穷计数问题;

LS 和 DV 的对比;

为什么互联网不能用一个平面路由;

AS 自治系统;

AS 内部路由协议:RIP、OSPF;

AS 之间路由协议:BGP;

OSPF 的层次化。

路由算法理论:LS、DV 现实协议实现:RIP、OSPF、BGP 互联网扩展性:AS 层次化路由

二、距离向量 DV 的核心思想

DV 全称:

DistanceVectorDistanceVector

中文叫:距离向量路由选择。

它的基本思想是:

每个路由器只知道自己到邻居的链路代价,然后和邻居交换“我到各个目的地的距离估计”,再根据邻居的信息更新自己的路由表。

它不像 LS 一样知道全网拓扑。

LS 是:知道全网地图,我自己算最短路。

DV 是:

只问邻居:“你到各个地方有多远?”然后我自己加上到邻居的距离,选最小的。

三、DV 中每个路由器维护什么?

每个路由器维护一张距离向量表,大概长这样:

目的 | 下一跳 | 代价 A | Z | 14 B | Q | 10 C | Y | 5

含义是:

到目的 A,我应该先发给邻居 Z,总代价是 14。

所以 DV 表里最重要的两个东西是:

到每个目的地的最小代价;

对应的下一跳邻居。

四、Bellman-Ford 方程

DV 的数学核心是 Bellman-Ford 方程:

Dx(y)=minvc(xv)+Dv(y){D}_{x}(y)=\underset{v}{min}{c(x|v)+{D}_{v}(y)}

含义:

Dx(y){D}_{x}(y)

:节点 $x$ 到目的 $y$ 的最小代价估计;

vv

:节点 $x$ 的某个邻居;

c(xv)c(x|v)

:从 $x$ 到邻居 $v$ 的直接链路代价;

Dv(y){D}_{v}(y)

:邻居 $v$ 到目的 $y$ 的代价估计。

这公式怎么理解?

从 $x$ 到 $y$ ,第一跳一定要先走某个邻居 $v$ 。

如果第一跳走 $v$ ,总代价就是:

xv的代价+vy的代价x\text{到}v\text{的代价}+v\text{到}y\text{的代价}

也就是:

c(xv)+Dv(y)c(x|v)+{D}_{v}(y)

把所有邻居都试一遍,选最小的那个。

五、DV 小例子

假设节点 $u$ 的邻居有:

vv
xx
ww

链路代价是:

c(uv)=2c(ux)=1c(uw)=5c(u|v)=2c(u|x)=1c(u|w)=5

邻居告诉 $u$ :

Dv(z)=5Dx(z)=3Dw(z)=3{D}_{v}(z)=5{D}_{x}(z)=3{D}_{w}(z)=3

那么 $u$ 到 $z$ 的代价是:

Du(z)=min2+51+35+3Du(z)=min748=4{D}_{u}(z)=min{2|+|51+35+3}{D}_{u}(z)=min{7||48}=4

所以: $u$ 到 $z$ 最好先走 $x$ ,总代价 4。

路由表中写:

目的 | 下一跳 | 代价 z | x | 4

六、DV 算法的运行过程

每个节点都重复做三件事。

1. 等待事件

事件包括:

自己到邻居的链路代价改变;

收到邻居发来的距离向量。

2. 重新计算自己的 DV

收到邻居信息后,用 Bellman-Ford 方程更新:

Dx(y)=minvc(xv)+Dv(y){D}_{x}(y)=\underset{v}{min}{c(x|v)+{D}_{v}(y)}

对每一个目的 $y$ 都算一遍。

3. 如果自己的 DV 变化,就通知邻居

如果某个目的地的最小代价变了,或者下一跳变了,就把新的距离向量发给邻居。

邻居收到后再更新。

这样一轮一轮迭代,直到所有节点的表都稳定。

七、DV 的三个特点

1. 迭代式

DV 不是一次算完,而是不断根据邻居信息更新。

2. 异步

所有路由器不需要同时更新。

谁收到消息,谁就可以先算。

3. 分布式

每个节点只和邻居交换信息,不需要知道全网拓扑。

所以 DV 更像:

局部交流,逐渐扩散,全网收敛。

八、DV 迭代过程怎么理解?

a,b,cd,e,fg,h,ia,b,cd,e,fg,h,i

刚开始 $t=0$ 时,每个节点只知道:

自己到自己是 0,到直接邻居是链路代价,到其他节点是无穷大。

比如节点 $a$ 一开始知道:

Da(a)=0Da(b)=8Da(d)=1{D}_{a}(a)=0{D}_{a}(b)=8{D}_{a}(d)=1

其他目的暂时是:

\infty

t = 1

每个节点把自己的 DV 发给邻居。

比如 $b$ 收到来自 $a,c,e$ 的 DV。

然后 $b$ 计算:

Db(y)=minc(ba)+Da(y)c(bc)+Dc(y)c(be)+De(y){D}_{b}(y)=min{c|(b|a)|+{D}_{a}(y)c(b|c)+{D}_{c}(y)c(b|e)+{D}_{e}(y)}

对每个目的 $y$ 都算一遍。

t = 2

节点又把更新后的 DV 发给邻居。

这时候一个节点可以学到两跳以内的信息。

t = 3、t = 4

信息继续往外扩散。

一般可以理解成:

第 1 轮知道邻居的信息; 第 2 轮知道两跳范围的信息; 第 3 轮知道三跳范围的信息; 继续下去,最终全网收敛。

所以 DV 的信息传播有点像“水波扩散”。

九、DV 中状态信息的扩散

t=0t=0

:c 的状态只有 c 自己知道;

t=1t=1

:c 的信息传到邻居,比如 b、f;

t=2t=2

:影响到距离 c 两跳的节点;

t=3t=3

:影响到三跳外;

t=4t=4

:继续扩散。

所以 DV 的传播特点是:一跳一跳往外传。

这和 LS 不一样。

LS 是:每个路由器把链路状态泛洪给所有路由器。

DV 是:只告诉邻居,邻居再告诉它们的邻居。

十、链路代价变化:好消息传得快

如果链路代价变小,比如原来 $x$ 到 $y$ 的代价是 4,现在变成 1。

那么:

yy

发现到 $x$ 更近了;

yy

更新自己的 DV;

yy

告诉邻居;

邻居发现通过 $y$ 到 $x$ 更便宜,也更新;

信息很快扩散。

这叫:好消息传得快。

因为一旦发现更短路径,大家都愿意立刻采用。

十一、链路代价变坏:坏消息传得慢

如果链路代价变大,问题就复杂了。

比如原来:

xy=4x-y=4

后来变成:

xy=60x-y=60

假设 $z$ 原来通过 $y$ 到 $x$ , $y$ 又以为可以通过 $z$ 到 $x$ 。

这时候可能出现:

yy

以为 $z$ 有路, $z$ 以为 $y$ 有路。

它们互相误导,代价一点点增加。

这就是:count-to-infinity,无穷计数问题。

十二、无穷计数问题

无穷计数的本质是:

路由器只知道邻居告诉自己的距离,但不知道邻居的路径到底经过谁。

所以当某条链路坏掉后,邻居可能还在用旧信息,以为对方有路。

比如:

yy

到 $x$ 的链路代价变大;

yy

问 $z$ :你到 $x$ 多远?

zz

说:我到 $x$ 是 5;

但其实 $z$ 的路径可能是通过 $y$ 到 $x$ ;

yy

听了以后,以为自己可以通过 $z$ 到 $x$ ;

zz

又以为可以通过 $y$ ;

二者互相骗,代价慢慢增加。

这就是坏消息传得慢。

十三、毒性逆转 Poison Reverse

为了解决两个节点之间的简单环路,DV 里可以用:

毒性逆转 poison reverse。

规则是:

如果我到目的 $x$ 的下一跳是邻居 $v$ ,那么我告诉 $v$ :我到 $x$ 的距离是无穷大。

比如 $z$ 到 $x$ 是通过 $y$ 走的,那么 $z$ 告诉 $y$ :

Dz(x)={D}_{z}(x)=\infty

意思是:你别通过我去 x,因为我本来就是通过你去 x 的。

这样可以防止两节点之间的 ping-pong 回环。

但是注意:毒性逆转不能彻底解决所有多节点环路。

比如三台以上路由器形成的环,仍然可能出现问题。

十四、LS 和 DV 的对比

对比 | LS 链路状态 | DV 距离向量 知道的信息 | 全网拓扑和链路代价 | 只知道邻居和邻居的距离估计 信息传播 | 向全网泛洪 LS 分组 | 只和邻居交换 DV 算法 | Dijkstra | Bellman-Ford 收敛速度 | 通常较快 | 可能较慢 消息复杂度 | 需要全网泛洪,开销较大 | 邻居间交换,收敛时间与变化有关 稳定性问题 | 可能路由振荡 | 可能路由环路、无穷计数 典型协议 | OSPF | RIP

十五、为什么需要可扩展路由?

前面学的 LS、DV 都比较理想化。

如果整个互联网所有路由器都在一个平面上运行 LS 或 DV,会出大问题。

1. 规模太大

互联网有海量网络和路由器。

如果每台路由器都保存全网路由信息,路由表太大。

如果每次链路变化都通知全网,消息量太大。

2. 管理自治性

互联网不是一个人管理的。

不同网络属于不同组织:

学校

公司

ISP

数据中心

运营商

它们不可能都用同一套内部路由策略。

每个网络的管理员都希望控制自己网络内部的路由方式。

所以需要层次化。

十六、AS:自治系统

第五章 第3节 配图 2第五章 第3节 配图 2

互联网采用的可扩展方案是:

把互联网划分成很多自治系统 AS。

AS 全称:

AutonomousSystemAutonomousSystem

自治系统。

一个 AS 通常是:

一个 ISP 或一个大型组织管理的一组路由器和网络。

每个 AS 有一个唯一的 AS Number,简称 ASN。

例如:

一个校园网可以是一个 AS;

一个运营商网络可以包含一个或多个 AS;

一个大型公司也可能有自己的 AS。

十七、AS 内部路由和 AS 间路由

互联网路由分成两层。

1. AS 内部路由 intra-AS routing

也叫:域内路由。

它解决的是:在同一个 AS 内部,路由怎么走。

特点:

同一个 AS 内部通常运行同一种内部路由协议;

不同 AS 可以使用不同的内部协议;

管理员可以自己决定内部路由策略。

典型协议:

RIP

OSPF

EIGRP

IS-IS

2. AS 间路由 inter-AS routing

也叫:域间路由。

它解决的是:不同 AS 之间怎么互联,去别的 AS 应该走哪个出口。

典型协议:

BGPBGP

BGP 全称:

BorderGatewayProtocolBorderGatewayProtocol

边界网关协议。

十八、网关路由器 Gateway Router

在 AS 的边缘,连接其他 AS 的路由器叫:

网关路由器 gateway router。

它有两个作用:

对内部 AS 来说,它是出去到外部网络的出口;

对外部 AS 来说,它是进入该 AS 的入口。

所以内部路由协议要解决:

怎么到达本 AS 的网关。

外部路由协议 BGP 要解决:

哪个网关能到达哪个外部目的网络。

十九、RIP 协议

RIP 全称:

RoutingInformationProtocolRoutingInformationProtocol

它是一个经典的 AS 内部路由协议。

RIP 使用的是:距离向量 DV 算法。

第五章 第3节 配图 3

RIP 的度量指标

RIP 的 cost 是:

跳数\text{跳数}

每经过一个路由器,跳数加 1。

所以 RIP 不看:

带宽

延迟

拥塞

只看经过多少跳。

RIP 的最大跳数

RIP 规定最大跳数是:

1515

如果跳数为 16,就认为不可达。

所以 RIP 只适合小型网络。

二十、RIP 的通告

RIP 路由器会和邻居交换路由通告。

特点:

每 30 秒和邻居交换一次;

如果路由改变,也可以触发通告;

在对方请求下也可以发送通告;

每个通告最多包含 25 个目标子网的信息。

通告内容一般是:

目标网络+跳数\text{目标网络}+\text{跳数}

也就是:

目标子网 | 跳数 u | 1 v | 2 w | 2

二十一、RIP 例子怎么更新?

假设路由器 D 原来的表里:

目的子网 | 下一跳 | 跳数 w | A | 2 y | B | 2 z | B | 7 x | - | 1

现在 A 发给 D 一个距离向量:

目的 | 从 A 到目的的跳数 w | 1 x | 1 z | 4

D 到 A 是 1 跳。

所以 D 通过 A 到 z 的代价是:

1+4=51+4=5

原来 D 到 z 是通过 B,跳数 7。

现在通过 A 是 5,更短。

所以更新:

目的子网 | 下一跳 | 跳数 z | A | 5

这就是 RIP 中 DV 更新的方法

二十二、RIP 链路失效和恢复

如果 180 秒没有收到某个邻居的通告,RIP 会认为:

这个邻居或链路失效了。

然后:

标记经过这个邻居的路由失效;

发送新的通告给邻居;

邻居再继续扩散;

整个网络逐渐更新。

为了避免 ping-pong 回路,RIP 使用:

毒性逆转 poison reverse。

并且 RIP 中:

16=无穷大16\text{跳}=\text{无穷大}

也就是不可达。

二十三、RIP 的实现

第五章 第3节 配图 4

RIP 是由应用进程实现的。

常见实现是:

routedrouted

它通过 UDP 传输 RIP 报文。

这说明:

虽然 RIP 是网络层路由协议,但它的报文传输使用了运输层 UDP 服务。

二十四、OSPF 协议

OSPF 全称:

OpenShortestPathFirstOpenShortestPathFirst

它也是 AS 内部路由协议。

OSPF 使用的是:链路状态 LS 算法。

OSPF 的特点

1. 开放

Open 表示:协议规范公开可用。

2. 使用 LS 算法

每个路由器泛洪 OSPF 链路状态通告。

每个路由器得到全 AS 的拓扑和链路代价后,运行 Dijkstra 算法计算路由表。

3. 直接运行在 IP 上

OSPF 报文直接封装在 IP 中。

它不像 RIP 那样使用 UDP,也不是 TCP。

4. 支持多种链路代价

OSPF 的链路代价可以根据:

带宽

延迟

管理员配置

来设置。

5. 支持认证

OSPF 报文可以经过认证,防止恶意攻击或者伪造路由信息。

二十五、OSPF 和 RIP 对比

对比 | RIP | OSPF 算法 | DV | LS 度量 | 跳数 | 链路代价,可配置 最大范围 | 15 跳,适合小网络 | 适合较大 AS 信息交换 | 邻居间交换 DV | 泛洪链路状态通告 计算方法 | Bellman-Ford | Dijkstra 传输方式 | UDP | 直接封装在 IP 收敛 | 较慢,可能无穷计数 | 通常较快 安全 | 较弱 | 支持认证

二十六、OSPF 的层次化

如果一个 AS 很大,所有路由器都在一个 LS 域里泛洪,也会很重。

所以 OSPF 支持层次化,把 AS 分成多个区域:

本地区域 area

骨干区域 backbone area

为什么要分区域?

为了减少:

链路状态通告的泛洪范围;

每台路由器需要保存的拓扑信息;

Dijkstra 计算压力。

每个路由器只需要知道:

自己所在区域的详细拓扑,以及去其他区域的大致方向。

二十七、OSPF 中几类路由器

1. Internal Router

内部路由器。

它只属于一个区域,在该区域内部运行 OSPF。

2. Area Border Router

区域边界路由器。

它连接本地区域和骨干区域。

作用是:汇总本区域到外部区域的距离,并向骨干区域通告。

3. Backbone Router

骨干路由器。

它在骨干区域内部运行 OSPF。

骨干区域负责连接各个区域。

4. Boundary Router

边界路由器。

它连接其他 AS。

也就是 AS 对外的出口。

二十八、层次化 OSPF 的理解

一个 AS 内部被分成:

area1,area2,area3,backbonearea1,area2,area3,backbone

每个普通区域内部:只泛洪本区域内的链路状态信息。

骨干区域:负责连接各个区域。

如果 area1 的路由器要到 area3:

大概路径是:

area1区域边界路由器backbone区域边界路由器area3area1\to \text{区域边界路由器}\to backbone\to \text{区域边界路由器}\to area3

这种层次化降低了全网 LS 泛洪的压力。

二十九、BGP 的位置

BGP 是:

AS间路由协议AS\text{间路由协议}

也叫:外部网关协议。

它和 RIP、OSPF 不同。

RIP、OSPF 是在一个 AS 内部用的。

BGP 是在 AS 和 AS 之间用的。

BGP 解决的问题(商业问题和实际的关系问题或许会多一些)

BGP 主要解决:

到某个外部网络前缀,应该经过哪些 AS,选择哪个 AS 出口。

它不是简单地找最短路。

因为 AS 之间路由有很多策略因素,比如:

商业关系;

谁给谁付钱;

是否允许某些流量经过;

出口策略;

运营商政策。

所以 BGP 是策略路由,不只是最短路径路由。

三十、整体逻辑

DV 是一种分布式路由算法。每个路由器只和邻居交换距离向量,用 Bellman-Ford 方程更新自己的路由表。

它简单,但可能出现路由环路、无穷计数,坏消息传得慢。RIP 就是基于 DV 的 AS 内部协议,使用跳数作为度量,最大 15 跳,每 30 秒交换一次通告,16 跳表示不可达。

LS 是另一种路由算法,每个路由器通过泛洪获得全网拓扑,然后用 Dijkstra 算法计算最短路径。OSPF 就是基于 LS 的 AS 内部协议,支持链路代价、认证和层次化区域。

由于互联网太大,不能把所有路由器放在一个平面里运行一个路由算法,所以采用 AS 层次化。

每个 AS 内部运行自己的内部路由协议,比如 RIP 或 OSPF;AS 之间通过 BGP 交换路由信息。

三十一、回顾

1. DV 核心公式

Dx(y)=minvc(xv)+Dv(y){D}_{x}(y)=\underset{v}{min}{c(x|v)+{D}_{v}(y)}

含义:从 x 到 y,试所有邻居 v,选总代价最小的那个作为下一跳。

2. DV 三个特点

迭代式

异步

分布式

3. DV 的问题

路由环路

无穷计数

坏消息传得慢

4. 毒性逆转

如果我到某目的地是通过邻居 v,那么我告诉 v:我到这个目的地的距离是无穷大。

作用:防止两个节点之间的简单环路。

5. RIP

基于 DV;

度量是跳数;

最大 15 跳;

16 跳表示不可达;

每 30 秒交换通告;

180 秒没收到通告认为链路失效;

通过 UDP 实现;

每个通告最多 25 个目标子网。

6. OSPF

基于 LS;

使用 Dijkstra;

泛洪链路状态通告;

直接运行在 IP 上;

支持认证;

支持层次化区域。

7. AS

自治系统,一个管理域内的一组路由器和网络,通常属于一个 ISP 或组织。

8. AS 内部路由 vs AS 间路由

类型 | 作用 | 协议 AS 内部路由 | 一个 AS 内部怎么走 | RIP、OSPF AS 间路由 | AS 与 AS 之间怎么走 | BGP

9. OSPF 层次化

本地区域 area

骨干区域 backbone

区域边界路由器 area border router

骨干路由器 backbone router

边界路由器 boundary router

DV 通过邻居交换距离向量,用 Bellman-Ford 方程逐步更新路由表;RIP 是典型 DV 协议。LS 通过泛洪链路状态,让每个路由器获得全网拓扑,用 Dijkstra 算最短路径;OSPF 是典型 LS 协议。互联网规模太大,所以用 AS 层次化:AS 内部用 RIP/OSPF,AS 之间用 BGP。

对应关系:

DVBellmanFordRIPLSDijkstraOSPFAS间路由BGPDV⇒Bellman-Ford⇒RIPLS⇒Dijkstra⇒OSPFAS\text{间路由}⇒BGP