路由基础
零散知识点
- RIP基于UDP,端口号v1和v2是520,ripng是521
- 常见IP协议号:1-ICMP、2-IGMP、6-tcp、17-udp、47-gre、50-esp、88-eigrp、89-ospf、103-pim、112-vrrp
- isis是通过802.3承载的。bgp是通过tcp承载的,目的端口号为179。
- 路由协议的分类
- 按照应用范围
- IGP: RIP\OSPF\ISIS,特点:应用在同一个AS内做路由互通,通告路由条目选择最优路径。
- EGP: BGP,特点:BGP的主要特点是针对路由实施策略,可以更好的控制发送和接收的路由条目。
- 按照工作原理
矢量:靠邻居学来的路由,仅把最优的放入路由表,路由的metric及下一跳代表矢量
链路:每台路由器的每个物理链路,根据其网络类型产生至少一个链路状态,链路状态路由协议ospf使用lsa1去携带该路由器上所有的链路状态描述
- 距离矢量DV
特点:只通告路由表中最优路由
:RIP(16跳不可达)、BGP(路径矢量更确切) - 链路状态LS:OSPF、ISIS
- 距离矢量DV
- 按照应用范围
- 路由通告方式:
- 有类: RIPV1 (即不通告掩码长度,不支持不连续的子网)
- 无类:RIPV2\BGP\OSPF\ISIS
- RIP属于距离矢量且IGP协议
- 不推荐使用RIP的理由:只适应小型网络,跳数少,收敛慢,容易出环,且最好带宽一致
- Null0接口在各路由协议中的作用?有什么区别
- 在BGP中有两点原因:一是为了发布进BGP,二是为了防止环路的出现。因为bgp发布的路由必须是本地存在的路由,并且要求掩码一致,这就造成通过bgp发布聚合路由时,本地没有聚合后的网段路由,一般是通过配置一条黑洞路由,即下一跳为null,来满足这一要求的。
- 在IGP中配置指向Null0的汇总路由时均是为了防止环路的出现(ospf不会产生黑洞路由,但是isis在汇总后会产生黑洞路由)
各协议的优先级及特点
协议 | 外部优先级 | 内部优先级 |
---|---|---|
直连 | 0 | 0 |
静态 | 60 | 60 |
RIP | 100 | 100 |
OSPF | 10 | 10 |
OSPF ASE和NSSA | 150 | 150 |
ISIS L1/L2 | 15/15 | 15/18 |
EBGP | 255 | 20 |
IBGP | 255 | 200 |
只能调整外部优先级,不能调整内部优先级
为什么需要外部优先级?
用来区分不同的路由协议
如果没有外部优先级,或者外部优先级一样,那么会认为认为两条路由是来自同一个路由协议,加入这两条路由来自不同的协议,不同协议之间的算法不同,可能会导致高速链路和低速链路负载分担的情况
什么情况下比较外部优先级和内部优先级
如果同一条路由条目通过不同的路由协议学习到,需要先比较外部优先级,如果外部优先级一样,比较内部优先级
什么情况下需要比较路由条目的metric值
如果同一条路由条目通过同一种路由协议的不同邻居学到,需要比较metric值,metric值越小越优
为什么这么设计优先级
为了避免次优路径
左边运行RIP,右边运行OSPF。sw2上的路由2.2.2.2/32,在sw3上从RIP引入到ospf,然后传到sw1时,rip的优先级为100,ospf的外部优先级为150,优选RIP,在sw1上2.2.2.2的路由为sw1->sw2
。如果ospf的内部和外部优先级都为10,则sw1上会选择ospf,则2.2.2.2的路由为sw1->sw4->sw3->sw2
协议优先级为何要有内外之分
有时为了控制路由选路需要更改协议优先级,就设定了可以改动的外部优先级, 但因为可以随便更改,就会出现这样一种情况,两种不同的协议优先级被误改为相同的优先级,比如RIP和OSPF优先级都改为一样,但这两种协议不能去比较cost值,因为两种协议间比较cost值是没有意义的,所以此时就设立了内部优先级,并且不能更改,那么在外部优先级相同情况下就可以去比较内部优先级,保证比较优先级就可以比较出来
RIP
路由信息协议,基于距离矢量算法的协议,使用跳数作为度量来衡量到达目的网络的距离,适用于规模较小的网络中。
RIPV1和RIPV2的区别
共同点
- IGP协议
- 属于距离矢量路由选择协议
- 都可以通过广播的方式通告路由条目,也可以通过单播的方式通告
- 都是使用UDP协议承载,端口号都为520
- 都是使用跳数计算最短路径,最大跳数为15跳,16跳为不可达
- 报文类型相同,只有request报文和reponse报文
- 都可以接收V1\V2版本的RIP报文
- 通告的每条路由条目长度都是20字节
不同点
- RIPV1
- 有类路由选择协议,不支持VLSM(可变长子网掩码,划分子网)和CIDR(无类别域间路由,聚合子网)
- 不支持认证
- 使用广播的方式通告报文
- 一次最多通告25条路由条目
UDP的报文长度决定的,且UDP不支持分段。UDP头部8字节=源端口+目的端口+长度+校验和各2字节,RIP头部是4字节,UDP规定最大可承载长度为512B,512-8-4=500,500/20=25 - 不支持TAG和下一跳
- 通告路由不携带子网掩码
- RIPV2
- 无类路由协议,支持VLSM和CIDR
- 支持认证,明文(20字节,位于RIP头之后,一条路由长度)和密文(40字节)
- 可以使用组播和广播的方式通告报文,组播地址224.0.0.9
- 无认证时一次最多可以通告25条路由,有明文认证可以通告24条,有密文认证可以通告23条
- 支持TAG和下一跳
- 通过路由携带子网掩码
报文格式
V2只是将V1中必须为0的字段给利用起来
V1报文格式:
V2报文格式:
- Command:表示该报文是一个请求报文还是响应报文,只能取1(请求报文)或者2(响应报文)
- Version:表示RIP的版本信息。对于RIPv1,该字段的值为1
- Address Family Identifier(AFI):表示地址标识信息,对于IP协议,其值为2(V2还可以用来描述认证信息)
- IP address:表示该路由条目的目的IP地址。这一项可以是网络地址、主机地址
- Metric:标识该路由条目的度量值,取值范围1-16
- Route tag:用于标记外部路由
- Subnet Mask:指定IP地址的子网掩码,定义IP地址的网络或子网部分
- Next Hop:指定通往目的地址的下一跳IP地址
RIP路由表的形成
RIP启动时的初始路由表仅包含本设备的一些直连接口路由。
RIP协议启动之后,RouterA会向相邻的路由器广播一个Request报文。
当RouterB从接口接收到RouterA发送的Request报文后,把自己的RIP路由表封装在Response报文内,然后向该接口对应的网络广播。
RouterA根据RouterB发送的Response报文,形成自己的路由表。
RIPV1的路由通告和接收方式
- 路由通告:
- 在同一主类网段,掩码一致直接通告,掩码不一致只通告32位的主机路由,其他则不通告
- 不在同一主类网段,则通告此网段的主类网段
- 路由接收:
- 在同一主类网段,如果主机位全为0则路由的掩码为接口地址的掩码,否则为32位主机路由
- 不在同一主类网段,接收其主类网段
主类网络:
A类:第1字节为网络号,第1比特为0,即1.0.0.0~126.0.0.0/8
B类:前2字节为网络号,前2比特为10,即128.1.0.0~191.255.0.0/16
C类:前3字节为网络号,前3比特为110,即192.0.1.0~223.255.255.0/24
D类:多播地址,前4比特为1110
E类:保留地址,前4比特为1111
定时器
- 更新定时器:定时触发更新报文的发送,默认30秒
- 老化定时器:在老化时间内没有收到更新报文则认为该路由不可达,默认180秒
- 垃圾收集定时器:在垃圾收集时间内不可达路由没有收到来自同一邻居的更新,则彻底删除该路由,默认120秒
一条路由从失效到被清除需要多长时间?300秒=180老化定时器+120垃圾收集定时器
- 抑制定时器:当RIP设备收到对端的路由更新,其cost为16,对应路由进入抑制状态,并启动抑制定时器。为了防止路由震荡,在抑制定时器超时之前,即使再收到对端路由cost小于16的更新,也不接受,当抑制定时器超时后,就重新允许接受对端发送的路由更新报文,默认0秒(
虽然存在但是默认没有开启,除非将时间修改为非0才能发挥其作用
)
前3个定时器的关系:
RIP的更新信息发布是由更新定时器控制的,每30秒发送一次。
每一条路由表项对应两个定时器:老化定时器和垃圾收集定时器。
当学到一条路由并添加到路由表中时,老化定时器启动,如果在180秒后没有收到邻居发来的更新报文,则把该路由的度量值置为16(表示路由不可达),
并启动垃圾收集定时器,如果在120秒内仍然没有收到更新报文,垃圾收集定时器超时后在路由中删除该表项。
防环
路由中毒(路由条目失效后设置为16条)不是防止的机制,而是通告路由条目失效的方法
- 水平分割:从某个接口学到的路由,不会从该接口再发回给邻居设备
广播和点到点默认开启(NBMA默认不开启),但是不可靠,因为发送方无法确认接收方是否收到路由
- 毒性反转:从某个接口学到路由后,将该路由的开销设置为16,并从原接口发回邻居设备,清除对方路由表中的无用路由
接口下如果同时开启水平分割和毒性逆转,只有毒性逆转生效
- 最大跳数:16跳即不可达
- 触发更新:路由信息发生变化时,立即向邻居发送触发更新报文,通知变化的路由信息
触发更新和更新定时器存在时间差,这个最后是通过最大条数解决环路问题
sw1的lo0失效之后发送触发更新给sw2(16跳),现在sw2同时给sw3和sw4发,结果sw3收到后删除,此时sw4还未收到,但是更新定时器到时间了,发送了更新报文,导致sw3又学到了sw1的lo0路由(2跳),即sw3认为从sw4可以到达sw1(3跳),然后就开始发送更新报文给sw2,sw2认为从sw3可以到达sw1(4跳),sw2又给sw1/2/3发送(5跳),导致出环,跳数不断增加......最后到达16条之后不可达
抗重放保护(默认关闭)
假设运行RIP的接口状态变为Down之前发送的最后的RIP报文的Identification为X此部分在IP头部,而不是RIP头部
,该接口状态变为Up后,再次发送RIP报文的Identification会变为0。如果对方没有收到这个Identification为0的RIP报文,那么后续的RIP报文都将被丢弃,直到收到Identification为X+1的RIP报文。这样就会导致双方的RIP路由信息不同步、丢失。
使能Replay-protect功能后,当接口从Down变为Up之后,再次发送RIP报文的Identification会顺次加一,从而避免了上述情况的发生。
单播
需要将端口silent后并指定一个peer,那么此端口将不会以组播和广播的方式发送报文,但是还可以接收