在互联网中,一个自治系统(AS)是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。这个网络单位可以是一个简单的网络也可以是一个由一或多个普通的网络管理员来控制的网络群体,它是一个单独的可管理的网络单元(例如一所大学,一个企业或者一个公司个体)。
一个自治系统将会分配一个全局的唯一的16位号码,有时我们把这个号码叫做自治系统(ASN)
在进行三层通信时,除了静态配置路由信息,还可以通过动态获取路由条目,而这就需要使用路由协议来帮助我们了。
根据管理范围的不同,路由协议可以分为两个大类:
1、IGP:内部网关协议(Interior Gateway Protocol)
内部网关协议(IGP)是一种专用于一个自治网络系统(比如:某个当地社区范围内的一个自治网络系统)中网关间交换数据流转通道信息的协议。网络IP协议或者其他的网络协议常常通过这些通道信息来决断怎样传送数据流。目前最常用的内部网关协议分别是:路由信息协议(RIP)和最短路径优先路由协议(OSPF)分级的链接状态路由协议(ISIS)。
2、EGP:外部网关协议(Exterior Gateway Protocol)
外部网关协议(EGP)是一种在自治系统的相邻两个网关主机间交换路由信息的协议。 EGP 通常用于在因特网主机间交换路由表信息。它是一个轮询协议,利用 Hello 和 I-Heard-You 消息的转换,能让每个网关控制和接收网络可达性信息的速率,允许每个系统控制它自己的开销,同时发出命令请求更新响应。路由表包含一组已知路由器及这些路由器的可达地址以及路径开销,从而可以选择最佳路由。每个路由器每间隔 120 秒或 480 秒会访问其邻居一次,邻居通过发送完整的路由表以示响应,代表协议是边界网关协议(BGPv4)。
如果按照算法分,也可以分成两个大类:
(1)距离矢量型路由协议,代表:RIP
(2)链路状态路由协议,代表:OSPF
在本节中,主要梳理RIP协议与OSPF 协议。
RIP(Routing Information Protocol,路由信息协议)是一种内部网关协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由信息的传递。
RIP 被定义为距离矢量路由协议,而距离矢量路由协议的根本特征就是自己的路由表是完全从其它路由器学来的,并且将收到的路由条目一丝不变地放进自己的路 由表,以供数据转发。正因为如此,对于路由是否正确,对于目标是否可达,RIP全然不知。
“距离”的定义 :
从一路由器到直接连接的网络的距离定义为 1。
从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1。
RIP 使用跳数作为 metric,跳数就是到达目标网络所需要经过的路由器个数,因为直连网络不需要经过任何路由器,所以直连网络的 metric 为 0。RIP 所支持网络的最大跳数为 15,也就是 metric 值最大为 15,一但大于 15,如 16,被 RIP 认为目标不可达,由此可见,RIP 并不适合大型网络。
RIP协议的管理距离为120。当路由表中出现了多条目标网段、子网掩码相同的路由信息时,优先选择管理距离小的协议所生成的路由信息。
RIP协议一共有两个版本:
RIPv1和RIPv2的区别:
1.RIPv1是有类路由协议,RIPv2是无类路由协议
2.RIPv1不能支持VLSM,RIPv2可以支持VLSM
3.RIPv1没有认证的功能,RIPv2可以支持认证,并且有明文和MD5两种认证
4.RIPv1没有手工汇总的功能,RIPv2可以在关闭自动汇总的前提下,进行手工汇总
5.RIPv1是广播更新(255.255.255.255 ),RIPv2是组播更新(224.0.0.9),
6.RIPv1对路由没有标记的功能,RIPv2可以对路由打标记(tag),用于过滤和做策略
7.RIPv1发送的updata最多可以携带25条路由条目,RIPv2在有认证的情况下最多只能携带24条路由
8.RIPv1发送的updata包里面没有next-hop属性,RIPv2有next-hop属性,可以用与路由更新的重定
RIP是应用层协议, 使用 UDP 数据报传送,端口号 520 将路由条目从开启了 RIP 进程的接口上发出,ver1 使用广播地址 255.255.255.255 发出,而 ver 2 使用组播地址 224.0.0.9 发出。
无论是 ver 1 还是 ver 2,都会将路由表每 30 秒定期向网络中发送,RIP 没有邻居的概念,所以自己并不知道发出去的路由更新是不是有路由器收到,而收到的路由更新,RIP 并不会绝对接受,只有当路由的发送 IP 地址和自己接收的接口 IP 地址处于同网段时,才会接收,否则忽略。如果路由表中的路由超过 180 秒都没有再次收到更新,则被标记为不可用,如果连续 240 秒没收到更新,最后将相应路由从路由表中删除。
RIP协议的三个要素:
(1)仅和相邻路由器交换信息。
(2)交换的信息是当前本路由器所知道的全部信息,即自己的路由表。RIP交换的是本路由器上完整的路由表。
(3)按固定的时间间隔交换路由信息,例如,每隔 30 秒
RIP协议在整个工作流程中主要使用四个定时器:
当此定时器超时时,立即发送更新报文。(30s)
RIP设备如果在老化时间内没有收到邻居发来的路由更新报文,则认为该路由不可达。(180s)
如果在垃圾收集时间内不可达路由没有收到来自同一邻居的更新,则该路由将被从RIP路由表中彻底删除。(240s)
默认时长为180s,当RIP设备收到对端的路由更新,其cost为16,对应路由进入抑制状态,并启动抑制定时器。为了防止路由震荡,在抑制定时器超时之前,即使再收到对端路由cost小于16的更新,也不接受。当抑制定时器超时后,就重新允许接受对端发送的路由更新报文。
路由器在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为1)。路由表中也只有到直连网络的直连路由。
以后,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。
经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。
路由表建立流程:
路由器在收到相邻路由器发来的路由表信息后,会执行距离矢量算法,算法过程描述如下:
(1)收到相邻路由器(其地址为 X)的一个 RIP 报文:
RIP 报文内容:[路由器IP(X),可达网络(Y网络),距离(Z)]
(2) 根据收到的RIP报文内容创建一个新的路由信息:
“下一跳”字段中的地址为X;“距离”字段的值加1,变为Z+1。
每个项目中的三个关键数据:到目的网络Y,距离为Z+1,下一跳路由器是X。
(3) 对获得的新路由信息,进行以下步骤:
- 若原来的路由表中没有到目的网络Y的路由条目,则把该路由信息加到路由表中。
- 若原来的路由表中已经有到网络Y 的路由条目,则比较新老路由条目信息:
若老路由条目中到Y网络的下一跳路由器地址也是X,则直接用新的路由条目替换原路由表中的路由条目。
若新路由信息中的距离字段值小于路由表中的距离字段值,则进行更新,- 否则,什么也不做。
(4) 若3分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器,即将距离置为16。
以下图为例,详细解释路由表形成:
1、刚开始,启动设备路由器A、B、C,路由表中只有路由器直连的直连路由。
2、A、B、C之间互相进行第一次路由表交换:
B路由表交换给A后:
B的路由表中目标网络为2.0.0.0 的路由条目,与A路由表中原有条目相同,直接替换(因为相同,所以保持不变)
B的路由表中目标网络位3.0.0.0的路由条目,A路由表中不存在,因此,将3.0.0.0作为目的网络,路由器B的RIP报文发出端口的IP(2.0.0.2)作为下一跳地址,原来B路由表中到达3.0.0.0网络的距离为0,因此在A的路由表中,要对这个距离加1,因此在A的路由表中,Metric值为1.
A路由表交换给B:
B路由表交换给C:
C路由表交换给B:
至此,第一次路由交换全部完成。此时只有B的路由表是完整的,A和C的路由表并不完整,还需要第二次交换。
3、第二次交换
经过与第一次交换类似的流程后,三个路由器都形成了完整的路由表。
request报文:
RIP的request消息在特殊情况下发送,当路由器需要时它可以提供即时的路由信息。 它可以请求全部的路由条目也可以请求具体的某些路由条目。最常见的例子是当路由器第一次加入网络时,通常会发送request消息,以要求获取相邻路由器的最新路由信息。
AFI为0表示请求所有的路由条目且metric值为16
response报文:
当RIP接收到request消息,将处理并发送一个response消息。消息包含自己的整个路由表,或请求要求的条目,正常情况下路由器通常不会发送对路由信息有特殊要求的请求消息。RIP会每30秒发送一个response消息,用于路由表更新
由于 RIP 没有邻居的概念,所以自己并不知道发出去的路由更新是不是有路由器收到,同样也不知道会被什么样的路由器收到,因为 RIP 的路由更新是明文的,网络中无论谁收到,都可以读取里面的信息,这就难免会有不怀好意者窃听 RIP 的路由信息。为了防止路由信息被非法窃取,RIP ver 2 可以相互认证,只有能够提供密码的路由器,才能够获得路由更新。而 RIP ver 1 是不支持认证的。RIP ver 2 可以支持明文与 MD5 认证。
路由器之间,当一方开启认证之后,另一方也同样需要开启认证,并且密码一致,才能读取路由信息。认证是基于接口配置的,密码使用 key chain 来定义,key chain中可以定义多个密码,每个密码都有一个序号,RIP ver 2 在认证时,只要双方最前面的一组密码相同,认证即可通过,双方密码序号不一定需要相同,key chain 名字也不需要相同,但在某些低版本 IOS 中,会要求双方的密码序号必须相同,才能认证成功,所以建议大家配置认证时,双方都配置相同的序号和密码。
确认合法的信息包,目前支持纯文本的口令形式:
优点:
对于小型网络,RIP就所占带宽而言开销小,易于配置、管理和实现;
“好”消息传的快;
缺点:
(1)网络规模被限制,最大跳数为15跳
(2)使用“跳数”作为度量值,以跳数的多少比较路由路径的优劣。 RIP 选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。
(3)收敛速度慢。当网络中出现拓扑变化时,需要较长的时间才会收敛。可能会导致网络中路由表信息不一致。
(4)路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。
如上图所示,当正常运行的网1突然不可达时,R1路由器将到网1的路由条目删除,但是还没来的及向 R2路由器进行更新。此时R2路由器更新计时器先超时,R2将自己的路由信息发送给R1,R1就从R2处又学习到了网1的路由信息,并且将距离设置成2。此时,R1 的路由表已经出现了错误,但路由器并不知道。
当R1的更新计时器超时后,R1又向R2发送自己的路由信息,R2用从R1路由表内学习到的路由信息将自己的到网1的路由信息进行覆盖,此时R2到网1的路由信息中,距离字段被改为3。
以此类推,在不断的路由更新中,到网1的距离会逐渐增加直至无穷大,同时R1与R2之间在到网1的路由信息上形成了路由环路。如果没有一定的措施去解决 的话,路由器将永远无法发现这个错误。
路由环路会对网络造成严重影响,导致网络性能降低,甚至使网络瘫痪。
路由环路可能造成以下后果:
距离矢量路由环路的解决方法有如下五种:
1)最大跳计数(maximum metric),RIP允许跳计数最大可以达到15,任何需要经过16跳才能到达的网络都被认为是不可达的。解决了环路时跳数会增加到无限大的问题
2)水平分隔(split horizon),限制路由器不能按照接收信息的方向去将接收到的信息再发回去。
例:路由器从f1/0口收到去往Net1的路由信息,在发送更新时,不会将关于Net1的路由信息再从f1/0口发出去。
3)路由中毒(路由毒化)或毒性反转。路由毒化用于在发往其它路由器的路由更新中将路由标记为不可达。标记“不可达”的方法是将度量设置为最大值。对于 RIP,毒化路由的度量为 16。
毒性反转:R3发现10.4.0.0不可达,立刻向外发送毒化路由,告知R2该网段不可达。R2在收到毒化路由后,会根据毒性反转,立刻向R3发送一条毒化路由。确保 R3 不会轻易受到有关网络 10.4.0.0 的错误更新的影响。
4)抑制计时器
抑制计时器可用来防止定期更新消息错误地恢复某条可能已经发生故障的路由。抑制计时器指示路由器将那些可能会影响路由的更改保持一段特定的时间。如果确定某条路由为 down(不可用)或 possibly down(可能不可用),则在规定的时间段内,任何有关该路由的信息都将被忽略。这表示路由器将在一段足够长的时间内将路由标记为 unreachable(不可达),以便路由更新能够传递带有最新信息的路由表。
5)触发更新:路由器周期性发送更新,RIP是默认每隔30秒。 触发更新就是当检测到网络拓扑发生变动时,路由器会立即发送一个更新信息给邻居路由器,而不用等待更新计时器,并依次产生触发更新通知它们的邻居路由器,此过程就叫触发更新。
以R1配置为例:
router rip
version 2
no auto-summary
network 192.168.20.0
network 192.168.1.0
路由协议 OSPF 全称为 Open Shortest Path First,也就开放的最短路径优先协议,因为 OSPF 是由 IETF 开发的,它的使用不受任何厂商限制,所有人都可以使用,所以称为开放的,而最短路径优先(SPF)只OSPF的核心思想,其使用的算法是Dijkstra算法,最短路径优先并没有太多特殊的含义,并没有任何一个路由协议是最长路径优先的,所有协议,都会选最短的。
距离矢量路由协议的根本特征就是自己的路由表是完全从其它路由器学来的,并且将收到的路由条目一丝不变地放进自己的路由表,运行距离矢量路由协议的路由器之间交换的是路由表,距离矢量路由协议是没有大脑的,路由表从来不会自己计算,总是把别人的路由表拿来就用;而 OSPF 完全抛弃了这种不可靠的算法,OSPF是典型的链路状态路由协议,路由器之间交换的并不是路由表,而是链路状态,OSPF通过获得网络中所有的链路状态信息,从而计算出到达每个目标精确的网络路径。
OSPF 工作在单个 AS,是个绝对的内部网关路由协议(Interior Gateway Protocol, 即 IGP)。
OSPF 对网络没有跳数限制,支持 CIDR和VLSM,没有自动汇总功能,但可以手工在任意比特位汇总,并且手工汇总没有任何条件限制,可以汇总到任意掩码长度。
OSPF 并不会周期性更新路由表,而采用增量更新,即只在路由有变化时,才会发送更新,并且只发送有变化的路由信息;事实上,OSPF 是间接设置了周期性更新路由的规则,因为所有路由都是有刷新时间的,当达到刷新时间阀值时,该路由就会产生一次更新,默认时间为 1800 秒,即 30 分钟,所以 OSPF 路由的定期更新周期默认为 30 分钟。
OSPF 所有路由的管理距离(Ddministrative Distance)为 110,OSPF 只支持等价负载均衡。
OSPF 支持认证,并且支持明文和 MD5 认证;OSPF 不可以通过 Offset list 来改变路由的度量值( metric)。
唯一标识一个路由器
OSPF 路由器之间相互通告链路状态,如果路由器之间分不清谁是谁,没有办法确定各自的身份,那么通告的链路状态就是毫无意义的,所以必须给每一个 OSPF 路由器定义一个身份。这就是 Router-ID,并且 Router-ID 在网络中绝对不可以有重名,否则路由器收到的链路状态,就无法确定发起者的身份,也就无法通过链路状态信息确定网络位置,OSPF 路由器发出的链路状态都会写上自己的 Router-ID,可以理解为该链路状态的签名,不同路由器产生的链路状态,签名绝不会相同。
每一台 OSPF 路由器只有一个 Router-ID,Router-ID 使用 IP 地址的形式来表示,确定 Router-ID 的方法为:
★1 .手工指定 Router-ID。
★2 .路由器上活动 Loopback 接口中 IP 地址最大的,也就是数字最大的,如 C 类
地址优先于 B 类地址,一个非活动的接口的 IP 地址是不能被选为 Router-ID 的。
★3 .如果没有活动的 Loopback 接口,则选择活动物理接口 IP 地址最大的。
OSPF 使用接口的带宽来计算 度量值。计算方法:
cost=100Mbit/接口带宽
如果路由器要经过两个接口才能到达目标网络,那么很显然,两个接口的 Cost值要累加起来,才算是到达目标网络的 Metric 值,所以 OSPF 路由器计算到达目标网络的 Metric 值,必须将沿途中所有接口的 Cost 值累加起来,在累加时,只计算出接口,不计算进接口。
OSPF 会自动计算接口上的 Cost 值,但也可以通过手工指定该接口的 Cost 值,手工指定的优先于自动计算的值。OSPF 计算的 Cost,同样是和接口带宽成反比,带宽越高,Cost 值越小。到达目标相同 Cost 值的路径,可以执行负载均衡,最多 6 条链路同时执行负载均衡。
一个10Mbit/s的接口,cost值为:100Mbit/10Mbit=10
链路状态(LSA)就是 OSPF 接口上的描述信息,例如接口上的 IP 地址,子网掩码,网络类型,Cost 值等等,OSPF 路由器之间交换的并不是路由表,而是链路状态(LSA),OSPF 通过获得网络中所有的链路状态信息,从而计算出到达每个目标精确的网络路径。OSPF 路由器会将自己所有的链路状态毫不保留地全部发给邻居,邻居将收到的链路状态全部放入链路状态数据库(Link-State Database),邻居再发给自己的所有邻居,并且在传递过程种,绝对不会有任何更改。通过这样的过程,最终,网络中所有的 OSPF 路由器都拥有网络中所有的链路状态,并且所有路由器的链路状态应该能描绘出相同的网络拓朴。
与距离矢量路由不同,距离矢量路由中交换的是完整的路由表,这样如果有人恶意攻击的话,就能够知道整个网络拓扑结构。而链路状态路由则交换链路的状态,用户无法通过这个清晰的得知整个链路拓扑。
比如现在要计算一条地铁线路图,如上海地铁二号线某段的图,如果不直接将该图给别人看,图好比是路由表,现在只是报给别人各个站的信息,该信息好比是链路状态,通过告诉别人各个站左边一站是什么,右边一站是什么,别人也能通过该信息(链路状态),画出完整的线路图(路由表),如得到如下各站信息(链路状态):
★南京东路-站 (左边一站是人民广场,右边一站是陆家嘴)
★南京西路-站 (左边一站是静安寺,右边一站是人民广场)
★静安寺-站 (右边一站是南京西路)
★人民广场-站 (左边一站是南京西路,右边一站是南京东路)
★陆家嘴-站 (左边一站是南京东路)
完整的链路状态就是:静安寺 — 南京西路 — 人民广场 — 南京东路 — 陆家嘴
在同一网络中都有接口的两台路由器,通过Hello包建立和维护邻居关系
OSPF 邻居靠发送 Hello 包来建立和维护,Hello 包会在启动了 OSPF 的接口上周期性发送,在不同的网络中,发送 Hello 包的间隔也会不同,当超过 4 倍的 Hello 时间,也就是 Dead 时间过后还没有收到邻居的 Hello 包,邻居关系将被断开。
两台 OSPF 路由器必须满足 4 个条件,才能形成 OSPF 邻居,4 个必备条件如下:
(1)Area-id(区域号码):即路由器之间必须配置在相同的 OSPF 区域,否则无法形成邻居。
(2)Hello 时间与 Dead 时间:即路由器之间的 Hello 时间和 Dead 时间必须一致,否则无法形成邻居。
(3)Authentication(认证):路由器之间必须配置相同的认证密码,如果密码不同,则无法形成邻居。
(4)Stub Area Flag(末节标签):路由器之间的末节标签必须一致,即处在相同的末节区域内,否则无法形成邻居
邻接是一种特殊的邻居。他不仅可以通过hello包进行通信,还可以互相之间发送LSA。
OSPF 只有邻接关系之间才会交换 LSA,路由器会将链路状态数据库中所有的内容毫不保留地发给所有邻接,要想在 OSPF 路由器之间交换 LSA,必须先形成 OSPF 邻接关系。
通过在多路访问网段中选择出一个核心路由器,称为 DR(Designated Router),网段中所有的 OSPF 路由器都和 DR 互换 LSA。DR 就会拥有所有的 LSA,并且将所有的 LSA 转发给每一台路由器。
如果 DR 失效后,那么就会造成 LSA 的丢失与不完整,所以在多路访问网络中除了选举出 DR 之外,还会选举出一台路由器作为 DR 的备份,称为 BDR(Backup Designated Router),BDR 在 DR 不可用时,代替 DR 的工作
既不是 DR,也不是 BDR 的路由器称为Drother,Dother负责 和DR互换 LSA ,同时还会和 BDR互换 LSA。
注意:
Drother之间不能互换数据,这是为了防止出现环路
DR/BDR选举规则:
DR 与 BDR 的选举是在一个二层网段内选举的,即在多个路由器互连的接口范围内,与 OSPF 区域没有任何关系,一个区域可能有多个多路访问网段,那么就会存在多个 DR 和 BDR,但一个多路访问网段,只能有一个 DR
和 BDR;选举 DR 和 BDR 的规则为:
1、比较接口优先级:
选举优先级最高的成为 DR,优先级数字越大,表示优先级越高,被选为 DR 的几率就越大,次优先级的为 BDR,优先级范围是 0-255,默认为 1,优先级为 0 表示没有资格选举 DR 和 BDR。
2、Route-Id 大小:
如果在优先级都相同的情况下,Route-Id 最大的成为 DR,其次是 BDR,数字越大,被选为 DR 的几率就越大。
DR和Dorther处理数据报的区别:
所有 OSPF 路由器,包括 DR 与 BDR,都能够接收和传递目标地址为 224.0.0.5 的数据包。只有 DR 和 BDR 才能接收和传递目标地址为 224.0.0.6 的数据包。
对于不同的网络类型,将会影响到 OSPF 的 Hello 时间与 Dead 时间,关系到 DR与 BDR 的选举与否,影响到 OSPF 邻居是自动建立还是手工建立,总结如下表:
OSPF 邻居的成功建立,并不要求双方网络类型一致,但双方网络类型不一致,将可能导致链路状态数据库中的条目无法进入路由表。
1、邻居发现
在这个过程中路由器发生了三种状态的改变:
(1)Down State:
路由器刚刚启动 OSPF 进程,还没有从任何路由器收到任何数据包,Hello 包也没有收到,在此进程,可以向外发送 Hello 包,以试图发现邻居。
(2)Init State:
OSPF一方A向另一方B发送hello报文,只是 OSPF 路由器B收到了A的 Hello,但并没有双方都交换 Hello,即B尚未与A交换hello报文。此时邻居关系还未建立。
注意:在Init State状态这边,由于发送hello包的方式不同,还可能出现另一种状态:Attempt状态.
Attempt状态
因为 OSPF 使用组播发送数据包,如使用组播发送 Hello 包,如果 Hello 包不能发出去被其它路由器收到,就不能和其它路由器建立 OSPF 邻居;在一些组播不能发送的网络中,例如帧中继这样的非广播网络环境,组播不能够传递,在这种情况下,就需要指定 OSPF 使用单播向邻居发送 Hello 包,以此试图和指定的邻居建立 OSPF邻居关系,在此状态下,OSPF 称为 Attempt 状态。
(3)Two-way:
双方都已经交换了 Hello 信息,并且从 Hello 中看到对方已经将自己列为邻居,此状态,就表示 OSPF 邻居关系已经建立,并且如果是需要选举 DR 和 BDR 的话,也已经选举出来,但 OSPF 邻居之间并不一定就会交换 LSA,如果不需要交换 LSA,则永远停留在此状态,如果需要形成邻接并互相交换 LSA,则状态继续往下进行。(比如 Drother 与 Drother 之间将永远停留在 Two-way 状态,因为 Drother 与 Drother 之间不需要交换 LSA。)
在邻居发现环节,主要交互的报文就是Hello报文。
Hello报文:携带参数,建立和维持邻居关系在多路访问网络中选举DR、BDR
2、路由通告
在这个工程中,主要经历四种状态:
(1)Exstart:
因为在 OSPF 邻居之间交换完整的 LSA 之前,会先发送 Database Description Packets (DBD),Link-state Request (LSR)等数据包,邻居之间是谁先发,谁后发,需要确定顺序,在 Exstart状态,就是确定邻居之间的主从关系(Master—Slave 关系),Router-ID 数字大的为主路由器,另一端为从路由器,由主路由器先向从路由器发送信息。在选举 DR与 BDR 的网络环境中,并不一定 DR 就是主路由器,BDR 就是从路由器,因为 DR和 BDR 可以通过调整接口优先级来控制,所以 DR 也许是因为优先级比 BDR 高,而Router-ID 并不比 BDR 高。
注:在任何网络环境下,OSPF 在交换 LSA 之前,都需要确定主从关系。
(2)Exchange:
就是交换DBD(Database Description Packets )的过程,DBD 只是 LSA 的简单描述,只包含 LSA 的一些头部信息,收到 DBD 的路由器会和自己的链路状态数据库作对比,确定需要哪些 LSA 的完整信息,就会发送 LSR 请求给邻居。
DBD其实就相当于是完整链路状态的一个目录,告诉从对方路由器,我的链路状态数据库中有哪些链路,但是不会告知具体的链路状态信息。只有当接收方从DBD中挑选出自己需要的链路状态并向发送方发送一个请求时,发送方才会将具体的链路状态信息发送出去。
(3)Loading:
邻居根据收到的 LSR(Link-State Request),向对方回复 Link-state update(LSU)。在这个状态中,双方路由器开始交换各自所需要的具体的链路状态信息。
(4)Full
等到 OSPF 都收到了邻居回复的所有 Link-state update(LSU),那么此时的数据库状态就变成了收敛状态,此状态就是 Full 状态,但此时只是数据库已经同步,但路由表却还在计算当中。
链路状态数据库中存储的是各种链路状态,但是获取链路状态并不是代表获取了路由表。这就是与距离矢量型路由的区别之处,距离矢量路由协议交换完数据后,直接形成了最终的路由表,而链路状态路由协议在获取链路状态后还要根据这些状态计算出路由表。
注:除了 Two-way 和 Full 这两个状态,邻居停留在任何状态,都是不正常。
3、路由计算
4、路由表的生成与选择
从路由器B到终端E,从拓扑图上来看有两条路径可达。但是每条链路有自己的开销值,这个值一般是根据链路是带宽来计算的,反映的是真实的链路传输能力,因此开销值越小,链路传输能力越强,传输速率越快,所以,在最终的路由表形成时,会选择开销值最小的路径作为最终的路由路径。
OSPF有五中报文类型,即上述所说的 Hello包、DBD、LSR、LSU、LSAck。
这五种数据报具有相同是报文头部:
主要字段的解释如下:
MD5 验证数据添加在 OSPF 报文后面,不包含在 Authenticaiton 字段中。
1、Hello报文格式
最常用的一种报文,周期性的发送给邻居路由器用来维持邻居关系以及 DR/BDR 的选举,内容包括一些定时器的数值、DR、BDR 以及自己已知的邻居。Hello 报文格式如图所示
主要字段解释如下:
2、DD报文格式
两台路由器进行数据库同步时,用DD 报文来描述自己的 LSDB,内容包括LSDB 中每一条LSA 的 Header(LSA 的Header 可以唯一标识一条LSA)。LSA Header 只占一条 LSA 的整个数据量的一小部分,这样可以减少路由器之间的协议报文流量,对端路由器根据LSA Header 就可以判断出是否已有这条 LSA。
主要字段的解释如下:
Interface MTU:在不分片的情况下,此接口最大可发出的 IP 报文长度。
I(Initial):当发送连续多个 DD 报文时,如果这是第一个 DD 报文,则置为1,否则置为 0。
M(More):当连续发送多个 DD 报文时,如果这是最后一个 DD 报文,则置为 0。否则置为 1,表示后面还有其他的 DD 报文。
M/S(Master/Slave):当两台 OSPF 路由器交换DD 报文时,首先需要确定双方的主(Master)从(Slave)关系,Router ID 大的一方会成为 Master。当值为 1 时表示发送方为 Master。
DD Sequence Number:DD 报文序列号,由 Master 方规定起始序列号,每发送一个 DD 报文序列号加 1,Slave 方使用 Master 的序列号作为确认。主从双方利用序列号来保证DD 报文传输的可靠性和完整性。
3、LSR
两台路由器互相交换过 DD 报文之后,知道对端的路由器有哪些 LSA 是本地的LSDB 所缺少的,这时需要发送 LSR 报文向对方请求所需的 LSA。内容包括所需要的LSA 的摘要。
主要字段解释如下:
4、LSU
LSU 报文用来向对端路由器发送所需要的 LSA,内容是多条 LSA(全部内容)的集合
主要字段解释如下:
Number of LSAs:该报文包含的 LSA 的数量。
LSAs:该报文包含的所有 LSA。
5、LSAck
LSAck 报文用来对接收到的 LSU 报文进行确认,内容是需要确认的 LSA 的Header。一个 LSAck 报文可对多个 LSA 进行确认。
1、LSA头格式
所有的LSA 都有相同的报文头,其格式如图 所示
主要字段的解释如下:
2、LSA类型
OSPF 由于有着多种区域类型,多种网络类型,多种链路类型,多种路由器身份,所以 LSA(Link-State Advertisements)也是多样的。OSPF 中共有 11 类 LSA,而在 CCIE 的要求中,只需要理解 1、2、3、4、5、7 共 6 类即可,这些 LSA 会因为区域类型,网络类型,链路类型,路由器身份的不同而不同。
(1)LSA1 ——Router LSA:本路由器所有接口的链路状态汇总。
将路由器所有接口的链路状态汇总到LSA1中,在将这一个LSA1从各个接口发送出去
类型 1 的 LSA 是任何一台 OSPF 路由器都会产生的,每一台 OSPF 路由器的每一个 OSPF 接口都会有自己的链路状态,但是每台 OSPF 路由器只能产生一条类型 1 的LSA,即使有多个 OSPF 接口,也只有一条类型 1 的 LSA,因为所有 OSPF 接口的链路状态是被打包成一条类型 1 的 LSA 发送的。一个区域正是由于 LSA 1 的存在,才有精确的路由表,一个区域如果只有 LSA 1,同样可以正常通信。LSA 1 只能在单个区域内传递,ABR 不能将 LSA 1 转到发另外一个区域,并且没有任何权利修改 LSA 1。( LSA1只在本区域内洪泛,不会跨越ABR)
(2)LSA2(Network Link):DR发布,告知网络中的网络情况和所有路由器
类型 2 的 LSA 只有在需要选举 DR/BDR 的网络类型中才会产生,并且只是 DR 产生,用于描述在该网络上连接的所有路由器及子网信息,BDR 没有权利产生,LSA 2 与 LSA 1 没有任何关联,没有任何依存关系,是相互独立的。只在本区域Area内洪泛,不允许跨越ABR。
(3)LSA3(Summary Link):LSA1的汇总和简化,可以跨区域。
类型 3 的 LSA 就是将一个区域的 LSA 发向另一个区域时的汇总和简化,ABR 其实就是将 LSA 1 汇总和简化,变成 LSA 3 后再发到另一个区域的,如果是详细完整的LSA 1,是绝不允许的,LSA 3 是 LSA 1 的缩略版。
(4)LSA4(ASBR Summary Link):ABR发送,告知OSPF区域内路由器如何到达ASBR路由器。
对于外部路由,执行重分布的路由器 ASBR 在 LSA 中写上自己的 Router-ID,然后传递到多个 OSPF 区域,所以会被多个 ABR 转发,而 ABR 在转发外部路由的 LSA 时,是没有权限修改 LSA 的 Router-ID,这样一来,外部路由的 Router-ID 在所有 OSPF 路由器上都不会改变,永远是 ASBR 的 Router-ID,最终造成的结果是只有与ASBR 同在一个区域的路由器才能到达外部路由,因为只有与 ASBR 同在一个区域的路由器才知道如何到达 ASBR 的Router-ID,而其它区域的路由器对此却无能为力;为了能够让 OSPF 所有区域都能与外部路由连通,在 ABR 将外部路由从 ASBR 所在的区域转发至其它区域时,需要发送单独的 LSA 来告知如何到达 ASBR 的 Router-ID,因为 ABR将外部路由的 LSA 告诉了其它区域,是有义务让它们与外部路由可达的,所以额外发送了单独的 LSA 来告知如何到达 ASBR 的 Router-ID;这个单独的 LSA 就是类型 4 的 LSA,LSA 4 是包含的 ASBR 的 Router-ID,只要不是 ASBR 所在的区域,都需要 ABR发送 LSA 4 来告知如何去往 ASBR。
LSA4的触发条件为:ABR收到一个Type5 LSA
(5)LSA5(External Link)
类型 5 的 LSA 就是外部路由重分布进 OSPF 时产生的,并且是由 ASBR 产生的,LSA 中包含 ASBR 的 Router-ID,任何路由器都不允许更改该 Router-ID,LSA 5 中还包含 Forward Address,对于 LSA 5 的 Metric 值计算与选路规则也有所不同,详细信息请见 OSPF 外部路由部分
6、LSA7(NSSA Link)
因为 NSSA 区域可以将外部路由重分布进 OSPF 进程,而 NSSA 不是一般的常规区域,所以在 NSSA 将外部路由重分布进 OSPF 时,路由信息使用类型 7 来表示,LSA 7 由 NSSA 区域的 ASBR 产生,LSA 7 也只能在 NSSA 区域内传递,如果要传递到 NSSA之外的其它区域,需要同时连接 NSSA 与其它区域的 ABR 将 LSA 7 转变成 LSA 5 后再转发。
LSA类型7只能在NSSA区域中洪泛,到达NSSA区域ABR后,NSSA ABR将其转换成LSA类型5外部路由
随着网络规模日益扩大,当一个大型网络中的路由器都运行 OSPF 路由协议时, 路由器数量的增多会导致LSDB 非常庞大,占用大量的存储空间,并使得运行 SPF 算法的复杂度增加,导致CPU 负担很重。
在网络规模增大之后,拓扑结构发生变化的概率也增大,网络会经常处于“振荡” 之中,造成网络中会有大量的OSPF 协议报文在传递,降低了网络的带宽利用率。更为严重的是,每一次变化都会导致网络中所有的路由器重新进行路由计算。
OSPF 协议通过将自治系统划分成不同的区域(Area)来解决上述问题。区域是从逻辑上将路由器划分为不同的组,每个组用区域号(Area ID)来标识。区域的边界是路由器,而不是链路。一个网段(链路)只能属于一个区域,或者说每个运行OSPF 的接口必须指明属于哪一个区域。如图 1所示。
OSPF 划分区域之后,并非所有的区域都是平等的关系。其中有一个区域是与众不同的,它的区域号(Area ID)是 0,通常被称为骨干区域。骨干区域负责区域之间的路由,非骨干区域之间的路由信息必须通过骨干区域来转发。对此,OSPF 有两个规定:
但在实际应用中,可能会因为各方面条件的限制,无法满足这个要求。这时可以通 过配置OSPF 虚连接(Virtual Link)予以解决。
虚连接是指在两台 ABR 之间通过一个非骨干区域而建立的一条逻辑上的连接通道。它的两端必须是 ABR,而且必须在两端同时配置方可生效。为虚连接两端提供一条非骨干区域内部路由的区域称为传输区(Transit Area)。
在图 3中,Area2 与骨干区域之间没有直接相连的物理链路,但可以在 ABR 上配置虚连接,使 Area2 通过一条逻辑链路与骨干区域保持连通。
虚连接的另外一个应用是提供冗余的备份链路,当骨干区域因链路故障不能保持连 通时,通过虚连接仍然可以保证骨干区域在逻辑上的连通性。如图 4所示。
虚连接相当于在两个 ABR 之间形成了一个点到点的连接,因此,在这个连接上, 和物理接口一样可以配置接口的各参数,如发送 Hello 报文间隔等。
两台ABR 之间直接传递OSPF 报文信息,它们之间的 OSPF 路由器只是起到一个转发报文的作用。由于协议报文的目的地址不是中间这些路由器,所以这些报文对 于它们而言是透明的,只是当作普通的 IP 报文来转发。
OSPF 同其它路由协议一样,可以将其它外部协议的路由信息或其它 OSPF 进程的路由信息重分布进自己的域内,这样的路由在 OSPF 域内就是 OSPF 外部路由(External Route)。外部路由分为两类:
(1)O E2 :类型为 O E2 的外部路由,在该路由进入 OSPF 之前的 Metric 值为多少,进入 OSPF域后就不变。
(2)O E1:O E1 的路由在 OSPF 路由器上的 Metric值包含该路由进入 OSPF 域之前的 Metric 值,再加上在 OSPF 域内传递的 Metric 值。
如图所示:
R5 将 EIGRP 重分布进 OSPF,如果使用 O E2 类型重分布进 OSPF,并且取默认 Metric 值 20,那么 OSPF 域内的路由器 R1,R2,R3,R4,R5 看到外部路由的 Metric 值全部都为 20,不会有任何变化。
如果使用 O E1 类型重分布进 OSPF,并且取默认 Metric 值 20,那么 OSPF 域内的路由器在计算 Metric 值时,还会在原有Metric 值的基础上,再加上到达 ASBR(R5)所需的 Metric 值,假设 R1 选择从 R3到 R5 再到外部路由,那么 R1 到外部路由的 Metric 值为 20+1+10=31。
所以使用 O E2时,R1 到外部路由的 Metric 值为 20,而在使用 O E1 时,R1 到外部路由的 Metric值为 31。
在OSPF区域内,ABR 在将一个区域的 LSA 转发至另一个区域时,产生该 LSA 的 Router-ID 就不再是原来的 Router-ID,会被修改为ABR 的 Router-ID。OSPF 中,不同区域之间的路由互通,是由于 ABR 在转发区域 LSA 时,将 LSA 的 Router-ID 改成了自己的 Router-ID,才使得该区域可以与其它区域通信,如果没有 ABR 这种自动修改 Router-ID 的行为,那么 OSPF 不同区域间将会无法通信
执行重分布的路由器同样需要在 LSA 中写上自己的 Router-ID,其实就是 ASBR 的 Router-ID,因为外部路由会在多个 OSPF 区域之间传递,所以会被多个 ABR 转发 ,而 ABR 在转发外部路由的 LSA 时,是没有权限修改 LSA 的 Router-ID,这样一来,外部路由的 Router-ID 在所有 OSPF 路由器上都不会改变,永远是 ASBR
的 Router-ID,最终造成的结果是只有与 ASBR 同在一个区域的路由器才能到达外部路由,因为只有与 ASBR 同在一个区域的路由器才知道如何到达 ASBR 的 Router-ID,而其它区域的路由器对此却无能为力。
为了能够让 OSPF 所有区域都能与外部路由连通,在 ABR 将外部路由从 ASBR 所在的区域转发至其它区域时,需要发送单独的LSA 来告知如何到达 ASBR 的 Router-ID,此 LSA 就是后面将会详细解释的 LSA 类型的第 4 类
ASBR将外部路由重分布进OSPF区域,同时ASBR向OSPF区域内发送类型为5 的 LSA;OSPF内的ABR在收到LSA5后,会发出LSA4,告知其他的路由器,如何到达ASBR。
路由增加,就意味着 LSA 的增加,有时,在一个末梢网络中,许多路由信息是多余的,并不需要通告进来,因为一个 OSPF 区域内的所有路由器都能够通过该区域的 ABR 去往其它 OSPF 区域或者 OSPF 以外的外部网络,一个区域的路由器只要知道去往 ABR,就能去往区域外的网络,因此可以过滤掉区域外的路由进入,这样的区域称为 OSPF 末节区域(Stub Area);一个末节区域的所有路由器虽然可以从 ABR 去往区域外的网络,但路由器上还是得有指向 ABR 的路由,所以末节区域的路由器只需要有默认路由,而不需要明细路由,即可与区域外的网络通信,根据末节区域过滤掉区域外的不同路由,可将末节区域分为如下四类:
Stub Area(末节区域)
Totally Stub Area(完全末节区域)
Not-so-Stubby Area(NSSA)
Totally Not-so-Stubby Area(Totally NSSA)
1、 Stub Area(末节区域)
在 Stub Area(末节区域)下,ABR 将过滤掉所有外部路由进入末节区域,同时,末节区域内的路由器也不可以将外部路由重分布进 OSPF 进程,即末节区域内的路由器不可以成为 ASBR,但其它 OSPF 区域的路由(Inter-Area Route)可以进入末节区域,由于没有去往外部网络的路由,所以 ABR 会自动向末节区域内发送一条指向自己的默认路由,如下图:
2、Totally Stub Area(完全末节区域)
在 Totally Not-so-Stubby Area(Totally NSSA)下,ABR 将过滤掉所有外部路由和其它 OSPF 区域的路由(Inter-Area Route)进入 Totally NSSA 区域,但路由器可以将外部路由重分布进 OSPF 进程,即 Totally NSSA 区域内的路由器可以成为 ASBR,由于没有去往其它 OSPF 区域的路由,所以 ABR 会自动向 Totally NSSA 内发送一条指向自己的默认路由,如下图:
注:
★在末节区域下,ABR 自动发出的默认路由,Metric 值默认为 1,可通过命令 area area-id default-cost cost 修改,默认路由除了默认的 Cost 值以外,还会累加真实接口的 Cost 值。
★骨干区域不能配置为任何末节区域。
★当将某个区域配置为末节区域后,则区域中所有路由器都必须配置为末节区域,因为配置为末节区域的路由器上所有接口发出的 Hello 包中都会有末节标签,所有如果对方没有末节标签,则不能成为邻居。
总结对比: