路由器
路由器的定义
路由器(router)是互联网的枢纽,是连接英特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送数据,它提供了路由与转发两种重要机制:
- 路由:路由器控制层面的工作,决定数据包从来源端到目的端所经过的路由路径
- 转发:路由器数据层面的工作,将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行)

路由器也可以理解为一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。也就是说,将路由器某个输入端口收到的分组,按照分组要去的目的地,把该分组从路由器的某个合适的输出端口转发给下一跳的路由器。下一跳的路由器也按照这种方法处理分组,直到该分组到达终点为止。
当然,路由器提高的最主要的功能是路由和转发,除此之外也有一些其它功能:
- 路由:收集网络拓扑信息并动态形成路由表
- 转发:根据转发表(FIB)转发IP数据包
- 子网间速率适配
- 隔离子网
- 隔离广播域
- 指定访问规则
- 不同类型的网络互联:路由器经常会收到以某种类型的数据链路帧封装的数据包,当转发这种数据包时,路由器可能需要将其封装为另一种类型的数据链路帧。数据链路封装取决于路由器接口的类型及其连接的介质类型。
路由器的结构

上图,路由器体系主要包含两个部分:数据平面和控制平面。其中数据平面主要由硬件构成:输入输出端口、交换结构;控制平面主要由软件构成,即路由引擎(协议+路由表)。
数据平面 - 分组转发
输入端口

输入端口就是将物理层的报文处理成网络层的报文,可供交换结构识别。其中,有一个分组缓冲队列,用于缓冲待处理的数据报文,当这个缓冲队列满的时候,就会出现丢包现象。输出端口

输出端口就是将网络层报文包装成物理层报文,然后继续在网络上传播。其中,分组缓冲队列用于缓冲待发送的数据报文,当缓冲满的时候,会出现网速降低。交换结构
交换结构是一台路由器的核心组件,它的作用就是根据转发表对分组进行处理,:某个输入端口进入的分组从一个合适的输出端口转发出去。交换结构有多种不同的形式:
经内存交换:
最简单、最早的路由器是传统的计算机,在输入端口和输出端口之间的交换是在CPU(路由选择处理器)的直接控制下完成的直接控制下完成。输入与输出端口的功能就像在传统操作系统中的I/O设备一样。一个分组到达输入端口时,该端口会先通过中断方式向路由选择处理器发出信号。于是,该分组从输入端口处被复制到处理器内存中。路由选择处理器提取出其目的地址,然后在转发表中查找适当的输出端口,并将该分组复制到输出端口的缓存中。注意这里不能同时转发两个分组,因为共享系统总线一次仅能执行一个内存读/写。
经总线交换:
在这种方法中,输入端口经一根共享总线将分组直接传送至输出端口,不需要路由选择处理器的干预。让输入端口为分组预先计划一个交换机内部标签(首部),指示本地输出端口,使该分组在总线上传递并传至输出端口。分组会被所有输出端口所接收,但是只有标签匹配的分组接收该分组,其余端口丢弃该分组。然后,内部标签去去掉。这里,一次只有一个分组跨越总线,故路由器的交换带宽受总线速率的限制。
经互联网交换:
克服单一、共享式总线带宽限制的一种方法是,使用一个更复杂的互联网络。如上图说示,是一个纵横式的交换结构。图中的交叉点被交换结构控制器所管理能够在任何时候开启或者关闭。例如,若一个分组从A端口到达输出到Y端口。那么A到Y上面的交叉点都会被闭合,然后分组通过这条总线到达Y。如果此时有分组到达B要输出到X也是行的。但是,要注意,不同输入端口的分组同时被输出到同一输出端口,是不行的!需要等待。
至于,如果交换,也就是从那个输出端口出去,取决于转发表(FIB)。
控制平面 - 路由选择
路由选择协议
首先了解以下自治系统(AS):自治系统就是几个路由器组成了一个小团体,小团体内部使用专用的协议进行通信,而小团体和小团体之间也使用专用的协议进行通信。
互联网中有两大类路由选择协议,他们分别是:
- 内部网关协议 IGP (Interior Gateway Protocol)
- 外部网关协议 EGP (External Gateway Protocol)
内部网关协议就是在自治系统中路由器的小团体之间进行通信所使用的协议,如 RIP 和 OSPF ;而外部网关协议则是小团体与小团体之间交流所使用的协议,目前使用的协议就是 BGP。
其中,主要的内部、外部协议详细介绍参见:
https://cloud.tencent.com/developer/article/1671821
路由表
下面是路由表的结构:
- 目标网络/掩码(Destination/Mask):也被称为路由前缀,这是路由条目所关联的目的网络地址及网络掩码。一条完整的路由前缀由:网络地址+前缀长度(或者网络掩码)构成,二者缺一不可,例如192.168.1.0/24与192.168.1.0/25,虽然网络地址相同,都是192.168.1.0,但是两者绝对是两条不同的路由,因为他们的前缀长度不相同。

当路由器收到一个IP数据包时,路由器会解析出IP数据包中的目的IP地址,然后根据目的IP地址查找路由表,依据最长掩码匹配原则找到对应的路由条目,所谓最长掩码匹配原则匹配的就是目的网络的掩码最长的优先。比如:路由器收到一个目的IP地址为10.1.1.1的数据包,此时查找路由表,有两个路由条目,一个路由条目的A的目的网络/掩码是10.1.1.0/24,另一条路由条目B的目的网络/掩码是10.1.1.0/28,那么是匹配路由条目B而不是A,因为B的掩码长为28>25。
- 协议类型(Proto):指该路由条目是使用什么路由协议,例如是OSPF、IS-IS、EIGRP、BGP等路由协议。
- 优先级(Pre):路由表中去往同一目的地的路由可能通过多种路由协议生成。比如去往目的IP为192.168.2.1的通过静态路由生成了,也通过OSPF路由生成了。而每种协议类型对应不同的优先级,优先级值越小则路由越优,常用路由协议和优先级的关系表如下图:

- 跃点数(Cost或 Metric):跃点数用于指出路由的成本(开销),通常情况下代表到达目标地址所需要经过的跃点数量,一个跃点代表经过一个路由器。跃点数越低,代表路由成本越低;跃点数越高,代表路由成本越高。当具有多条到达相同目的网络的路由项时,TCP/IP会选择具有更低跃点数的路由项。
- 标记(Flags):路由标记,R表示该路由是迭代路由;D表示该路由下发到FIB表。迭代路由必须有直连的下一跳才能够指导转发,但是路由生成时下一跳可能不是直连的,因此需要计算出一个直连的下一跳和对应的出接口,这个过程就叫做路由迭代。BGP路由、静态路由和UNR路由的下一跳都有可能不是直连的,都需要进行路由迭代。例如,BGP路由的下一跳一般是非直连的对端loopback地址,不能指导转发,需要进行迭代。即根据以BGP学习到的下一跳为目的地址在IP路由表中查找,当找到一条具有直连的下一跳、出接口信息的路由后(一般为一条IGP路由),将其下一跳、出接口信息填入这条BGP路由的IP路由表中并生成对应的FIB表项。

- 下一跳(NextHop):去往目标网络的下一跳IP地址。

出接口(Interface):去往目标网络从本设备的哪个接口出去,如上图就是从G0/0/1接口出去。
路由选择协议
自治系统 AS (Autonomous System) ,自治系统就是几个路由器组成了一个小团体 👨👩👧👧,小团体内部使用专用的协议进行通信,而小团体和小团体之间也使用专用的协议进行通信。如图所示:

互联网中有两大类路由选择协议,他们分别是:内部网关协议 IGP (Interior Gateway Protocol):就是之前说的小团体内部之间进行通信所使用的协议,如 RIP 和 OSPF 等
- 外部网关协议 EGP (External Gateway Protocol):是小团体与小团体之间交流所使用的协议,目前使用的协议就是 BGP
内部网关协议
RIP协议
工作原理
ROP协议,全称是路由信息协议:
- 它是一种分布式的、基于距离向量的路由选择协议
- 它要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录
关于距离的定义:
- 从一个路由器到直接连接的网络的距离定义为 1
- 从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1
- 距离 也称为 “跳数”(hop count),因为每经过一个路由器,跳数就加 1
- 这里的“距离”实际上指的是“最短距离”
RIP 协议认为一个好的路由就是它通过的路由器的数目少,即“距离短”,并且RIP 允许一条路径最多只能包含 15 个路由器,这意味着 RIP 只会选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。RIP协议具有以下特点:
- 仅和相邻路由器交换信息
- 交换的信息是当前本路由器所知道的全部信息,即自己的路由表
- 按固定的时间间隔交换路由信息,例如:每隔 30 秒
那么在小团体(自治系统)之内的路由器是怎么建立路由表的呢?主要有以下步骤:
- 路由器在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为1),它的路由表是空的。以后,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。
- 经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。
- RIP 协议的收敛 (convergence) 过程较快,“收敛”就是在自治系统中所有的结点都得到正确的路由选择信息的过程。
距离向量算法
距离向量算法的基础就是 Bellman-Ford 算法(或 Ford-Fulkerson 算法)。这是一种贪心算法,该算法可以大致描述如下:设X是结点 A 到 B 的最短路径上的一个结点,若把路径 A→B 拆成两段路径 A → X 和 X → B,则每一段路径 A → X 和 X → B 也都分别是结点 A到 X 和结点 X 到 B 的最短路径。
该算法是是用来更新路由表的,因为 RIP 本身就是保证每一个路由器到每一个目的网络的路由都是最短的(即跳数最少),因为每一个路由器的位置不同,所以他们的路由表也不同。我们假设一个路由器收到相邻路由器(其地址为 X)的一个 RIP 报文:
- 先修改此 RIP 报文中的所有项目:把“下一跳”字段中的地址都改为 X,并把所有的 “距离” 字段的值加 1。
- 对修改后的 RIP 报文中的每一个项目,重复以下步骤:
- 若项目中的目的网络不在路由表中,则把该项目加到路由表中。
- 否则,若下一跳字段给出的路由器地址是同样的,则把收到的项目替换原路由表中的项目。
- 再否则 ,若收到项目中的距离小于路由表中的距离,则进行更新
- 再否则,什么也不做。
- 若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器,即将距离置为 16(表示不可达)。
- 返回。
RIP2 协议的报文格式

要点:
- ✅ RIP2 报文由首部和路由部分组成。
- ✅ RIP2 报文中的路由部分由若干个路由信息组成。
- ✅ 地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。
- ✅ 路由标记填入自治系统的号码,这是考虑使 RIP 有可能收到本自治系统以外的路由选择信息。
- ✅ 再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离。
注意:
- 一个 RIP 报文最多可包括 25 个路由,因而 RIP 报文的最大长度是4 + 20 × 25 = 504 字节。如超过,必须再用一个 RIP 报文来传送。
- 对于 RIP 来说,好消息传播得快,而坏消息传播得慢,即网络出故障的传播时间往往需要较长的时间(例如数分钟),这是 RIP 的一个主要缺点。
