路由器是一种具有多个输入端口和输出端口的专用计算机,其任务是转发分组和路由选择。
实现的网络模型:物理层、数据链路层、网络层。
路由器的结构分为两个部分:
【注】实现交换结构的三种基本方式是:通过存储器、通过总线以及通过互连网络。这三种交换结构可实现的路由器转发速率依次提高。
路由表(Route Information Base,RIB)的主要用途是路由选择。路由表的每一表项都是一条路由信息,一般包含以下信息:
静态路由有两种特殊的路由:
路由 | 默认路由 | 特定主机路由 |
---|---|---|
目的网络 | 0.0.0.0/0 | a.b.c.d/32 |
用途 | 使用一条默认路由条目,替代了去往因特网中众多网络的海量路由条目 | 出于某种安全问题的考虑,同时为了使网络运维人员更方便地控制网络和测试网络,指明到某一台主机的特定主机路由是十分有用的 |
优先级 | 路由器在查找转发表转发 IP 数据报时,遵循最长前缀匹配的原则,因此默认路由条目的匹配优先级最低 | 路由器在查找转发表转发 IP 数据报时,遵循最长前缀匹配的原则,按照匹配优先级最高的特定主机路由条目进行转发 |
【注】进行静态路由配置需要注意:
- 路由条目配置错误,甚至导致出现路由环路。
- 聚合路由条目时可能引入不存在的网络。
例如以下网络:
初始时,各路由器往路由表中填写直连路由,如下:
目的网络 | 下一跳 | 接口 | 类型 |
---|---|---|---|
192.168.1.0/24 | 接口 0 | 接口 0 | 直连 |
10.0.0.0/30 | 接口 1 | 接口 1 | 直连 |
目的网络 | 下一跳 | 接口 | 类型 |
---|---|---|---|
10.0.0.0/30 | 接口 0 | 接口 0 | 直连 |
192.168.2.0/24 | 接口 1 | 接口 1 | 直连 |
但是 R1 到目的网络 192.168.2.0/24 的路由没有配置,R2 到目的网络 192.168.1.0/24 的路由也没有配置,除此之外,R1 和 R2 去往因特网的路由也没有配置。我们可以进行人工配置,也可以依据路由选择协议(下面将详细介绍)让路由器自己获取路由。以下是人工配置后的路由表:
目的网络 | 下一跳 | 接口 | 类型 |
---|---|---|---|
192.168.1.0/24 | 接口 0 | 接口 0 | 直连 |
10.0.0.0/30 | 接口 1 | 接口 1 | 直连 |
192.168.2.0/24 | 10.0.0.2 | 接口 1 | 静态 |
0.0.0.0/0 | 10.0.0.2 | 接口 0 | 静态 |
【注】最后一个路由表项即为默认路由,默认路由必须为人工配置。R2 成为该网络的默认网关,它是本网络与外网连接的设备,就像古代扼守出入的“关口”。当分组目的地址找不到对应的目的网络时,路由器 R1 便认为该分组的目的地址在互联网中,因此将该分组从接口 1 转发出去。
目的网络 | 下一跳 | 接口 | 类型 |
---|---|---|---|
10.0.0.0/30 | 接口 0 | 接口 0 | 直连 |
192.168.2.0/24 | 接口 1 | 接口 1 | 直连 |
0.0.0.0/0 | 接口 2 | 接口 2 | 静态 |
192.168.1.0/24 | 10.0.0.1 | 接口 0 | 静态 |
如果新增加的路由是依据路由选择协议得出的,则类型应为“动态”。
转发表(Forward Information Base,FIB)是从路由表得出的,其表项和路由表项有直接的对应关系。分组抵达路由器后,解析出分组的目的地址,并根据转发表将分组从适当的端口转发出去。
转发表项的格式为:
目的地址 | 下一跳 |
---|---|
分组将要发往的目的地址 | 下一个接收者的目的地址,实际是 MAC 地址 |
路由表存在下一跳非直连的表项,而转发表不存在这样的表项。
【注】转发和路由选择(路由转发)的区别:
- 转发:路由器根据 IP 数据报的要求从正确的端口转发出去。
- 路由选择:涉及很多路由器,根据从各相邻路由器得到的网络拓扑情况,动态改变自己的路由表。可以这么认为,路由表将整个网络拓扑结构都记录了下来。
路由信息协议(Routing Information Protocol,RIP)是内部网关协议中最先得到广泛使用的协议之一,其相关标准文档为[RFC 1058]。
RIP 是应用层协议,它使用 UDP 封装数据,UDP 端口号为 520。所以当传输到网络层时,报文将会是这个样子:
IP 首部 | UDP 首部 | RIP 首部 | RIP 路由部分 |
---|
路由器到直连网络的距离 ::= 1
。路由器到非直连网络的距离 ::= 所经过的路由器数 + 1
。距离 ≤ 15
,距离 = 16
表示该网络不可达。【注 1】由于距离限制,RIP 只适用于小型互联网。规定最高跳数是为了防止出现路由环路的情况。
【注 2】哪怕存在另一条传输速率更快、路由器更多的路径,RIP 依然会选择路由器最少的路径。
【注 1】为了加快 RIP 的收敛速度,当网络拓扑发生变化时,路由器要及时向相邻路由器通告拓扑变化后的路由信息,这称为触发更新。
【注 2】什么是相邻路由器?例如:
R1—R2—R3
,则 R1 和 R2、R2 和 R3 均为相邻路由器,而 R1 和 R3 不是相邻路由器。
目的网络 | RIP 距离 | 下一跳 |
---|---|---|
… | … | … |
<目的网络, RIP 距离, 下一跳>
。假设有以下自治系统 AS:
路由表项 | R1 路由表 | R2 路由表 | R3 路由表 | R4 路由表 |
---|---|---|---|---|
1 | ||||
2 | ||||
3 |
路由表项 | R1 路由表 | R2 路由表 | R3 路由表 | R4 路由表 |
---|---|---|---|---|
1 | ||||
2 | ||||
3 | ||||
4 | ||||
5 |
各路由器是通过怎样的步骤得出各自的路由表?这就是距离向量算法所处理的事情。
假设有两个相邻的路由器:路由器C--------路由器D
路由器 C 和 D 的路由表如下:
路由表项 | C 路由表 | D 路由表 |
---|---|---|
1 | ||
2 | ||
3 | ||
4 | ||
5 |
现路由器 C 发送一个 RIP 更新报文给路由器 D。路由器 D 收到报文后,将该报文作修改,然后与自己的路由表对比,并修改自己的路由表。步骤如下:
N2----(距离4)----路由器C----(距离1)----路由器D
。路由表项 | 修改 C 路由表 | D 路由表 |
---|---|---|
1 | ||
2 | ||
3 | ||
4 | ||
5 |
N2----(距离2)----路由器C----(距离1)----路由器D
,网络拓扑结构变化后:N2----(距离4)----路由器C----(距离1)----路由器D
。路由表项 | 修改 C 路由表 | D 路由表 |
---|---|---|
1 | ||
2 | ||
3 | ||
4 | ||
5 |
路由表项 | 修改 C 路由表 | D 路由表 |
---|---|---|
1 | ||
2 | ||
3 | ||
4 | ||
5 | ||
6 |
路由表项 | 修改 C 路由表 | D 路由表 |
---|---|---|
1 | ||
2 | ||
3 | ||
4 | ||
5 | ||
6 |
路由表项 | 修改 C 路由表 | D 路由表 |
---|---|---|
1 | ||
2 | ||
3 | ||
4 | ||
5 | ||
6 | ||
7 |
假设网络 N1 到路由器 R1 之间出现了故障:N1----x----路由器R1--------路由器R2
路由器 R1 的路由:
,路由器 R2 的路由:
(R2 还不知道 N1 与 R1 之间出了故障)
此时路由器 R2 才发现 N1 是不可达的,整个自治系统才达到收敛,即 R1 和 R2 均知道 N1 不可达。
如果一个路由器发现了 RIP 距离更短的路由,那么这种更新信息就传播得很快,即“好消息传得快”。
但一旦出现不可达的故障,则更新过程的收敛时间长,收敛速度很慢,即“坏消息传得慢”。
开放最短路径优先(Open Shortest Path First,OSPF)协议是为了克服路由信息协议 RIP 的缺点而开发出来的。
OSPF 不使用 UDP 数据报传送,而是直接使用 IP 数据报传送。
OSPF 是基于链路状态的,而不像 RIP 是基于距离向量的。
【注】“代价”可理解为图上的边的权重值,在 OSPF 中一般称为成本度量 metric。
类型 | 用途 |
---|---|
问候(Hello) | 用来发现和维护邻居路由器的可达性 |
数据库描述(Database Description) | 用来向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息 |
链路状态请求(Link State Request) | 用来向邻居路由器请求发送某些链路状态项目的详细信息 |
链路状态更新(Link State Update) | 路由器使用链路状态更新分组将其链路状态信息进行洪泛发送,即用洪泛法对整个系统更新链路状态 |
链路状态确认(Link State Acknowledgement) | 对链路状态更新分组的确认分组 |
假设有以下自治系统 AS,连线上的数值即为度量代价 metric,该自治系统连接了外部网络 N1。
R1------(1)------R2
| |
| |
| |
(5) (2)
| |
| |
| |
R3------(4)------R4---(6)---N1
OSPF 相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系。
… | 目的地址 | 协议号 | … | OSPF 问候分组 |
---|---|---|---|---|
… | 224.0.0.5 | 89 | … | xxx |
邻居 ID | 接口 | 倒计时 |
---|---|---|
R2 | 0 | 36s |
R3 | 1 | 18s |
路由器/网络 | 度量代价 metric |
---|---|
直连网络 N1 | 6 |
邻居路由器 R2 | 2 |
邻居路由器 R3 | 4 |
R1<<<<<<(LSU)------R2
^ ^
^ ^
^ ^
(LSU) (LSU)
| |
| |
| |
R3<<<<<<(LSU)------R4------N1
R1 的 LSDB |
---|
R1 的 LSA |
R2 的 LSA |
R3 的 LSA |
R4 的 LSA |
下面来总结 OSPF 的工作流程。
链路状态数据库的建立:
只要有一个路由器的链路状态发生变化:
【注】OSPF 没有“坏消息传得慢”的问题,收敛速度很快。
为了减少洪泛发送问候分组和链路状态更新分组的数量,OSPF 选举指定路由器(Designated Router,DR)和备用指定路由器(Backup Designated Router,BDR)。
为使 OSPF 协议能够用于规模很大的网络,OSPF 把一个自治系统 AS 再划分为若干个更小的范围,称为区域(area)。
边界网关协议(Border Gateway Protocol,BGP)属于外部网关协议 EGP,用于自治系统 AS 之间的路由选择协议。
对于 AS 之间的路由选择,使用统一的“代价”作为度量来寻找最佳路由是不行的。因为不同的 AS 可能使用不同的 IGP,且不是每个 AS 都允许经过。
报文 | 用途 |
---|---|
打开(Open) | 用来与相邻的另一个BGP发言人建立关系,使通信初始化 |
更新(Update) | 用来周期性地证实邻站的连通性 |
保活(Keepalive) | 用来通告某一条路由的信息,以及列出要撤销的多条路由 |
通知(Notification) | 用来发送检测到的差错 |
协议 | RIP | OSPF | BGP |
---|---|---|---|
类型 | IGP | IGP | EGP |
传递协议 | UDP | IP | TCP |
路由算法 | 距离向量算法 | 链路状态路由算法 | 路径向量算法 |
路径选择 | 跳数(hop)最小 | 代价(metric)最低 | 较好 |
收敛速度 | 好消息快,坏消息慢 | 快 | 慢 |
交换结点 | 本网络中的相邻路由器 | 本网络中的所有路由器 | 相邻路由器 |
交换内容 | 整个路由表 | 相邻路由器的链路状态信息 | 首次:整个路由表;非首次:变化部分 |