Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >什么是IS-IS中间系统到中间系统?网工、运维必看!

什么是IS-IS中间系统到中间系统?网工、运维必看!

原创
作者头像
网络技术联盟站
修改于 2021-11-26 00:16:59
修改于 2021-11-26 00:16:59
1.1K0
举报

简介

IS-IS,中文全称:中间系统到中间系统,是一种开放的标准路由协议,ISO 发布了该标准,将数据报作为其 OSI 堆栈的一部分进行路由,IETF 后来重新发布了该标准,并添加了 IP 路由支持。

IS-IS 和 OSPF 之间有很多相似之处:

  • 两者都是链路状态路由协议,这意味着它们都构建了网络的“地图”。
  • 它们都通过网络泛洪链路状态数据,并构建链路状态数据库(LSDB)。
  • 此外,他们都在 LSDB 上运行 Diikjastra 算法来计算最短路径。

那么,如果它像 OSPF,为什么要使用它呢?为什么不改用 OSPF?

IS-IS 有两个巨大的优势:

首先是它的可扩展性,使用 IS-IS 构建大型网络比使用 OSPF 容易得多,这使其成为服务提供商为其基础设施提供的常见选择。

第二个优势是它对其携带的数据采取不可知论的方法,IS-IS 携带可达性数据的有效载荷,但在大多数情况下,它并不关心有效载荷中的内容,这就是它对 FabricPath 等协议有用的原因,相比之下,OSPF 只承载 IP 路由。当 IPv6 出现时,它需要一个全新版本的 OSPF (OSPFv3) 来承载 IPv6 路由,IS-IS 中没有这样的问题。

术语

由于 IS-IS 的历史是在 OSI 堆栈中,因此某些组件与我们在 TCP/IP 世界中习惯的有些不同,我们来看一下IS-IS相关的术语:

IS 是一个 中间系统,这是路由器的 ISO 名称,以及 IS-IS 的名称,它是中间系统或路由器之间的通信。

ES 是一个 端系统,这是网络上的设备,例如服务器或工作站,在原始规范中,ES 将参与 IS-IS,它不需要 DHCP 或 FHRP,因为它已经有一个本地路由表。

CLNS (无连接网络服务)是 OSI 堆栈中的网络服务, CLNP (无连接网络协议)是实现 CLNS 的协议,如果您更熟悉 TCP/IP,这会感觉不寻常,TCP/IP 并没有以这种方式将服务和协议分开,随着时间的推移,这将更有意义。

NSAP 是一个 网络服务接入点,这是第 3 层地址,用于 CLNS 数据包,这就像 TCP/IP 堆栈中的 IP 地址,IS-IS 使用 NSAP 地址进行通信,而不是 IP 地址。

TLV

TLV 中文全称: 类型长度值,是 IS-IS 中的有效载荷字段,TLV 字段携带路由信息,IS-IS 不关心这些字段中的内容,这使得它与协议无关,这有点像集装箱;这艘船不在乎集装箱里有什么。

IS-IS 使用 CLNS 进行传输,每个路由器都有一个 NSAP 地址,用于发送和接收链路状态信息,链路状态信息可能包含几个 TLV 字段。

通常将 IP 路由信息放入 TLV 中,但是任何类型的数据都可以在那里,由接收路由器决定如何处理这些信息。

度量值

与 OSPF 一样,IS-IS 使用cost作为度量,规范说这可以是宽值窄值,Cisco 路由器仅支持宽度量,窄度量不适用于 MPLS 流量工程,宽度量使用 24 位作为链路度量,使用 32 位作为路径度量。

默认情况下,所有链接的cost均为 10,这意味着在默认实现中,跳数构成度量,网络设计者可以选择更合适的成本方案。

area

与 OSPF 一样,IS-IS 使用区域,区域可以是骨干区域,也可以是普通区域,为了支持这个概念,路由器可能是以下类型之一:

  • Level 1 – 正常区域中的路由器不连接到另一个区域
  • Level 1-2 – 连接不同区域的普通或骨干区域中的路由器
  • Level 2 – 不连接到其他区域的骨干路由器

下面的拓扑显示了具有多个区域的网络示例。

在这个拓扑中有几个有趣的点,骨干区域并不像 OSPF 中那样被限制为“区域 0”,在 IS-IS 中,任何区域号都可以作为骨干网,另外可以对主干进行分区,在此拓扑中,区域 100 和区域 200 都是主干。

另一个有趣的点是区域边界不在路由器本身上,而是区域边界 在 路由器之间,这与 OSPF 不同,其中 ABR 或 ASBR 路由器是边界。

路由器级别

Level 1路由器将只与其他 Level 1路由器共享路由信息,这使它们成为 存根 路由器,在上面的拓扑中,区域 40 是一个 存根区域。区域内的路由是 1 级路由。

Level 2路由器只会与其他 Level 1路由器共享路由信息,这些路由器跟踪区域之间的路由信息,这是 Level 2路由。

Level 1-2 路由器很特殊,因为它们同时参与Level 1 和Level 2 路由,它们将区域连接在一起,这使它们成为使用汇总的理想场所,这些路由器为 Level 1和 Level 1路由维护一个单独的数据库。

区域可以相互连接,也可以使用专用的骨干区域进行传输,骨干网由执行 Level 1路由的路由器组成,包括 Level 1-2路由器,他们不会连接主机或 Level 1路由器。

小型网络根本不需要骨干网,它可以从只有 Level 1路由器的单个区域开始,作为替代方案,它可以是所有Level 1-2路由器,以便以后添加骨干网更容易。

域是一个完整的IS-IS的系统,这就像 BGP 中自治系统的概念。

区域间路由

要将数据包路由到区域外,Level 1路由器会将数据包发送到最近的具有 Level 2功能的路由器,无论目的地如何,始终使用最近的路由器,Level 1路由器没有足够的关于其他区域的信息来做出决定。

当数据包到达第 Level 2路由器时,它会通过骨干网转发到正确的区域,然后将其传递到该区域中的 Level 1路由器以进行本地交付。

为了优化路由,可以将路由从 Level 2数据库泄漏到 Level 1数据库中,此技术可防止区域外的次优路由,当泄漏路由时,他们添加了一个标志,这可以防止将它们通告回别处的 Level 2数据库。

在区域内路由数据包时,路由器使用路由器的 System-ID 进行传送,在区域之间路由数据包时,Area-ID 是地址。这些地址是NET Value 的一部分 。

NET值

网络实体名称,简称“NET”,是一个地址标识路由器,它由路由器的系统 ID区域地址组成,NET 是一种 NSAP 地址。

每个路由器的 NET 都是唯一的,它们的长度可以是 8 到 20 个字节,但通常只有 10 个字节。

NET 的一个示例是 49.0001.1720.1600.1001.00,如下例所示,这表示区域 ID、系统 ID 和 NSEL 值。

地址是一系列以点分隔的十六进制值,Area-ID 的长度可变,但必须至少为 1 个字节,它通常是一个三字节值,第一个字节( 在本例中为49)是 AFI或地址族标识符,对于 IS-IS,这通常设置为 49,这是私有寻址的 OSI 值,本例中的0001指的是区域 1。

System-ID 需要在区域内唯一,但在不同区域可能会重叠,将它与区域 ID 结合起来,可以使整个地址唯一,在 Cisco 的 IS-IS 实现中,System-ID 是 6 个字节。

该 NSEL 为N选择器,这在 OSI 堆栈中具有特殊含义,但对于 IS-IS,这将始终设置为零。

邻接

IS-IS 使用 协议数据单元或 PDU 进行通信,这就像 OSPF 中的数据包。

一个 IS-IS Hello PDU中,或 IIH,就像是OSPF Hello报文,路由器交换 IIH 以形成邻居关系,并共享区域地址。

IS-IS 使用多播 MAC 地址在第 2 层发送 IIH PDU,这就是为什么每个路由器只需要一个地址(NET 或 NSAP)的原因,每个接口不需要地址,这也说明接口上的IP地址与IS-IS无关。

Level 1路由器需要匹配区域 ID,此外,Level 2路由器将忽略来自 Level 1路由器的 IIH。身份验证和网络类型也必须匹配才能形成邻居。

Level 2 和Level 1-2 路由器不需要Level 2 IIH 具有相同的区域 ID

一个 链接状态PDU,或 LSP,包含路由信息,并通告给邻居。LSP 就像 OSPF 的 LSA。有两种类型的 LSP;Level 1 LSP 和 Level 2 LSP,Level 1-2路由器发送和接收这两种类型。

LSP 包含头和 TLV 字段。TLV 字段包含正在通告的信息,例如 IP 路由。额外的 TLV 包含其他数据,如邻居信息和身份验证信息。

当网络发生变化时,路由器会将 LSP 泛洪出去,其他路由器接收这些 LSP,并使用它们来构建它们的 链路状态数据库 (LSDB)。IS-IS 在这方面比 OSPF 更有效,它将多个网络组合成一个 LSP,而不是发送许多小的 LSA,这增加了 IS-IS 的可扩展性,因为网络上可以存在更多路由器而不会过度泛洪。

当 IS-IS 在广播媒体上时,一台路由器是 指定中间系统,或 DIS,DIS 会将 LSP 泛洪出去,而不是让所有路由器泛洪该段。这就像 OSPF 中的指定路由器。

路由器举行选举来选择 DIS,如果平局,则 MAC 最高的路由器获胜,DIS 使用抢占,所以如果有更高优先级的路由器出现,它将成为新的 DIS。

没有备份 DIS,这与具有 BDR 角色的 OSPF 不同。

配置

在本实验中,我们将配置 IS-IS 来承载 IP 路由。在 IS-IS实验文件 包括拓扑最初和最后的CONFIGS。

路由器 R2 会将环回接口的 IP 汇总到 /22 网络中。

拓扑如下:

第一步是启用 IS-IS 进程,每个 IS-IS 区域使用一个单独的进程,在下面的示例中,系统 ID 在 NET 值中使用环回 0 的 IP 地址,这可以是任何值,但重新格式化环回 IP 会使故障排除更容易。

被动接口的使用与任何其他路由协议相同。

Cisco 路由器上的第一个 IS-IS 进程设置为级别 1-2,默认情况下,所有后续进程都是级别 1,使用is-type 命令更改此设置 。

然后,在接口上启用 IS-IS。

代码语言:txt
AI代码解释
复制
[rtbs name="isis_intro-configure"]
  • Show clns neighbor 确认邻居关系已经建立。
  • Show isis database 显示LSDB。这是路由器可达性信息。
  • Show clns interface 显示接口的 IS-IS 设置。
代码语言:txt
AI代码解释
复制
[rtbs name="isis_intro-adjacency"]

可以看到IS-IS已经学习到路由,并安装到路由表中。

代码语言:txt
AI代码解释
复制
[rtbs name="isis_intro-routingtable"]

在 IS-IS 进程下,可以配置汇总地址。

如果需要默认路由,则可以使用default-information originate进行通告 。

配置汇总

代码语言:txt
AI代码解释
复制
R2(config)#router isis 
R2(config-router)#summary-address 10.0.0.0 255.255.252.0 level-2

可以看到 R3 现在正在学习汇总地址,而不是每个单独的网络。

验证 R3 路由表

代码语言:txt
AI代码解释
复制
R3#show ip route isis
Gateway of last resort is not set

      10.0.0.0/22 is subnetted, 1 subnets
i L2     10.0.0.0 [115/20] via 192.168.20.1, 00:03:15, GigabitEthernet0/1
      172.16.0.0/32 is subnetted, 3 subnets
i L2     172.16.0.1 [115/20] via 192.168.20.1, 00:19:51, GigabitEthernet0/1
i L2     172.16.10.1 [115/10] via 192.168.20.1, 00:19:51, GigabitEthernet0/1
      192.168.10.0/30 is subnetted, 1 subnets
i L2     192.168.10.0 [115/20] via 192.168.20.1, 00:19:51, GigabitEthernet0/1

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
结构与算法(03):单向链表和双向链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,节点可以在运行时动态生成,节点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
知了一笑
2020/09/21
4190
结构与算法(03):单向链表和双向链表
JDK1.8HashMap源码学习-put操作以及扩容(二)
当我们继续向编号6的桶中增加值,直到数组长度达到64,接着继续增加值,使得6号桶中的节点数为7,这个时候的结构图如下:
木左
2020/09/14
5800
JDK1.8HashMap源码学习-put操作以及扩容(二)
双向链表的优雅实现
文中涉及的代码可访问 GitHub:https://github.com/UniqueDong/algorithms.git
码哥字节
2020/04/13
8900
《Java 数据结构与算法》第1章:链表
于1955-1956年,由兰德公司的Allen Newell、Cliff Shaw和Herbert A. Simon开发了链表,作为他们的信息处理语言的主要数据结构。链表的另一个早期出现是由 Hans Peter Luhn 在 1953 年 1 月编写的IBM内部备忘录建议在链式哈希表中使用链表。
小傅哥
2022/12/12
7500
《Java 数据结构与算法》第1章:链表
LinkedList源码阅读笔记
LinkedList是基于双向链表数据结构实现的Java集合(jdk1.8以前基于双向链表),在阅读源码之前,有必要简单了解一下链表。
三分恶
2020/08/20
4060
java8 HashMap数据结构实现源码解析
TreeNode继承自LinkedHashMap.Entry<K,V>,后者继承自HashMap.Node<K,V>,只是增加了两个属性before和after,用于保存当前节点的前后节点引用,从而形成一条可以双向遍历的链表。TreeNode继承自LinkedHashMap.Entry<K,V>是为了方便LinkedHashMap实现,本身并没有直接使用before和after两个属性。LinkedHashMap.Entry<K,V>的定义如下图:
全栈程序员站长
2022/07/23
3950
java8 HashMap数据结构实现源码解析
LinkedList源码学习
之前学习了ArrayList,了解了其基于数组的本质,那么LinkedList是怎么实现的?显然LinkedList是链表。也就是基于链表实现。链表分为单向链表和多向链表。那么LinnkedList具体是那种类型的链表?我们可能在工作中一直在用但是也许对LinkedList的原理不熟悉。怀着疑问,我们来解析一下吧!
写一点笔记
2020/09/01
3980
LinkedList源码学习
Java集合源码分析之LinkedList
前面一篇我们分析了ArrayList的源码,这一篇分享的是LinkedList。我们都知道它的底层是由链表实现的,所以我们要明白什么是链表?
须臾之余
2019/08/13
4830
JDK1.8HashMap源码学习-remove操作
我们看到方法比较简单,就是将传入的key进行了hash算法,然后再调用removeNode方法并将返回赋值给e,判断e是否为空,如果为空则返回null,不为空则返回key对应的value。
木左
2022/09/23
2740
JDK1.8HashMap源码学习-remove操作
JDK容器学习之LinkedList:底层存储&读写逻辑
LinkedList的底层结构及读写逻辑 链表容器,通常适用于频繁的新增删除,遍历的方式访问数据元素的场景 LinkedList 底层数据结构为链表,非线程安全,本片博文则简单分析下增删改对链表的操作姿势,以及LinkedList的迭代实现 I. 数据结构 双向链表存储,内部保存表头和表尾对象,size用来记录List的长度 transient int size = 0; /** * Pointer to first node. * Invariant: (first == null && last
一灰灰blog
2018/02/06
6010
JDK容器学习之LinkedList:底层存储&读写逻辑
6.单向链表正确实现方式
上一篇《链表导论心法》讲解了链表的理论知识以及链表操作的实现原理。talk is cheap, show me the code ! 今天让我以一起把代码撸一遍,在写代码之前一定要根据上一篇的原理多画图才能写得好代码。举例画图,辅助思考。
码哥字节
2020/04/11
3660
深入剖析LinkedList:揭秘底层原理
https://cloud.tencent.com/developer/article/2465647?shareByChannel=link
忆愿
2024/11/23
2080
深入剖析LinkedList:揭秘底层原理
JUC并发—1.Java集合包底层源码剖析二
首先会通过HashMap.hash()方法的哈希算法根据key获取其哈希值,然后调用HashMap.putVal()方法把对应的键和值设置到HashMap数组。
东阳马生架构
2025/04/21
680
Java基础(二十一):集合源码
key-value被封装为HashMap.Entry类型,而这个类型实现了Map.Entry接口
Java微观世界
2025/01/21
990
Java基础(二十一):集合源码
走进 JDK 之 LinkedList
如果你了解链表的基本结构的话,LinkedList 的源码其实还是比较容易理解的。LinkedList 是基于双向链表实现的,与 ArrayList 不同的是,它在内存中不占用连续的内存空间,相连元素之间通过 “链” 来链接。对于单链表,每个节点有一个 后继指针 指向下一个节点。对于双向链表来说,除了后继指针外,它还要一个 前驱指针 指向前一个节点。那么,双向链表有什么好处呢?既然有了前驱指针,在遍历的时候就可以向前遍历,在下面的源码分析中可以看到,这是单链表所不具备的功能。
路遥TM
2021/08/31
2820
【JDK1.8】JDK1.8集合源码阅读——LinkedHashMap
一、前言 在上一篇随笔中,我们分析了HashMap的源码,里面涉及到了3个钩子函数,用来预设给子类——LinkedHashMap的调用,所以趁热打铁,今天我们来一起看一下它的源码吧。 二、Linked
joemsu
2018/05/17
7440
掌握 HashMap 看这一篇文章就够了
最近几天,一直在学习 HashMap 的底层实现,发现关于 HashMap 实现的博客文章还是很多的,对比了一些,都没有一个很全面的文章来做总结,本篇文章也断断续续结合源码写了一下,如果有理解不当之处,欢迎指正!
纯洁的微笑
2019/10/11
6830
掌握 HashMap 看这一篇文章就够了
23张图!万字详解「链表」,从小白到大佬!
链表和数组是数据类型中两个重要又常用的基础数据类型,数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动,为了解决和平衡此问题于是就有了链表这种数据类型。
磊哥
2020/11/06
6460
Java集合-LinkedList源码解析-JDK1.8
LinkedList实际上是通过双向链表去实现的。它继承于AbstractList,实现了List、 RandomAccess、Cloneable、Serializable这些接口。
Java学习录
2019/04/18
3820
LinkedList 源码剖析
LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(它是个接口名字)。关于栈或队列,现在的首选是ArrayDeque,它有着比LinkedList(当作栈或队列使用时)有着更好的性能。
码农架构
2020/10/26
3890
LinkedList 源码剖析
推荐阅读
相关推荐
结构与算法(03):单向链表和双向链表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档