IP路由选择原理

2,535 阅读20分钟

1 IP路由选择原理

1.1 什么是IP路由

在一个IP网络中,路由(Routing)是个非常非常基本的概念。网络的基本功能,是使得处于网络中的两个 IP 节点能够进行通信,而通信实际上就是数据交互的过程,数据交互则需要网络设备帮助我们来将数据在两通信节点之间传输。 当路由器(或者其他三层设备)收到一个IP数据包,路由器会找出IP包三层头中的目的IP地址,然后拿着目的IP地址到自己的路由表中进行查找,找到“最匹配”的条目后,将数据包根据路由条目所指示的出接口或下一跳IP转发出去,如果没有任何“匹配”表项,那就继续看有没有默认路由,如果也没有默认路由,这个数据包就会被丢弃,并向这个数据包的起源发送ICMP报错消息,这就是IP 路由( Routing 。而每台路由器都会在本地维护一个路由表( Routing Table ,路由表中装载着路由器获知的路由条目(Routes),路由条目由路由前缀(路有所关联的目的地)、路由信息来源、出接口或下一跳 IP等元素构成。路由器通过静态的或者动态的方式获取路由条目并维护自己的路由表。

1.2 IP路由表

一个路由器能够正常工作,大前提就是路由表是稳定的,而且要知道到达网络各个角落的路标,所以路由表是路由器正常工作的非常根本的东西。路由表有很多行(Rows),每行标识一个表项或一条路由,路由表至少有三样东西,分别是目标网络号,路由信息的来源,出站接口。初始情况下路由器只知道直连网段的信息,这个接口的物理状态和协议状态都是 UP,才会被写入路由表中,路由信息来源标记为Direct。如果物理状态和协议状态其中一个为down,那就无法写入路由表中,即使之前写入路由表中也会被擦除。物理状态就是这个接口的物理特征,比如一端有设备另一端没有连接设备这种情况就是down,因为没有电压信号。协议状态就是这个三层接口是工作在IP协议栈里的,那么IP协议栈是正常工作的就是UP的。最后就是这个接口不能被shutdown(关闭)掉,你shutdown掉那这个接口肯定是down状态。

查看路由表:display ip routing-table

1、任何一台具有三层功能的设备都有路由表。每个条目都指向着一个目的地。

2、路由前缀是网络号+掩码的格式,这才是一个完整的路由前缀,两者缺一不可。

3、协议字段表示这一行表项是通过什么途径获得的(直连的,静态的,RIP,OSPF,ISIS, BGP)。

4、优先级字段指的是各个路由协议类型对应的路由优先级,优先级值越小越优,一般用于通过两种不同路由协议发现去往同一目的地的两条路径,会优先采用哪一条,这些优先级值都是约定好的。

5、开销字段就是从我本地到达左侧的目标网络所付出的代价。

6、标志字段D表示这条路由已经下载到底层的转发信息表了,正式在用了。

7、下一跳和出接口表示匹配的某一条表项后会按照表项指示的下一跳和出接口转发。

8、路由条目的来源有三种:直连路由-路由器本地接口所在的网段,静态路由-数通工程师手工配置的路由条目,动态路由-路由器之间动态学习到的路由(使路由器激活路由协议,他们自己就会学习到路由)注意: Ethernet 是二层接口不能配置 IP 地址。

1.3 路由优先级(Preference)

1.3.1 什么是路由优先级(Preference)

路由器可以通过多种途径获知路由条目。当路由器从两种不同的途径获知去往同一个目的地且下一跳不相同的路由时,路由器首先会比较这两条路由的优先级,优选Pre值小的路由。如果Pre值相等,例如是同种路由协议,则进一步比较开销值。

1.3.2 路由优先级的标准

1.4 静态路由

1.4.1 什么是静态路由

静态路由是为路由器手工创建路由条目,这种方式最直接,可控性高,配置简单,不消耗带宽,灵活性差。

优点:配置方便,可控性高。

劣势:如果目标网络有1个就需要配置1个静态路由,如果目标网络有1000个就需要配置1000个静态路由(工作连大),静态路由没办法响应拓扑动态变化。

1.4.2 静态路由的配置

关联下一跳IP的方式:
[Route] ip route-static 目标网络号 掩码 下一跳IP地址
关联出接口和下一跳IP地址
[Route] ip route-static 目标网络号 掩码 出接口 下一跳IP地址
配置示例:
[Route] ip route-static 192.168.1.0 24 192.168.12.2

  1. 192.168.1.0为该路由条目的网络号
  2. 24为该网络号的掩码或者前缀长度
  3. 192.168.12.2为去往该网络的下一跳IP

注意:

数据通信是双向(往返)的,因此要留意往返流量的路由。(回程数据)

路由的行为是逐跳的( Hop-By-Hop ),因此需保证沿途的每一台路由器都有路由。

1.5 默认路由

1.5.1 什么是默认路由

可以匹配任意目的地,相当于最后的求助对象。如果找到匹配表项了就按照那个表项走,如果没有找到任何匹配表项就按照这个来。用于网络的边缘路由器上或者在汇聚层设备指向出口路由器。

1.5.2 缺省路由的配置

[Route] ip route-static 0.0.0.0 0.0.0.0 192.168.1.1
[Route] ip route-static 0.0.0.0 0 192.168.1.1

1.5.3 查看及排错

Ping – 测试连通信
Tracert – 追踪到达目标网段中的每一跳
Display ip routing-table – 查看路由表
Display ip routing-table brief – 接口信息摘要(接口IP地址,状态)
Display ip routing-table protocol static – 只显示静态路由表项
Display current-configuration | in route – 把当前配置中包含route关键字的列出来

1.5.4 配置示例

R1的配置

system-view
[Huawei]sysname R1
[R1]interface GigabitEthernet0/0/0
[R1-GigabitEthernet0/0/0]ip address 192.168.1.254 24
[R1-GigabitEthernet0/0/0]quit
[R1]interface GigabitEthernet0/0/1
[R1-GigabitEthernet0/0/1]ip address 192.168.12.1 24
[R1-GigabitEthernet0/0/1]quit
[R1]interface loopback 0
[R1-Loopback0]ip address 1.1.1.1 32
[R1-Loopback0]quit
[R1]ip route-static 192.168.23.0 24 192.168.12.2
[R1]ip route-static 192.168.2.0 24 192.168.12.2

R2的配置

system-view
[Huawei]sysname R2
[R2]interface GigabitEthernet0/0/0
[R2-GigabitEthernet0/0/0]ip address 192.168.12.2 24
[R2-GigabitEthernet0/0/0]quit
[R2]interface GigabitEthernet0/0/1
[R2-GigabitEthernet0/0/1]ip address 192.168.23.2 24
[R2-GigabitEthernet0/0/1]quit
[R2]ip route-static 192.168.1.0 24 192.168.12.1
[R2]ip route-static 192.168.2.0 24 192.168.23.3

R3的配置

system-view
[Huawei]sysname R3
[R3]interface GigabitEthernet0/0/0
[R3-GigabitEthernet0/0/0]ip address 192.168.23.3 24
[R3-GigabitEthernet0/0/0]quit
[R3]interface GigabitEthernet0/0/1
[R3-GigabitEthernet0/0/1]ip address 192.168.2.254 24
[R3-GigabitEthernet0/0/1]quit
[R1]interface loopback 0
[R1-Loopback0]ip address 2.2.2.2 32
[R1-Loopback0]quit
[R3]ip route-static 192.168.12.0 24 192.168.23.2
[R3]ip route-static 192.168.1.0 24 192.168.23.2

1.5.5 验证配置

直接在R1上执行ping命令时,所产生的ICMP报文的源地址缺省为该报文出接口的IP地址,也就是192.168.12.1。

[R1] ping 2.2.2.2
PING 2.2.2.2: 56 data bytes, press CTRL_C to break
Reply from 2.2.2.2: bytes=56 Sequence=1 ttl=254 time=20 ms
Reply from 2.2.2.2: bytes=56 Sequence=2 ttl=254 time=20 ms
Reply from 2.2.2.2: bytes=56 Sequence=3 ttl=254 time=20 ms
Reply from 2.2.2.2: bytes=56 Sequence=4 ttl=254 time=20 ms
Reply from 2.2.2.2: bytes=56 Sequence=5 ttl=254 time=20 ms
--- 2.2.2.2 ping statistics ---
5 packet(s) transmitted
5 packet(s) received
0.00% packet loss
round-trip min/avg/max = 20/20/20 ms

在ping命令后使用 –a关键字,可以指定ICMP报文的源地址,该源地址需为本设备的IP地址。

[R1] ping -a 1.1.1.1 2.2.2.2
PING 2.2.2.2: 56 data bytes, press CTRL_C to break
Reply from 2.2.2.2: bytes=56 Sequence=1 ttl=254 time=30 ms
Reply from 2.2.2.2: bytes=56 Sequence=2 ttl=254 time=20 ms
Reply from 2.2.2.2: bytes=56 Sequence=3 ttl=254 time=20 ms
Reply from 2.2.2.2: bytes=56 Sequence=4 ttl=254 time=20 ms
Reply from 2.2.2.2: bytes=56 Sequence=5 ttl=254 time=20 ms
--- 2.2.2.2 ping statistics ---
5 packet(s) transmitted
5 packet(s) received
0.00% packet loss
round-trip min/avg/max = 20/22/30 ms

使用tracert命令,可以追踪从本地到目的节点沿途经过的各个设备,从而判断出报文的转发路径。

[R1] tracert 2.2.2.2
traceroute to 2.2.2.2(2.2.2.2), max hops: 30 ,packet length: 40,press CTRL_C to break
1 192.168.12.2 30 ms 10 ms 1 ms
2 192.168.23.3 10 ms 20 ms 10 ms

1.6 Loopback接口

1.6.1 什么是Loopback接口

Loopback接口,也叫回环口,它是一个逻辑的、虚拟的接口,创建完成后即可为接口配置IP地址,这个接口是不会Down掉的(除非人为关闭掉),非常稳定。Loopback接口常用于模拟路由器的直连网段,用于设备管理(远程登录),供其他协议使用,例如OSPF、BGP、MPLS等的RouteID,作为SNMPtraps发送告警消息的源地址。

1.6.2 Loopback接口的配置

[Route] interface loopback 编号
[Route] interface loopback 0 - 1023

1.7 路由汇总

1.7.1 什么是路由汇总

路由器的数据存储在动态存储器,也就是路由器需要耗费资源来存储维护这些数据,而且路由表是要计算的,如果路由器路由表非常多,去付出很多资源,如果拓扑发生变化还要做收敛等。确保路由器路由表能通的情况下,尽量减小路由表规模,从而提高网络资源利用率。到达每一个远端网络都要配置一条明细路由,最终导致路由条目过多,路由表太庞大,增加了路由器的负担。可以将多条表项利用科学的方法汇总成一条,从而达到效果。

路由汇总是一个非常重要的网络设计思想,一个可汇总的网络设计方案将使得我们的网络更加优化、路由条目更加精简、网络管理更加简单……在网络设计及部署中应时刻保有路由汇总的意识。不仅仅静态路由能够部署路由汇总,动态路由协议也都支持路由汇总功能。

1.7.2 路由汇总的计算

路由的汇总实际上是通过对子网掩码的操作来完成的。在R2上,为了到达R1下联的网络,R2使用路由汇总的工具,指了一条汇总路由: [R2] ip route-static 172.16.0.0 16 10.1.12.1 #12.1 R1 的接口 IP

虽然这确实起到了网络优化的目的,但是,这条汇总路由太“粗犷”了,它甚至将R3这一侧的网段也囊括在内,我们称这种路由汇总行为不够精确。因此,一种理想的方式是,使用一个“刚刚好”囊括这些明细路由的汇总路由,这样一来就可以避免汇总不够精确的问题。

这里不得不强调一点,网络可以部署路由汇总的前提是我们网络中IP子网及网络模型设计具备一定的科学性和合理性,因此路由汇总和网络的IP子网及网络模型的设计是息息相关的。如果你的网络规划的杂乱无章,路由汇总部署起来就相当的困难了。

要做的事情非常简单,这些个明细子网是连续的,我们只要挑出首位的两到三个网络号来计算就足够了:

1)将这些IP地址写成二进制形式,实际上,我们只要考虑第三个8位组即可,因为只有它是在变化的。

2)现在,我们要画一根竖线,这根线的左侧,每一个列的二进制数都是一样的,线的右侧则无所谓,可以是变化的,这根线的最终位置,就是汇总路由的掩码长度。注意这根竖线可以从默认的掩码长度,也就是/24开始,一格一格的往左移,直到你观察到线的左端每一列数值都相等,即可停下,这时候,这根线,所处的位置就刚刚好。

3)如上图,线的位置是16+3=19,所以我们得到汇总地址:172.16.0.0/19,这就是一个最精确的汇总地址。

1.8 IP路由查找的最长匹配原则

1.8.1 路由条目的类型(路由前缀类型)

  1. 主机路由:172.16.1.1/32,但凡32位的都可以看作主机路由,他标识的一个点。
  2. 子网路由:172.16.1.0/24它是一个子网。
  3. 汇总路由:用一条路由标识一个大的子网。
  4. 主类网络号:172.16.1.0/24这默认是一个B类地址,B类地址缺省掩码是/16位,那这个肯定做了子网划分,172.16.0.0/16是172.16.1.0/24的主类网络号。就是这个网络按照所属类别,这个类别的缺省掩码,计算后得到的网络号就是主类网络号。192.168.1.0/24的主类网络号就是自己,因为这是C类地址,用的也是缺省的24位掩码。10.1.1.0/24的主类网络号就是10.0.0.0/8。
  5. 超网(CIDR):在这个主类网络号之上,突破掩码往前,172.0.0.0/8是172.16.0.0/16的超网。
  6. 缺省地址(默认路由):0.0.0.0 0.0.0.0可以匹配任意目的地。

看上面的图,这是一个形象化的二维空间图。从外往里前缀的长度在逐渐变长,包含与被包含的关系。172.16.0.0/16包含了172.16.10.0/24,172.16.10.0/24又包含了172.16.10.0/30,172.16.10.0/30有4个子网,拿第一个子网出来,所以它包含了172.16.1.1/32,仔细看172.16.0.0/16又把里面三个包含了,如果172.16.10.2会被哪个区间包裹的最紧密,是172.16.10.0/30,但是172.16.10.2也被172.16.0.0/16和172.16.10.0/24涵盖,但是172.16.10.0/30跟172.16.10.2的匹配长度更长,这就是最长匹配原则。

所谓主类网络号,意思是该网络号按照其所属的IP地址类别区分后、对应上的默认的子网掩码长度后得到的网络号。下一个我们看到的网络号是172.16.10.0/24,这很明显是应用了VLSM可变长子网掩码之后,得到的一个172.16.0.0/16这个主类网络的一个子网( subnet 。所以所谓的子网,我们可以理解为是在网络号所属类别的默认掩码长度的基础上,将掩码“拉长”或者向主机位借位从而得到的一个子网络号。如果我们有一个IP:172.16.10.1,实际上这个IP既可以理解为在172.16.0.0/16网络内,也是在172.16.10.0/24网络内,当然,这里我们能看出来,谁更能精确匹配172.16.10.1这个IP呢?很明显是172.16.10.0/24更精确,我们说,它的匹配长度相比172.16.0.0更长。

当然子网172.16.10.0/24还可以进一步划分子网,得到172.16.10.0/30,甚至172.16.10.1/32,那么如果这些前缀都存在的情况下,当我要去查找172.16.10.1,谁的匹配度最高呢?很明显,是172.16.10.1/32这条主机前缀,或者说,主机路由,对吧?这就是最长匹配原则。现在回到172.16.0.0/16这个主类网络号,然后我们向外走,看上图。172.0.0.0/8实际上是将这个B类地址的掩码向左移了8bits,这样一来得到的这个网络号实际上是囊括了172.16.0.0/16在内的一个大的网络号,我们称其为超网

1.8.2 最长匹配原则计算方法

当路由器收到一个IP数据包时,会将数据包的目的IP地址与自己本地路由表中的表项进行bit by bit的逐位查找,直到找到匹配度最长的条目,这叫最长匹配原则。当路由器在将目的IP地址在路由表中执行查找时,采用的原则是“最长匹配原则”,也就是查找目的IP地址与路由前缀匹配度最长的表项,使用该表项作为最终数据转发的依据。

当一个数据包的目的地址是去往172.16.1.1的,路由器就会查表项并遵循最长匹配原则,所以这条去往172.16.1.1的数据从S0接口发送出去了,如果是一条去往172.16.2.1的数据,会选择S1接口发送出去,因为第一条路由表项不匹配,最后一条路由表项目前不在我最长匹配原则的范围内,如果是去往172.17.1.1的数据,会选择S2接口发送出去,因为前两条路由表项都不匹配,所以会查找默认路由,如果有默认路由就按照默认路由指示的出接口发送,如果没有默认路由,这个数据包将会被丢弃。

1.8.3 IP路由查找查找小结

  1. 不同的路由前缀(注意路由前缀包含网络号+掩码,缺一不可),在路由表中属于不同的路由
  2. 相同的前缀(网络号及掩码均相同),且通过不同的协议获取,先比较路由协议优先级,优选的条目装载进路由表,如果路由协议优先级相等,则进一步比较路由度量值(开销)。
  3. 在路由查找时拿着数据的目的地址在路由表当中查找(逐位bit by bit),且采用最长匹配原则,匹配,转发;没有匹配项,则找缺省路由,如果也没有缺省路由,则丢弃该数据包同时向数据起源主机发送ICMP报错消息。
  4. 路由器的行为是逐条的,到目标网络的沿路径每个路由器都必须有关于目标的路由,否则就会造成丢包。
  5. 数据是双向的,考虑流量的时候,要关注流量的往返。

1.9 故障分析

注意考虑逐条,往返,PC可以ping通10.1.5.1,但是往返路径不一致,而R1就不一定了,R1ping目标网络,源地址是谁?,R1有三个IP地址,如果ping命令没有指定源地址,那么会采用这个ICMP消息出接口的IP地址作为源地址,在这就使用了192.168.1.33,当数据包到达10.1.5.1网段要有一个回程路由,到达R3后查找匹配表现,得知去往192.168.1.193,那么到达R2后继续查找匹配表项,注意第三条路由表项的地址区间是192.168.1.1-192.168.1.30,而这个数据包的目的地址是192.168.1.33,显然不匹配,那就继续查找默认路由,发现也没有默认路由,因此数据包就被丢弃了,所以R1无法ping通10.1.5.1。

1.10 浮动静态路由

1.10.1 什么是浮动静态路由

为了提高可靠性和稳定性,在路由器上配置了两条去往同一目的地,分别使用不同的下一跳地址,我们发现这两条路由都是静态的,所以他们的优先级为60,开销都为0,意味着这两条路由是完全等价的,PK不出结果,都会被放入路由表当中并且都工作起来,我们称为等价负载分担/均衡。这样的情况在链路和设备上的投资都得到了回报,但是我数据究竟走左还是右,这时就需要浮动静态路由。给我们带来了路由冗余的一种机制。

\

1.10.2 浮动静态路由的配置

[R3] ip route-static 10.9.9.0 24 10.1.13.1
[R3] ip route-static 10.9.9.0 24 10.1.23.2 preference 80

静态路由优先级默认为60,我们通过修改路由表项的优先级,使能冗余,优先级越小越优,因此第一条表项被写入路由表当中,而第二条暂时隐身了,什么时候会浮现呢,就是当第一条路由表项指示的出接口发生故障,第二条路由就浮现出来了。

1.11 汇总路由存在的问题

1.11.1 汇总路由引发环路问题

路由汇总它可以保证网络的可达性去减小路由器的路由表规模,从而减少资源的损耗,然而如果使用不当,会带来环路问题。如果发现网络突然变的很卡,网络中充斥的大量广播,通过抓包发现网路中充斥着大量数据,数据的目的地址是未知名的单播地址,可以定位这个网络出现了环路,导致设备卡顿,CPU资源占用率高。虽然说三层头部有TTL值可以防环,那也得等TTL值为0时才会把数据包丢弃,路由器之间的数据量特别大,容易搞伤设备。

1.11.2 解决汇总路由引发环路问题

IP route-static 192.168.0.0 16 null 0

称为“黑洞路由”,null 0是一个保留的接口,相当于路由器的回收站,但凡是被此路由表项匹配都会丢到null 0(回收站)去。

如果有目的地址为192.168.5.0/24的数据包,则会匹配住“IP route-static 192.168.0.0 16 null 0”这条路由表项,这种思想就是解决汇总路由引发的环路问题。静态路由只能手工的创建一个防环机制,而动态路由协议(OSPF,ISIS,BGP)都有自己的路由汇总机制,当你在一台三层设备上运行了动态路由协议以及路由汇总,那这些动态协议就会自动产生一条黑洞路由来防环。

1.12 静态路由BFD

1.12.1 什么是静态路由BFD

静态路由不能响应一些变化,R1配置了静态路由,如果交换机和R2之间链路发生故障,R1是感知不到的,因此配置的静态路由就不会消失,这就存在了问题。

1.12.2 配置静态路由BFD(解决方法)

启用BFD后,R1与R2之间就会周期性探测对方的可达性,一旦发现对方不可达了,就会联动着本地关联了这组BFD的静态路由down掉,通过这种方法来解决。

• R1 的配置如下:

[R1] interface gigabitEthernet 0/0/0
[R1-gigabitEthernet0/0/23] ip address 192.168.12.1 24
[R1-gigabitEthernet0/0/23] quit
[R1] bfd  #使能BFD
[R1-bfd] quit

# 配置R1 与R2 之间的BFD Session

[R1] bfd 名称 bind peer-ip 对端IP source-ip 本端IP要与对端跑BFD的IP
[R1] bfd bfd12 bind peer-ip 192.168.12.2 source-ip 192.168.12.1
[R1-bfd-session-bfd12] discriminator local 11  # 配置本地标示符 R1 的local 对应R2 的remote
[R1-bfd-session-bfd12] discriminator remote 22  # 配置远端标示符 R1 的remote 对应R2 的local
[R1-bfd-session-bfd12] commit
[R1-bfd-session-bfd12] quit  # 使用commit 关键字使得BFD 生效

[R1] ip route-static 2.2.2.0 255.255.255.0 192.168.12.2 track bfd-session bfd12

• R2 的配置如下:

[R2] interface gigabitEthernet 0/0/0
[R2-gigabitEthernet0/0/23] ip address 192.168.12.2 24
[R2-gigabitEthernet0/0/23] quit
[R2] bfd
[R2-bfd] quit

[R2] bfd bfd12 bind peer-ip 192.168.12.1 source-ip 192.168.12.2
[R2-bfd-session-bfd12] discriminator local 22  # 配置本地标示符
[R2-bfd-session-bfd12] discriminator remote 11  # 配置远端标示符
[R2-bfd-session-bfd12] commit
[R2-bfd-session-bfd12] quit  # 使用commit 关键字使得BFD 生效

• 验证配置:

[R1] display bfd session all
-----------------------------------------------------------------------------------------
Local Remote PeerIpAddr State Type InterfaceName
-----------------------------------------------------------------------------------------
11 22 192.168.12.2 Up S_IP_PEER -
-----------------------------------------------------------------------------------------
Total UP/DOWN Session Number : 1/0