网络通信协议基础(ISIS)——架构

时隔多年,我已经不在ISIS开发部了,突然看到居然有人评论了我的文章,很高兴。

本来的想法,是把ISIS事无巨细的都写一下,但是一方面是工作量太大,另一方面还涉及信息安全,最重要的是,现在关于ISIS协议自身机制的文章还是很多的,所以,姑且写一下架构吧,期望从一个较高的角度描述一下ISIS协议,期望对大家有所帮助。

首先,大家需要知道的是,所有的三层协议基本上都差不多,比如BGP、ISIS、OSPF、PIM、LDP。三层协议的作用是打通IP层。简单的说,就是让IP流量能够顺利的从网络中的任意点A,达到任意点B。

当然,随着大众需求的日趋复杂与苛刻,我们会在这基础上,添加更多的功能。比如,限制目的地B点的范围,比如某些敏感地方不想让你到达;又比如,限制到B点的路径,A->B不能经过某个特别的点C。在满足这些需求以后,又有人要求网络发生故障的时候,几乎不能丢包,要求时延必须在任何情况下稳定在某个值等等。

这些需求成功的使得本来就复杂的三层协议变的更加臃肿。另一方面,错综复杂的协议规则形成了强大的商业壁垒,宽阔的护城河,让无数该产业的新玩家望而却步。而三层协议是否有必要真的这么复杂,这需要大家思考。

让我们去除这些杂音,看看三层协议的初衷是什么。

再说一次,三层协议的最初(基本)职责就是让网络中的任意点A,能够到达任意点B。不要拿特殊场景来抬杠,我说的是最基础的功能。当然,你非说LDP是MPLS转发,不是IP层,嗯,你说的对,领会精神就好,要不然交流起来真的很累。

那么,三层协议的实现方式,就是在协议内部构建一个拓扑,然后用一个算法找出报文转发的路径,就这么简单,三层协议就是在画拓扑图。(注意,路由学习方向和报文转发方向是相反的,不理解也没关系,就是顺便提一句)

拓扑是什么,就是图。一个图的基础元素就俩,点和线。

  1. 点:一般是网元,路由器,一个网络节点,怎么说它都行。不同协议有不同的说法,BGP叫对等体,OSPF叫router,ISIS叫IS,LDP的忘记了(好像也叫对等体),其实都是一个东西。他们的含义,就是在本协议内表达一个该协议认可的拓扑点。
  2. 线:就是点和点之间的连接,一般我们叫邻居。BGP叫peer、OSPF叫neighbor,ISIS叫adjacency。不同的协议,有的邻居要求必须是直接连接的,有的邻居可以是TCP这种跨越多台网元的。

所有的三层协议,都通过hello报文(所有协议差不多都叫这个名字)来从无到有的发现邻居,并协商各种参数。然后,在邻居的基础上互相传递彼此所知道的所有(是所有)网络信息,这样当所有的网元都完成了彼此间信息的传递,那么该网络的所有网元就都拥有了该网络的全貌,也就是拓扑图。最后,根据各自协议的特点,计算出路由(或者说流量)的路径,生成路由信息,IP层通了。

举例:彼此间的信息传递是这样的,A-B-C三个网元串联,A-B发现彼此并建立邻居后,A和B互通拓扑信息。此时,A的拓扑信息里有A/B两个点,A和B是直连的,即A-B。当B-C发现彼此并建立邻居后,B和C互通拓扑信息,此时B会把A和B的拓扑信息都告诉C,同时,B也会把C的拓扑信息发给A。在互相都发送/接收/处理完信息后,大家的拓扑信息里都有A/B/C三个点,A、B和C是串联的,即A-B-C。

好,接下来进入正题,ISIS架构,其实上面说的基本上都适用于ISIS。

我们分析问题通常都要关注两个事情:

  1. 我们有什么
  2. 我们要达到什么目标

ISIS协议有什么?也就是说,ISIS的环境是什么样的?

作为一个ISIS网元,初始状态,即需要面对的问题如下:

  1. 此时IP路由表里没东西。(这是当然了,ISIS就是负责打通IP层的,IP路由表等着ISIS填呢)
  2. 不知道周边都有谁。(谁知道对端有没有网元,有没有配置ISIS)
  3. 不知道周边的变化。(对端网元死机、重启、断电、程序实现错误等,本地都是不知道的,没手段传递过来)

对于问题1,决定了ISIS只能在本地接口上发送单跳hello报文(hello报文不能转发,只用来在直连链路上发现彼此)。

对于问题2,决定了ISIS只能摸黑的在所有本地接口周期(注意,是周期,一直不停)的发送hello报文。

对于问题3,因为始终不知道对端情况,对端随时有可能不理你、突然出现、实现错误、发送了错误的协议报文,等等。所以,ISIS的hello必须是随时发送的,并且要随时判断对端的状态是否正确。除了对端设备故障,还需要防范恶意破坏,设备实现错误,同时,还要识别设备正常连接。

所以说,ISIS的生存环境挺恶劣的。

为了应对这种情况,ISIS的最基础层就是hello层。关于hello的机制,这里就不说了。整套hello机制,配合一些扩展协议就能应对上面的3个问题,为ISIS上层提供安全可信的连接。

hello机制可以自动发现直连邻居,也能监控邻居状态,可以在对端不通知自己的情况下,识别出对端故障,还能在对端无法出示有效安全证明的情况下,断开邻居。当然,当对端有能力通知自己断邻居时,也能立刻断开邻居。对端能够满足己方邻居建立要求的时候,也能恢复邻居建立。

hello机制还可以识别链路MTU,抛弃掉MTU不满足流量要求的链路。配合BFD协议,还能实现邻居故障的快速发现(从30秒的故障检测周期提高到毫秒级)。配合DR机制(不懂也没关系,不是重点)可以大幅简化拓扑复杂度。配合GR机制(非重点),能够做到一定程度的设备重启不丢包等。

总之,作为ISIS架构的基础层,hello完成了与链路/邻居有关的动作,最终能够给出所有与该设备直接连接的所有其他ISIS设备的信息。可以认为,hello完成了以自己为中心,周边一跳范围内(与自己直连)的拓扑收集与描绘。

此部分内容,参见协议ISO 10589的第8章。注意,ISIS协议有个伴生协议叫ISES。ES可以简单理解为PC,ISES就是路由器与PC之间连接的协议。目前大部分厂商没实现这个。可以先放放再说,包括ESH、ISH啥的,都可以先放放,先关注IIH。

好了,我们现在有了自己周围的拓扑,那么ISIS第二层LSDB就是负责在网络范围内互相传递自己hello层收集的拓扑。大家都把自己的拓扑发出去,同时都收到了其他人的拓扑信息,每个网元就能组装出全网拓扑了。

LSDB面对的现状:

  1. 每个人都有自己的拓扑
  2. 每个人都与自己周围的网元建立了邻居
  3. 每个人看不到远端的网元

LSDB层的ISIS协议报文叫LSP(和LDP协议中的标签交换路径的缩写相同)。这个大家想一想就知道,LSP肯定不能只传递一跳,因为它要负责在网络内互相传递信息。

但是,前文说过,现在IP层没通,LSP怎么发送到远端网元呢?目前还没有跨两个网元以上的路径呢,大家都只知道自己周围的情况。

那么,我们拥有什么?我们就拥有自己周围的情况。那就只能用这个信息了呗。

LSP的传递方法如下:A-B-C串联,A的LSP发给B,B把A的LSP再发给C,就行了。

总结:网元A从接口1收到了网元D的LSP,A会把LSP从所有接口(除了接口1)转发出去。全网都这么做,最终LSP会像洪水一样发送到全网。这个动作,在协议里被形象的说成泛洪(flood)

经过思考的读者会说,这样不会传来传去,永无止境了么?思考的对,ISIS有机制保证了这一点。这里就不展开了。

LSDB层能够在全网范围内(ISIS中area、level的概念会导致我这句话描述的不准确,嗯,大家领会精神)将彼此的本地拓扑信息泛洪。LSDB支持在任意情况(只要不是永久故障)下,保证网络内的所有网元的信息是一致的。所有网元都拥有网络内其他网元的全部信息。各个网元因为是完全松散的集合,可以将LSDB看成是一个高可靠性的分布式数据库系统。LSDB能够支持网络中任意网元的故障,上线,邻居中断,设备频繁变更,仿冒入侵,恶意攻击等场景。

总结:LSDB层,能够时刻(有点夸张,不是真的是时刻)维持全网的信息同步,让网络内所有网元的拓扑信息得到及时同步。

说到这里,要提一个概念,叫收敛。大家也知道,不管是hello还是LSDB,在网络发生变化的时候,都需要一丢丢时间来恢复。我们认为,从网络变化(任何变化)引起的丢包开始,到ISIS下发新的路由,从而不再丢包结束,这段丢包时间(现在各厂商都是秒/毫秒级)称为收敛时间,这期间的一系列动作,称为收敛。

本文说的时刻啊、立即啊啥啥的,都是忽略收敛时间的哈。实际情况是,每次网络变化,都会伴随着收敛,从而导致可能的少量丢包。这个是所有三层协议不可避免的。所以,本文中不要较真,我说时刻啊,立即啊,意思是收敛时间足够短,在一定时间内能办到的意思。

到LSDB为止,网络中的所有网元都拥有的全网的拓扑图。按照上文的说法,ISIS协议,按照自己的算法计算出了一条路径。而这条路径,就决定了IP路由表中的表项的下一跳。

那你问我路由表项中的目的地(Destination IP,简称DestIP)是咋生成的呢?DestIP就是hello阶段收集到的本地接口的IP地址(可能是网段地址,也可能是主机地址)。我们可以粗略的说,全网路由的本源就两个,一个是直连路由(接口上的IP),一个是静态路由(管理员手工配置的)。

好,下面我们说第三层SPT。

SPT就是最短路径树,SPT算法就是那个迪杰斯特拉算法。这个东西能算出从本地出发,到拓扑中任意节点的最短路径。另外,如果全网所有网元的拓扑都一样,那么SPT算法还能保证每个网元以自己为根计算出的SPT,不会让流量绕圈(环路,就这样:A->B->C->A)。

  1. 所有网元计算SPT所基于的拓扑一样
  2. 以自己为根

要说数学家很伟大呢。

ISIS基础协议ISO10589用巨大的篇幅(学习ISIS的话,3/4的时间在看LSDB)设计了LSDB,就是为了保证上面的1:所有网元的拓扑一样。

如果不一样呢?那就可能产生环路、黑洞,反正就有可能丢包。这个也是收敛过程中不可避免的现象。因为网络某处故障的时候,总有些网元先知道(比如与其直连的),有些后知道。这一瞬间,网络中网元的拓扑不一致了(当然,很快又会一样了),会有可能产生不好的事情,我们叫它微环。

SPT模块很简单,计算出个树就行。

有了树,本地网络就知道,到达网络内任意点A,从接口1出去最近,并且沿途所有网元都会按照这个路径来转发。

那么如何从拓扑路径生成路由呢?很简单,我知道到达网元A的路径了,那么我自然知道了网元A上所有直连路由(网元A发布的路由)的路径(和网元A的路径相同,到了网元A就等于到了网元A所发布的路由)。

于是DEC(Decision)模块就干了这个,ISIS的第四层。

当然,DEC模块在实际实现的时候功能很多,其他各层都有自己的扩展特性。以便于让ISIS协议承担更多的功能,或者表现出更加良好的性能、可靠性等DFX质量属性。但这些都不是本文想要描述的内容,因为如果展开说的话,估计要出书了,内容太多,哈哈。

总的来说,ISIS有如下四层:

  1. Hello
  2. LSDB
  3. SPT
  4. 路由计算

当然,你非说我要按照其他分发来分,也可以。反正功能上大体是这样。

而其他协议呢,其实也差不多,比如BGP里的第二层是UPDATE,并且它没有第三四层,因为BGP没有复杂的路由计算,所以UPDATE直接就给搞了。

OSPF呢,和ISIS一样,也这四层。

当然,本文有好多细节没说,也有一些特例存在(不遵从这四层)。

本文希望以这些文字,让大家对ISIS整体结构,以及背后的设计思路有个初步的了解。期待对你有些帮助,谢谢。

你可能感兴趣的:(基础协议,架构)