基于python的modbus协议编程_通往未来的网络可编程之路:Netconf协议与YANG Model

85d3b0ed99bb5bc0c36ab81b92ee9263.png

5da875660066a7acecc0fd803a9abbfc.png

近年来,随着全球云计算领域的不断发展与业务的不断增长,促使网络技术也不断发展,SDN技术应运而生,从最初的基于Openflow的转发与控制分离的核心思想,人们不断的去扩展SDN的外延,目前,人们可以达成一个共识,Openflow不再是必备条件(但转发与控制分离依然是核心条件),网络可编程能力慢慢地成为衡量一套SDN架构的重要标准之一。

传统的网络设备进行可编程操作,一般是基于CLI与SNMP协议去进行的,脚本也好,网管软件也罢,都是在此基础上去进行开发,实现我们今天要谈的广义范围上的网络可编程能力,进而实现很多场景的自动化。有些设备支持一些web界面的配置,通过xml进行整体配置的替换,此类极少,本篇不做赘述。

CLI

CLI(Command-line Interface),通过命令行的方式实现人机交互,是网工必备的熟练,人们每天打开软件ssh或者Telnet到设备,然后贴入一段配置,保存生效。有一天人们厌倦了这种重复,通过程序自动生成配置脚本,批量登录到设备下发配置生效,实现自动化,这是一种网络可编程的方式。说说优点,非常符合人的思维、思路与既有的技术体系。但是说到底,这种方式更倾向于人,而非网络设备。它有着以下一些缺点:

  • 厂商之间的命令集存在巨大差异,何止是厂商,同型号不同软件版本可能差异都非常大。
  • 开发人员必须熟知命令集及其使用方法,从配置层面存在安全风险。比如手一瓢,想开端口变成了关闭端口...
  • 对传输协议不强制要求(SSH与Telnet),存在生产安全风险
  • 解析与生成配置的过程及其复杂,很多时候写的正则只能是无限接近“真相”,而不是全部“真相”。
  • 没有事务性,一次配置可能部分生效,部分不生效
  • 没有自动化的检查机制,完全依赖人。比如我想测试一下这段生成的脚本对不对,有办法,但是很困难,很多时候难以简单实现。
  • 没有数据建模的思想

CLI始终是人机交互的方式,可以通过程序可以赋予网络一定的可编程能力,但它毕竟不是天生面向网络可编程的一种方式。在当今云计算与SDN的浪潮之下,不适用于网络中的大规模自动化部署,可编程能力有限,这其中的开发难度难以为外人道也。

SNMP

SNMP(SNMP,Simple Network Management Protocol),该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。它由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模式(database schema),和一组数据对象。

维基百科里的一段内容,我们划下重点,网络管理,监测,数据对象。它是用来管理网络的,能配置能采集,主要用于监测,它有数据建模,将网络设备的一些模块、特征、状态数据结构化。主要是用于网管系统(划重点,多是监控)。那我们也来说说它的缺点:

  • 可读性差。它偏向人机中的“机”,用起来可读性差,建模数据也可读性低,用的是一个ASN.1的超集。
  • 安全性受限,有v1 v2c v3三个版本,安全性依次提高,但是目前最通用的是v2c,安全性有限。v3版本从设计上很安全,但是普及性。。。
  • 无备份及恢复回滚等机制。命令行我们还有show run等方式备份,但snmp。。。
  • 极少的写操作。读很多,写很少,多用于监控。
  • 能采集的数据项有限,无法获取整台设备的配置。很多时候我们发现能用cli采集出来,但是无法用snmp采集。
  • 性能有瓶颈,采集数据上限64K,采集颗粒度过大,在大型复杂网络中可能是分钟级或者更久。这个也划下重点,我们对于颗粒度的要求也非常严格,很多时候希望几秒钟采集一次端口流量。大型网络中,传统的网管软件,我觉得是...多展开一句,现在的方式是Telemetry(比如gRPC)可以实现微秒级,有的需要软硬件结合才行,目前还未普及,但未来一定是趋势,至于这个未来什么时候来..

SNMP自诞生之日,极大地被应用在了网络监控领域,用于获取数据进行监控,配置能力的缺失与复杂导致人们对其在网络配置方面使用甚少。只有读的网络可编程...

Netconf协议与YANG Model

面向下一代网络,我们需要什么样的网络管理协议去更好地实现网络可编程能力,提高自动化的水平?

IETF于2002年在RFC3535提出了以下几点设想(实际有33条之多,结合网上资料与笔者认知,写了以下几条):

1、有对网络配置的可编程接口

2、同样的配置可以跨厂商型号

3、需要统一可读性良好的建模语言

4、完整的错误检查及恢复功能

5、事务性

有了想法,那就去实现,在2006年IETF提出了Netconf协议,基于RFC3535提出的问题进行了解决。最初的Netconf只规定了协议的基本框架和操作,定义考虑RFC3535的一些问题的解决方法,没有规定统一的建模语言,所以早期部分厂商的设备只是支持Netconf的一些基本操作,底层没有使用统一的数据建模语言。

在2010年发布了RFC6020, 提出了YANG Model建模语言,以及和NETCONF 的结合方法。一个定义的是数据建模的语言统一各厂商之间的底层资源逻辑,一个定义的是对配置数据、状态数据的操作统一各厂商的命令集,YANG模型创建的数据实例包裹在Netconf协议之中传输,二者相互结合,构建了一套新的基于YANG模型的使用Netconf协议驱动的新时代的通用网络可编程接口。

在2016年之后,Netconf协议与YANG Model紧密结合并流行开来。至此我们再去看一些SDN架构软件层面的时候,多多少少听到了这两个名词。

YANG 与Netconf,一个是静,一个动,就好比阴阳,二者衍生出了下一个时代的网络可编程世界。(当我们去看github上,YANG的仓库时也会发现,它的图标是太极,包括它名字中与“阳”的关联也多少透露出当初设计者的设计思想)

我们接下来就简单讲讲YANG Model与Netconf协议,我们先来讲数据建模语言YANG,看看它是如何描述这个网络世界的数字孪生。

YANG Model

在RFC6020的文档中,开篇明义,YANG,A Data Modeling Language for the Network Configuration Protocol。是Yet Another Next Generation (Yang) Data Modeling Language的缩写。它是一种建模语言,用于描述网络概念的。

支持定义列表、字典、甚至更复杂的数据结构,支持约束、枚举、引用导入,版本管理、命名空间。由于篇幅,我们做简单讲解,详细信息大家可以参考:

官方文档:https://tools.ietf.org/html/rfc6020

互联网博文:https://www.jianshu.com/p/ca7f5fe11fae

它可以非常简单的用结构化语言描述出这个网络设备。比如对于一个端口的定义:

16dc20142efc93086beffc328a03ca5b.png

作为一个专业的运维人员,有点网络基础和一点点编程基础就可比较清晰的了解端口的定义,它是一个list结构的,可以有多个,它的一个属性是interface-name(同时是key,唯一,不可重复),还有speed属性和duplex属性,他们都是字符串。
一个网络设备的很多属性都以YANG Model去描述,包括配置状态和运行状态。

就这样,YANG Model用结构化语言描述了这个网络世界。有兴趣额的可以看看上面的那个互联网博文,有非常深入的描述。

它可以很好的转换成XML数据,包裹在Netconf协议之中进行传输(我们后续会讲解):

c60fd763b7e78dc934e2c1f545d2b40c.png

同时为了拉平厂商之间的差异,谷歌牵头的Openconfig对数据模型就行了标准化,从官网中我们看到这样一行标语“Vendor-neutral, model-driven network management designed by users”,由用户设计的、跨厂商通用的、模型驱动的网络编程(我么先这么翻译吧)。简单点说它是为了让各厂商之间的建模是相同的,大家再去配置某些数据的时候就不用一个个去翻看各厂商的私有的yang model了。但是网络总有私有协议,不同厂商总会为了“更好的用户体验”和“更好的商业战略”去创造新的、更牛的私有协议(这真的是网络厂商的原罪啊)。图中是一些比较常用openconfig的yang model实现。

bac74df0183c82d0ccc58f6654d58399.png

dac3a04b4d9a50549b4652299d288278.png

从图中来看,我觉得还是挺多的,常用的配置比较齐全。但是实际中要看厂商是否也支持这些yang model。某科的一些高版本的设备基本都是支持的。国产的我暂时没去细看。

网络是不可能完全相同的,能做到大同,对于一个做网络运维开发的工程师来说,已经是谢天谢地了!

openconfig可以在

https://github.com/openconfig/public/tree/master/release/models

查找。私有的yang model 大家可以去各个官网查找。

Netconf协议

说完了yang model,我们来聊聊Netconf协议,yang model定义了网络世界的数字描述,Netconf定义了对数据的获取(get)与调整(config)。
Netconf对yang model描述的世界的数据yang data封装操作,实现对网络世界的管理。

b517c9d3e88bca7bef20db3165fde288.png

yang data封装在xml中,然后通过Netconf协议进行管理。它是一个分层思想很棒的协议,有层次的描述了这个协议的一些细节。我们看看上图。

  • 传输:Netconf是通过SSH协议传输,面向连接,且有安全保障。
  • 消息:通过RPC进行对网络设备的远端调用,网管发出rpc请求,网络设备恢复rpc-reply。
  • 操作:这是Netconf的灵魂所在,它支持get(配置及运行数据)、get-config(获取配置数据,且一个设备可以有多个配置数据,一个running,一个startup,多个candidate候选)、edit-config(配置网络设备的参数,支持增删改)这些常用的,还有delete-config、copy-config(复制配置到目的地,目的地可以是ftp、文件或者是正在running的配置等等)、lockunlock(对配置进行锁定,防止多进程操作导致的配置冲突或者失败等情况)等等。
  • 数据:data就是xml包裹的yang data,如上图我们所描述的那个端口一样,结构化数据易于编程。用来描述要配置或者删除或者获取的数据。

这就是Netconf的四个layer,控制端与网络设备端通过Netconf沟通,通过传统的ssh协议,用Netconf子系统,默认端口是830。如下图:

a1fb5bd69da1b3984e75987c2891bb9b.png

这个图用原始的ssh演示了交互,但是实际上我们是通过编程去实现这个过程的。编程的实现方式我后续会演示给大家。

Netconf配置网络设备,交互过程大致如下:

6bc1828296cab9b01dcedb0881d81c30.png

这个图,如此low,大家也可以看出来,是我自己画的... 我对Netconf的理解如上,网上很多图,我觉得都是不太对的,server agent 很多行为都对不上。这个是我登录设备所直观感受的,当然也和官方文档是一一对应的。

我们可以看看一些Netconf的例子:

hello,建链。

a07562f6f7682858470a7b9af9d8a7bd.png

我们看到了几个关键字,Netconf的版本,支持的YANG Model,session id。同时hello中表明我们是在什么样的命名空间下操作,此例中是Netconf对应版本。

获取配置

2fc2effaa30fc12ab981f4caeeea70cb.png

get-cofig有一个参数是source,即获取哪里的配置数据(running、startup 或者其他)。还有一个参数是filter,即在哪个yang model描述的数据模型获取哪个数据。这个对应的是网络设备当初发送的capability中的。如果成功会回复对应的配置数据。

获取配置或者运行数据

884639950a756a2718057ac7b5640707.png

类似get-config,但是获取的是running配置(个人理解)或者运行数据。可以指定filter。

复制配置

1b3b1900b4390ea1e136d12c4147dd62.png

复制操作两个参数,源与目的。成功回复的是ok标签。

编辑配置

2081c6f696e26ff51ca11c6205966a53.png

编辑配置的时候指定编辑的数据项,capability的命名空间及对应标签,比如这个是配置dhcp的,它是有http://tail-f.com/ns/example/dhcp这个yang model所描述。

优雅的关闭session

928f24449c05b3e5706bd6938a9fe1fc.png

在ssh里来回传输的就是这种报文,我们只是把报文部分摘出来,方便大家理解。

然后简单补充一些内容,供参考。

  • Netconf是基于session的,每次成功都会有一个session id。
  • 每次请求都有message id,只要是逐渐变大即可。
  • 对数据配置可以锁定,独占,通过lock操作。
  • Netconf是事务性的,操作要么全部实现,要么全部不实现。同时根据官网文档,这个事务性是针对N台网络设备的配置,即一次配置多态都可以支持事务性。不过我没操作过...
  • Netconf支持订阅,看设备性能而言,数量级大概是5个session左右,我可以订阅某数据项,当发生变化的时候,设备会告知我。
  • capability,我是这样理解的,网络设备发送的是Netconf的版本和YANG Model,控制端发送的是Netconf的版本,二者对的上Netconf版本才能继续。这条是我的直观感受。欢迎指教。
  • get edit等操作会指定要改的数据,用filter可以过滤。
  • copy-config支持把一个配置全集从某处复制到某处,某处可以是FTP File,设备上的running、startup、candidate配置。
  • Netconf还支持对配置的验证,使用validate操作。

本文还是希望做到科普,具体细节不做赘述,大家可以去看看RFC的相关协议,其实不是很长。

在实际中基于一些开源的软件,比如python的ncclient,我们可以非常方便的对网络设备进行自动化配置,实现网络可编程。这就是Netconf与YANG Model的使命所在。

网络人员阅读格式良好的YANG Model定义,基于Netconf定义的操作,使用相关的编程语言对网络设备进行可编程操作。通过这种方式铸就网络可编程的道路。

我们再去扩展的想象一下,YANG Model已经定义了网络设备的数据结构,我们可以通过Netconf去操作,那是不是也可以通过其他协议去操作呢?

答案是肯定的,实际上后续也从Netconf衍生出了很多其他的协议,比如RESTConf。如下图,

80d4daf62ba97ad060f2a993af65d351.png

YANG Model(public与native)定义了数据结构,之上是新的网管协议,Netconf、RESTCon、gRPC等等。这样我们可以通过基于HTTP RESTful API的RESTConf对网络设备操作,也可以通过基于SSH的Netconf对网络设备操作,也可以通过基于HTTP2.0的gRPC对网络设备操作,他们都是基于数据结构良好的YANG Model,编写对应的data,封装到xml或者json当中对网络设备编程,这就是未来的网络可编程之路,准确点说,是Model Driven Program,基于模型的网络可编程。网工逐步的关注于设备的参数,而不是命令集,通过阅读对应的数据模型,对网络进行参数配置。

写在最后,我为什么要开这个公众号。本人上学期间学的是计算机科学与技术,步入职场后,进行的是网络运维工作,想想分团队原因可能是我研究生是网络技术研究院导致的(手动滑稽),从最开始的网络运维到后期通过工具基于CLI去简化工作,提高效率,后逐步将工具开发成BS架构的web应用,不断接触新技术,后续不断丰富新功能,有幸赶上了开源技术与SDN的发展,逐步转型做了NetDevOps方面的工作,用自己的编程能力为团队提高运维能力,自己也乐于这一行行代码的编写中。随着编写的不断深入,逐步发现,NetDevOps应该是一个未来每个网工应该具备的技能(众人拾柴火焰高),这样才能即高屋建瓴又可快速实现。反观网络上的一些资料,说实话国内非常少,国内的氛围也不是很强,国内的很多软件都是基于老的CLI后者snmp,大家工作还是在用文本工具和SSH工具。于是希望自己能够授人以渔,将自己的经验(坑)和技能分享给更多的网络运维工程师,尽自己的一点绵薄之力。小处说,你能学点东西减少自己的工作量,着眼远处,国内的网络运维能真正向自动化方向演进。

后续会录一些视频和编写一些文章,写一个文档,感觉真费劲,欢迎订阅收藏点击喜欢在看之类的。

附录:

Netconf常见的operation

910e2cf3066154bdfd5216a330004308.png

5da875660066a7acecc0fd803a9abbfc.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php new static 效率,PHP中new static()与new self()的比较

今天在coding的时候,发现了 new static(),觉得实例化的地方不是应该是 new self()吗?查询了一下才知道两者的区别:1)在有子类集成的时候,两者的表现不一样2)php 5.2及以下的版本不支持 new static()的语法简单通俗的来说, self就是…

mfc color 亮度_双十一4K投影仪怎么选?小心别掉“亮度坑” - 电视

导读:  不少影音爱好者计划在双十一期间购入4K投影仪,组建家庭影院、升级视觉享受,却因为选购产品亮度不足,让期待落空,还耗费时间、精力。投影仪亮度不足,画面看起来像是蒙上一层纱,不清晰&a…

oracle归档模式备份恢复,oracle归档模式备份恢复

Oracle归档模式1Oracle归档模式设置1.1以系统管理员身份登录sqlplus /nologSQL>connect sys/oracle as sysdba;Connected.1.2检查当前数据库是否为归档模式SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination USE_…

dosbox edit.exe 如何使用_宅家30天,2万字节java高级工程师面试题解析,如何斩获阿里p7...

宅家里一个月,“闭关修炼”的你是不是正在为金三银四跳槽季发愁呢?小编今天说的这富含的15个互联网大厂Java高级工程师核心面试问题整理!内容包括:kafka面试题及解析18道ZooKeeper面试题及解析28道Linux 面试真题及解析45道MySQL面…

3三星闪存刷梅林_三星电子副会长李在镕造访西安

5月18日,陕西省委书记胡和平、省长刘国中在西安会见了三星电子副会长李在镕。Source:陕西日报胡和平表示,当前,陕西疫情防控取得阶段性重要成果,经济社会秩序加快恢复,包括三星在内的外资企业保持良好运行态…

stata中介效应的sobel检验_SPSS进行中介效应检验的实战操作与分析——杏花开生物医药统计...

中介变量( Mediator) 是一个重要的统计概念,如果自变量X通过某一变量M对因变量Y产生一定影响,则称M为X和Y的中介变量。研究中介作用的目的是在已知X和Y关系的基础上,探索产生这个关系的内部作用机制。在这个过程中可以把原有的关于同一现象的…

oracle复制一个表的结构图,Oracle复制表结构

Oracle复制表结构如下&#xff0c;表a是数据库中已经存在的表&#xff0c;b是准备根据表a进行复制创建的表&#xff1a;1、只复制表结构的sqlcreate table b as select * from a where 1<>12、即复制表结构又复制表中数据的sqlcreate table b as select * from a3、复制表…

鼠标图标怎么自定义_酷鱼魔鼠——给鼠标添加酷炫的特效

酷鱼魔鼠是由酷鱼软件开发的一款非常有趣的鼠标特效软件。软件可以在你移动或者点击鼠标的时候&#xff0c;展示非常酷炫华丽的鼠标移动轨迹和点击特效。软件提供了非常多的鼠标动作特效&#xff0c;可以自定义设置鼠标移动、按下、双击、单机、点击桌面图标时的特效效果。并且…

uml+oopc嵌入式c语言开发精讲_嵌入式开发中更接近底层的汇编与C语言

分享本文&#xff0c;介绍下更接近硬件底层的C语言与汇编&#xff0c;解释 CPU 如何执行代码。高级语言与低级语言学习编程其实就是学习与计算机交流的语言。因为计算机不理解人类语言&#xff0c;通过编译器把人类写的代码转成二进制代码&#xff0c;才能在机器上运行。掌握了…

oracle循环异常跳过,oracle异常处理00103 loop异常继续循环 异常处理选点

loop循环希望异常处理后继续&#xff0c;异常处理选点很重要。CREATE OR REPLACE PROCEDURE P_G_ZTE_CELL_SUM41(V_BEGIN IN VARCHAR,V_END IN VARCHAR) ASV_EXIST INT;V_TIME_BEGIN DATE : TO_DATE(V_BEGIN, YYYY-MM-DD HH24);V_TIME_END DATE : TO_DATE(V_END, YYYY…

delphi xe http 收不到反馈消息_好消息!浦东这个小区3幢多层住宅都要加装电梯啦→...

原标题&#xff1a;好消息&#xff01;浦东这个小区3幢多层住宅都要加装电梯啦→好消息&#xff01;东明路街道这个小区要加装电梯&#xff0c;还是3个&#xff01;规划设计方案公示中快和小布一起看看吧&#xff01;▽环林东路879弄加装电梯项目建设单位&#xff1a;上海市浦东…

php调用美图接口,网易美图 API 接口调用与请求方法详细教程

原标题&#xff1a;网易美图 API 接口调用与请求方法详细教程网易美图 API 接口在网上已经很多且大都封装成了 API 供别人调用。支持前台跨域请求&#xff0c;以POST方式提交图片即可。网易美图 API 接口会随机更新一张美图&#xff0c;你可以选择调用本站的接口&#xff0c;也…

nlp 财务提取_RPA,智慧财务时代的“珍妮纺织机”来了?

智慧财务020社群与知识分享&#xff5c;上方蓝字星标置顶订阅&#xff5c;转载商务合作请添加首财君微信&#xff1a;cfo_tian昨日重磅《百亿存款谜局2》新戏码下的资管拷问一文秒懂财务机器人(RPA)的拐点和跳点。文 | 首财君【原创】出品 | 首席财务官(ID&#xff1a;cfoworld…

python定时任务apschedule_APScheduler(python 定时任务框架)最简单使用教程

有时候需要部署一些很简单的python定时任务&#xff0c;使用APScheduler是很好的选择。只需要简单的设置几个参数&#xff0c;就可以实现定时、定分甚至秒来跑。第一步&#xff1a;用pip安装APSchedulerpip install apscheduler第二步&#xff1a;导入并设置参数from apschedul…

安装oracle配置监听出错,安装失败,无法建立监听?

本帖最后由 tomfish88 于 2013-12-5 13:23 编辑原来的监听如何删除呢&#xff0c;我把注册表的也删除了&#xff0c;还是安装不成功&#xff0c;QQ截图20131203114715.png (70.13 KB, 下载次数: 2)2013-12-5 13:21 上传QQ截图20131205132007.png (8.28 KB, 下载次数: 1)2013-12…

python中content的用法_学python吗,教你5个python现学现用的有趣用法

在我们使用python的过程中也会遇到一些有意思的用法&#xff0c;这里找到了一些总结有趣的话不多说&#xff0c;接着看下去吧&#xff01;&#xff01;&#xff01;&#xff01;python高薪就业(视频、学习路线、免费获取)​shimo.imfor-else用法循环正常结束则执行else语句。一…

数据量大的sql怎么做优化_搜索引擎关键词优化怎么做

搜索引擎关键词优化怎么做新媒体营销的兴起&#xff0c;而且是方兴未艾&#xff0c;因此与客户建立起良好关系&#xff0c;保持良好的口碑关系&#xff0c;让客户信任你&#xff0c;公司适合增值服务&#xff1a;或者利润多&#xff0c;同时能在业务管理、销售管理、人事管理等…

vba显示正在加载_简单、易用的VBA过程积木代码

分享成果&#xff0c;随喜真能量&#xff08;这是我视频教程的开场白&#xff09;。大家好&#xff0c;今天继续和大家分享VBA编程中常用的简单“积木”过程代码第76-80讲&#xff0c;内容是&#xff1a;保存当前工作簿的副本到其它位置备份&#xff1b;不显示警告框&#xff1…

sqoop从oracle导入hive分区,sqoop从oracle导入hive Hive exited with status 64

导入命令./sqoop import -Dmapreduce.map.java.opts-Xmx3000m -Dmapreduce.map.memory.mb3200 --connect jdbc:oracle:thin:192.168.113.17:1521:btobbi --username tianlianbi --P --table BIO_PRODUCT_MAIN --hive-import --hive-overwrite -m 4数据已经进入到hdfs了&#xf…

linux关机_Linux中shutdown,halt,poweroff,init 0区别

1&#xff09;shutdown命令我们较常使用的是shutdown这个命令&#xff0c;这个命令可以安全地关闭或重启Linux系统&#xff0c;它在系统关闭之前给系统上的所有登录用户提示一条警告信息。该命令还允许用户指定一个时间参数&#xff0c;可以是一个精确的时间&#xff0c;也可以…