一、摘要
IGP LDP同步技术使用比较广泛,但是缺乏相应的技术文档,再加上先前针对广播网接口类型做了相应的优化调整,实现方式与以前有了很大的区别,造成很多人的困扰,为此写一篇 IGP LDP同步技术的文档。文章主要由驱动 IIGP LDP同步技术出现的问题、问题分析和提供解决思路几部分组成,阅读本文后希望能够帮助读者从根本上理解 IGP LDP同步技术的整个发展过程。
二、正文
2.1问题发现
2.1.1问题背景
IGP伴随着IP网络界的出现而出现,发现邻居、同步数据库、SPF计算将计算出来的路由添加至路由表,整个过程IGP都是一气呵成,不亦快哉。这个时候IGP都是以计算速度为中心,都争先恐后地比赛着将计算结果第一时间送达路由表。
随着用户需求的要求越来越高,IP转发的瓶颈导致越来越适应不了某些需求场景,此时以MPLS为代表的新技术乘势而入,摄取了路由些许根据地。路由虽心有怨言,但是为了IP大家族的事业,也乐于积极与LDP合作,每次看到用户报文可以更快地被传送,路由心中还是不免很高兴的,毕竟其中也有自己的一份功劳。
下图1是IGP和LDP合作的蜜月期,路由协议计算路由、LDP为计算出来的路由分配标签,再向邻居同步标签,你方唱罢我登场,同年底 IGP/LDP被IP总部授予优秀团队荣誉称号,一度为IP界家喻户晓的学习典范。
图1 IGP LDP一致
蜜月期一过,两人的分歧越来越大,MPLS技术的强势发展,使得LDP曝光的机会越来越多,而传统的路由却越来越成了幕后英雄。骨子里天生的“快”文化基因使得IGP越来越不满,决定不再凡事先询问LDP,走IGP我自己的路,让别人去说吧!
果不其然,便遭到了用户的第一次投诉,用户寄出去的包裹报文离奇失踪了。IP总部高度重视,派遣监察专员前来调查,专员不负众望,终于在用户投诉期限日前一天将调查报告呈至总部,如下图2。
图2 IGP LDP不一致
调查报告显示:R1上的IGP和R2上的IGP在完成数据库同步邻居状态到达FULL,即准备将对方通告出去时,没有询问LDP邻居此时同步的状态,通告出去后使得R1到达R2的路由可达,但此时对应的标签却不可达,导致用户包裏在R1上被丢弃。
2.1.2问题定义
IP总部及时向客户通报了调查结果,并且向客户自罚三杯,郑重保证下次不会再犯。于此同时,IP总部及时召开全员大会,会上CEO严厉批评了 IGP/LDP团队,具有讽刺意味的是,一年前的今天,也是在此地两人正在接受优秀团队表彰呢!
这种突发情况的考验也使得IGP/LDP痛定思痛,决定尽释前嫌,握手言欢。两人约定:IGP向外开发布会说将有一个大新闻时,一定要询问LDP意见(数据库同步好之后将邻居连接通告出去)。用一句话来定义遇到的问题是:IGP认为链路有效,但是此时LDP却不这么认为,两者出现了不一致。
那么IGP认为链路有效的前提必须满足LDP也认为该链路有效这个条件(链路有效指的是可以通过该链路访问到邻居设备)。
2.2解决思路
如果IGP需要向外发布大新闻时,LDP却说暂不适宜,需另择时日,此时IGP该怎么办呢?
2.2.1思路过程
2.2.1.1思路分析
吸取了上一次教训后,IGP此时最能想到的做法是:那就不对外发布大新闻。也就是虽然邻居状态FULL,但是不将邻居连接添加到 LSA/LSP中去,这样的话其它路由器就不会通过我访问到邻居设备。
这样的做法可以解决先前出现的问题,会不会带来其它问题呢?客户能够接受这样的方案么?不将邻居通告出去,也就是直接将这一条路排除了,万一这条链路是到达邻居设备的唯一链路,那么到达邻居设备的可能性就没有了,这样做虽然有点破釜沉舟大义凛然不留一丝后路之豪情,但是真的是最好的办法吗?
再来回顾一下先前所遇到的问题:IGP认为链路有效的时候没有判断LDP是否也认为链路有效,如果LDP认为链路暂不可用,这个链路不应该被最终计算为到达邻居设备的出接口链路,那么退一步讲,如果我把链路通告出去,但是最终经过SPF计算到达邻居设备的出接口不是当前接口,也就不会出现先前的问题。那么有什么方法能够保证“把链路通告出去,但是最终经过SPF计算到达邻居设备的出接口不是当前接口”这个假设前提呢?
又想马儿跑又想马儿不吃草,可能吗?你别说,在这里还真行。很容易想到尽量将最差代价花费值通告出去嘛!OSPF/ISIS接口最差代价花费值Max- Metric,也就是对应最大花费值,分别为 OXFFFF和 OXFFFFFE。
2.2.1.2解决方案
IGP接口上的邻居状态到达FUL/UP时,判断对应接口上的LDP同步状态是否同步完成,如果还没同步完成,刷新 Router LSA/LSP,其中指向邻居可达信息中的花费值设置为 Max-metric。
当LDP同步完成后,通知IGP,IGP重新刷新Router LSA/LSP,将指向邻居可达信息中的花费值设置为正常接口花费值。
2.2.2意外情况
上述解决方案很完美地解决了先前遇到的问题,直到有一天IP总部的投诉电话铃声再次响起,客户的组网中LAN广播网络这次接入了多台设备。
图3 IGP LDP广播网同步场景
2.2.2.1问题描述
客户的组网图如上述图3,组网图中除了A→PE3的接口花费值为10外,其余接口花费值都为默认值1,A、B、C、E四台设备处于同一个LAN广播网中,此时B还未接入LAN广播网,其余设备之间都已经建立好IGP邻居关系并且LDP也同步好。此时PE1到达PE2的路径是:PE1一>A一>C→D—>PE2,PE1到达PE3的路径是:PE1→>A→E→PE3。
美好的时光总是如白驹过隙一般飞快,随着B连接LAN广播网的接口使能IGP和LDP,问题也随之而来。当A、C、E发现出现B这个IGP邻居时,当且仅当网络中所有设备的LDP都同步完成,所有设备指向邻居可达信息的花费值才设置为正常值,否则设置为Max-metric。
此时由于B和A、C、E之间的LDP邻居都还未同步完成,那么A、C、E会刷新自己的 Router
LSA/LSP,将指向邻居可达信息的花费值设置为Max-metric,这样一来,整个网络都会受影响:原先PE1到达PE2的路径PE1→>A→>C→>D→>PE2修改为PE1—>A→B→PE2,由于A和B之间的LDP还未同步完成,所以PE1发送PE2的流量会在设备A上丢弃,也就是先前客户所投诉的问题。PE1到达PE3的路径PE1→A→E→PE3修改为PE1一>A→PE3,虽然路径还是可达的,但是却由先前的最优路径变为次优路径。
2.2.2.2问题定义
为什么先前提供的解决方案却在广播网络中出现了问题,在点到点网络中却没有问题?
广播网和点到点网络的区别是:接口和IGP/LDP邻居的关系分别是1对1和1对多关系。是这区别导致了解决方案在不同的网络类型中表现大相径庭?
进一步分析IGP可知:广播网接口上有多个邻居,但是最终表示的是以同一个接口来代表和所有邻居之间的联系,只能以大一统的共性来表示每一个邻居,却不能对每个邻居进行个性化声明表达。
图4是真实的网络连接表达,R1当且仅当只能用唯一的链路接口来描述到达R2、R3、R4这三台邻居设备的关系,如果R1和R2之间的关系发生变化最终会影响当前的唯一链路接口,因为该链路接口是公用接口,那么也就影响R3和R4。这个就是在广播网中出现问题的根源所在。
图4 真实的网络连接表达
理想中的表达应该如图5所示,每一对邻居的关系不应该影响其它邻居对,也就是将公用的接口拆分开来不再公用,比如像VLAN技术那样,但实际上IGP目前还无法实现。
图5 理想中的网络连接表达
2.2.2.3解决思路
2.2.2.3.1思路分析
公用接口还得必须继续使用,那么还有什么办法保证每一对邻居不能影响其它对邻居呢?当发现问题无解时,此时最需要做的事情就是再重新审视下问题。
究竟在什么方面,需要每一对邻居不能对其它对邻居产生影响?每一对邻居不能其它对邻居已计算的路径结果产生影响,路径结果又是怎么解决出来的呢?是通过对数据库进行SPF计算得出的,进一步分析可以发现我们能想到方向应该是数据库,因为SPF算法我们无法控制,但是数据库我们可以控制产生。
为了满足“每一对邻居不能其它对邻居已计算的路径结果产生影响”这一个条件,那么问题就转化为后加入的设备应该怎么通告自己的 Router LSA/LSP中指向邻居可达信息,从而保证其他邻居之间的路径结果不受影响。这个方法到底可行吗?
IGP中认为到达邻居设备链路可达的条件需要双方都有指向对端的连接,也就是双向通信连接才代表链路有效,否则认为链路无效(注:SPF计算时会检查有没有Link回指,有回指表示双向Link支持,链路有效可以用于SPF计算)。这一点恰好为解决“后加入的设备应该怎么通告自己的 Router LSA/LSP中指向邻居可达信息,从而保证其他邻居之间的路径结果不受影响”提供了完美的答案,后加入设备可以通过不添加指向邻居设备的连接,使得已存在设备SPF计算时回指检查失败而不会将新加入设备设置为新的下一跳设备。
2.2.2.3.2解决方案
根据上述分析,可以很容易地得出解决方案:当接口上邻居状态到达FUL/UP时,检查一下LDP同步状态,如果LDP未同步,则不将产生指向邻居设备的连接关系添加到 Router Lsa/lsp中;如果LDP同步,则将产生指向邻居设备的连接关系添加到 Router LSA/ LSP中。
这种方案又会遇到一个先前可能出现的问题,即当接口是到达邻居设备的唯一可达链路接口时,该怎么办?先前的做法留有余地,设置为MaX metric,以防不便,现如今的解决方案却把先前这个做法摒弃了,现有做法必须兼容以前的实现方案,该如何兼容以前的实现方案呢?
其实问题也只是存在于对于当前链路是到达邻居设备唯一可达链路接口时这个条件,那么可以想到的方法是:我们能不能先判断一下当前链路是否是到达邻居设备唯一可达链路接口?如果是唯一接口的话,我们需要通告出去,但还是像以前那样通告65535吗?
如果接口是唯一可达链路的话,花费值1和65535其实都是一样的,并且可以将这种情形和LDP同步的情形合并处理,减少65535这个值状态,最终如果是唯一接口的话,通告出去的花费值依然是接口花费值。
2.2.2.3.3具体规则
前述的分析过程表达为:
广播网情况下,如果接口上的LDP邻居还未完成同步,判断该接口是否是到达该邻居设备(到达邻居设备可以转化为到达接口直连网络)唯一链路接口:
(1)如果是唯一链路接口,(即该接口是cut-edge接口,也就是从这个接口画一条线可以分为两个隔离的网络),那么按正常通告花费值;
(2)如果不是唯一链路接口,则不通告出去;
如果接口上的LDP已经完成同步,那么按通告正常花费值。
2.3 后记
每一个问题的解决方案都不大可能是完美的,解决问题的同时会引入新的问题,网络的发展同样也是基于这个规律,也正是这个规律,使得网络得以快读地向前发展。
每一个问题的解决方法都是基于一个假设前提的,有时文中会很明确地提出这个假设前提,有时却很隐晦,需要去发掘,发现了这个假设前提,会带来很多意想不到的收获。
很多技术思想都是通用的,比如文中出现的网络DR/DIS的对应关系,和ⅤRRP协议思想一致,本质就是虚拟备份机制思想,即外界调用服务主体感知不到故障,对外呈现的服务接口前后保持。