路由器的是实现网络互连, 在不同网络之间转发数据单元的重要网络设备. 路由器主要工作在 OSI 参考模型的第三层(网络层), 路由器的主要任务就是为 经过路由器的每个数据帧寻找一条最佳传输路径, 并将该数据有效地传送到目的站点 . 为了完成这项工作, 在路由器中保存着各种传输路径的相关数据 -- 路由表( Routing Table), 供路由选择时使用.
由此可见, 选择最佳路径的策略即路由算法是路由器的关键所在. 因此, 当路由器接收到来自一个网络接口的数据包时, 首先根据其中所含的目的地址查询路由表, 决定转发路径 (转发接口和下一跳地址 ), 然后从 ARP 缓存中调出下一跳地址的 MAC 地址, 将路由器自己的 MAC 地址作为源 MAC, 下一跳地址的 MAC 作为目的 MAC 封装成帧头, 同时 IP 数据包头的 TTL(Time To Live ) 也开始减数 , 最后将数据发送至转发端口, 按顺序等待, 传送到输出链路上去. 在这个过程中, 路由器被认为了执行两个最重要的基本功能: 路由功能与交换功能.
路由功能
路由功能是指路由器通过运行动态路由协议或其他方法来学习和维护网络拓扑结构, 建立, 查询和维护路由表.
路由表里则保存着路由器进行路由选择时所需的关键信息, 包含了目的地址, 目的地址的掩码, 下一跳地址, 转发端口, 路由信息来源, 路由优先级, 度量值 ( metric ) 等.
路由信息可通过多种协议的学习而来, 其来源方式可分为直连路由, 静态路由, 缺省路由和动态路由. 一个路由器上可以同时运行多个不同的路由协议, 每个路由协议都会根据自己的选路算法计算出到达目的网络的最佳路径, 但是由于选路算法不同, 不同的路由协议对某一个特定的目的网络可能选择的最佳路径不同. 此时路由器根据路由优先级 (决定了来自不同路由来源的路由信息的优先权)选 择将具有最高路由优先级 ( 数值最小) 的路由协议计算出的最佳路径放置在路由表中, 作为到达这个目的网络的转发路径 (优先级顺序: 直连路由> 静态路由 >动态路由(OSPF>RIP))
而对于一个特定的路由协议, 可以发现到达目的网络的所有路径, 根据选路算法赋予每一条路径 metric 值, 并比较 metric 值, 选择 metric 数值最小的路径为最佳路径.
在路由器的交换过程中查找路由时也可能会发现能匹配上多条路由条目. 此时路由器将根据最长匹配原则 ( 最长匹配原则的优先级最高, 大于优先级和 metric)进 行数据的转发. 路由器会选择匹配最深的, 也就是说可以匹配的掩码长度最长的一条路由进行转发.
转发功能
一般来说, 路由器的主要工作是对数据包进行存储转发, 具体过程如下:
第一步: 当一个数据帧到达某一端口, 端口对帧进行 CRC 校验并检查其目的数据链路层地址是否与本端口符合.
第二步: 如果通过检查, 则去掉帧的封装并读出 IP 数据包中的目的地址信息, 查询路由表, 并决定转发接口与下一跳地址.
第三步: 根据路由表中所查到的下一跳 IP 地址, 再从 ARP 缓存中调出下一跳的 MAC 地址, 并将转发接口的 MAC 地址作为源 MAC, 下一跳地址的 MAC 作为 目的 MAC, 封装成帧头. 同时, IP 数据包头的 TTL 减一, 并重新计算校验和.
第四步: 最后封装成帧, 经转发接口发送到输出链路上去.
那么问题来了: 路由器在诸多路由协议, 手工配置和路由策略下, 是如何选择最佳路由的? 理解这个问题, 对于掌握路由器的工作原理大有裨益.
路由选择牵涉到三个方面:
1, 各种路由协议的处理, 包括 rip,igrp,eigrp,ospf,is-is,bgp 等, 每个协议都通过 IP 数据包在路由器间传递网络的路由信息, 为路由表的建立提供信息.
2, 路由表, 它从路由协议那里接受信息, 并为转发数据包提供所需要的信息.
3, 转发过程, 它从路由表那里请求所需要信息, 为正确转发数据包做出决策.
下面从几个方面对此进行讨论.
建立路由表
每个路由协议处理路由更新时, 选择到目的地址的最佳路由, 并试图安装到路由表中. 如果只有多个动态路由协议运行, 存在争先安装路由的问题. 必须有机制来管理路由的安装. 该机制就是根据各个路由协议的优先级来决定安装过程. 每个路由协议都有缺省的管理距离值, 值愈小其优先级愈高. 各路由协议的缺省管理距离值如:
假设路由器运行 EIGRP ,OSPF,RIP,IGRP 四种路由协议, 它们都得到了到网络 192.168.24.0/24 的路由, 但只有 EIGRP( internal )可将其路由安装到路由表中, 因为其管理距离值最小, 优先权最高.
备份路由
其他协议对于未安装的协议怎么处理? EIGRP 安装的路由失败了怎么办? 对此有两种解决方法, 一是每个路由协议周期性地尝试安装它们的路由到路由表中, 如果 EIGRP 安装的路由失效了, IGRP 会将它的相应路由安装到路由表中. 另一个办法是将未安装的路由挂靠在路由表中, 如果先前安装的路由失效了, 将挂靠的路由正式安装到路由表中.
对于没有自身路由信息表的路由协议, 比如 IGRP, 将采取第一种方法, 每次收到路由更新都尝试安装到路由表中.
对于 EIGRP ,IS-IS ,OSPF,BGP ,RIP 这样的有自身路由信息表的路由协议, 将采取第二种办法, 安装失败的路由将登记在路由表中, 当原路由条目失效时, 将通知做登记的路由协议的处理进程来安装它们的路由, 如果有多个进程来安装, 管理距离小的协议优先.
调整管理距离值
改变路由协议的缺省距离值是比较慎重的动作, 有可能导致路由循环或其他奇怪的问题, 必须非常小心! 其命令为 distance 后跟具体的值. 也可以只改变从某一协议分布进来的路由的管理距离值. 在静态路由的最后也可以跟上一个值, 改变原来的缺省值 1.
前缀长度
不同前缀长度的路由将视为不同的路由, 将同时安装到路由表中, 比如三个路由协议分别得到以下路 由:
- EIGRP (internal): 192.168.32.0/26
- RIP: 192.168.32.0/24
- OSPF: 192.168.32.0/19
三个路由的前缀长度 (子网掩码) 不同, 所以得到不同目的网络的路由, 同时安装到路由表中.
转发决策
先看一下路由器刚才安装的三个路由条目:
- router#show ip route
- ....
- D 192.168.32.0/26 [90/25789217] via 10.1.1.1
- R 192.168.32.0/24 [120/4] via 10.1.1.2
- O 192.168.32.0/19 [110/229840] via 10.1.1.3
如果目的地址为 192.168.32.1 , 将选择哪条路由呢? 这依赖于所匹配的前缀长度, 最长匹配的前缀长度优先. 匹配是用路由条目中的掩码与目的地址相与后再与网络地址比较, 相同意味着匹配. 该地址与这 三条路由都匹配, 但第一条匹配的路由前缀 (26) 最长, 所以该包将被转发到 10.1.1.1 .
如果目的地址为 192.168.32.100, 它与第一条路由不匹配, 与第二, 第三条路由匹配, 所以将被转发到 10.1.1.2.
具体的路由查找速度依赖于路由表的结构与硬件速度, 如采用二叉树结构的路由表, 那么 32 位的 IP 地址最多查找 32 次就可以决定是否找到适应的路由条目.
IP CLASSLESS 的影响
该命令只影响转发进程, 不影响路由表的建立. 看以下的例子:
- router#show ip route
- ....
- 172.30.0.0/16 is variablysubnetted, 2 subnets, 2 masks
- D 172.30.32.0/20 [90/4879540] via10.1.1.2
- D 172.30.32.0/24[90/25789217] via 10.1.1.1
- S* 0.0.0.0/0 [1/0] via 10.1.1.3
假设 ip classless 命令没有配置, 那么:
到 172.30.32.1 的包被转发到 10.1.1.1, 因为该路由是最长匹配.
到 172.30.33.1 的包被转发到 10.1.1.2, 因为该路由是最长匹配.
到 192.30.32.1 的包被转发到 10.1.1.3, 因为无对应的网络路由, 用缺省路由转发.
到 172.30.100.1 的包无法转发, 被丢弃. 为什么不用缺省路由? 因为该目的地址的主网络部分在路由表中已知, 并有子网路由, 故路由器查找对应的子 网路由, 结果没有匹配的路由, 最终丢弃该包. 如果用 IP classless 命令进行了配置, 那么最终将应用缺省 路由将数据包转发到 10.1.1.3.
总结
数据包的转发决定依赖于三部分的进程: 路由协议, 路由表, 实际的转发交换, 这三者的关系图示如下:
选择路由时采取最长匹配的原则, 而路由协议安装路由的优先级取决于管理距离值.
来源: http://server.51cto.com/Net-579762.htm