寇 阳,吕建新
(1.光纤通信技术和网络国家重点实验室,湖北武汉,430074;2.烽火通信科技股份有限公司,湖北武汉,430074)
随着移动互联网、物联网、云计算在近年的兴起,数据业务超越语音业务成为运营商网络承载的主体。面对带宽需求的飞速增长,传统承载网已经无法满足需求,网络向IP 化演进已是大势所趋。伴随着带宽的提升,未来基站的覆盖密度将大大增加,在大型网络中对大量设备进行配置管理,是当前亟需解决的问题。本文分析了目前常用的网管配置下发接口现状,介绍了一种新的数据编码方式,并结合现有的网管接口,给出了一种适配方法与应用模型。
目前比较普遍使用的网络配置管理接口有命令行接口(CLI)、简单网络管理协议(SNMP)、基于XML 的网络管理。
CLI 是被绝大多数的路由器和交换机所支持的网络管理接口,可以完成设备配置和性能告警查询等功能。它结构简单,易于功能扩展、对客户端要求低、具有良好的人机交互特性。
SNMP 简单实用,易于实现且成本低,在数据网络领域得到广泛的应用。SNMPv2 改进了管理信息结构,增强了管理信息通信协议的能力。SNMPv3 在兼容SNMPv2 基本功能的基础上,增加了安全性描述,改善了SNMP 久为诟病的安全性问题。
XML(可扩展标记语言)是近年来计算机技术上的一个重大突破,它是一种数据交换格式,允许在不同的系统或者应用程序之间交换数据。XML 编码规则简单,通过数据类型定义(DTD)或者XML Schema 来定义元素的顺序和结构,在处理复杂数据时具有优势。
在配置管理这一方面,SNMP 很少被用于配置管理;XML 虽然具有良好的自解释性,同时也带来了大量的开销。Protocol Buffers 是Google 公司开发的开源的数据编码方式,在性能上与XML 和ASN.1 相比具有诸多优势。
Protobuf 使用一种叫做varints 的紧凑整数编码方法。每个Protobuf 消息都是一系列key-value 对。编码时,key 和value 都被封装到二进制流里。解码时,解析器需要通过key 来判断消息的类型和长度。这种方式能最大限度的将字段的key 和value 压缩存储,让字段的key 中包含这个字段中索引、值类型、长度等信息。
Protobuf 使用.proto 文件来定义数据的结构,使用自带编译器编译后,可以轻松的使用Protobuf 提供的API 对数据进行操作。
Protobuf 具有良好的向前兼容性和向后兼容性。对于旧版本中没有的字段,新版本可以将其设为非必填或者设置默认值。对于新版本中新增的字段,旧版本会忽略,以保证兼容。
ASN.1 和Protobuf 属于基于二进制的编码,XML 属于基于文本的编码。
基于文本的编码使用字节来编码字符,最大的优势就是具有良好的可读性,降低了调试难度,容错性好。不过,既能被机器理解又能被人类阅读的数据也带来了大量的冗余。
基于二进制的编码使用比特来表示数据,改善了编码后的数据长度和处理速率,但是编码后的二进制信息内容是人类不可读的,需要借助额外的工具进行翻译。
总的来说,避免使用XML 能带来更好的性能。ASN.1 的传输语法支持多种编码方式,但是与同为二进制编码的Protobuf 相比,ASN.1 的调试以及部署十分复杂。
Protobuf 解决了数据在网络中传输时的编码效率问题,但是由于现有设备并不支持直接使用Protobuf 进行操作,必须进行适配。在配置下发方面,CLI 是目前应用最为广泛的接口,所以我们提出一个Protobuf/CLI 的适配层。适配层部署在设备侧,能实现Protobuf 的信息描述与CLI 方式的数据转换, 并且能保存通过网管下发的数据到本地数据库。
CLI 的工作原理如下:用户通过telnet 或者串口把键盘按键传送给设备,设备把按键转换成字符串发送给命令外壳(Command Shell)。命令外壳通过把字符串解析成CLI 命令传递给CLI 解析器(CLI Parse),解析器按照命令行的语法对CLI 命令进行检查,如果检查通过,则调用执行协议栈的功能函数。功能函数直接给命令外壳返回执行结果。
要进行Protobuf 与CLI 的适配,适配层必须将Protobuf 的数据格式适配成CLI 的数据格式,然后发送给相关功能函数,以达到与CLI 配置同样的效果。Protobuf 本身所支持的数据类型和操作是完全兼容CLI 的。
适配层内部可以划分为3 个模块:
网管Client 模块:完成适配层与网管之间的交互功能,包括与网管的通信协议的适配、对收到数据的检查与异常处理等;Protobuf 适配模块:完成从把Protobuf 数据适配成CLI 能识别的数据结构,并且将成功配置的数据写入本地数据库;协议栈Client 模块:完成适配层与协议栈之间的交互功能,包括与协议栈的消息通信等。
对于网管下发的新建配置的命令, 网管Client 模块解析报文头部,把数据发给Protobuf 适配模块进行解析,转换成C 的数据结构后进行封装,发送给协议栈。协议栈解析后发给Protobuf适配模块,把报文封装成Protobuf 格式后发送给网管。对于返回成功的配置,保存到本地数据库。
对于网管下发的获取当前配置的命令,网管Client 模块收到网管下发的同步配置的命令,解析报文头部,把数据发送给Protobuf 适配模块。Protobuf 适配模块在本地数据库获取相应模块的配置,编码成Protobuf 后,返回给网管。
Protocol Buffers 以其小巧、快速、简单的特点,是一款非常优秀的数据序列化、反序列化工具,在对数据大小非常敏感的网络传输领域,有着非常广阔的应用前景。文中提出的基本应用模型可以在现有的支持CLI 接口的设备上,实现与Protocol Buffers 的适配,在理论上完全可行,并且已经在现网设备中得到验证,今后将得到不断改善。
[1] Google.Protocol Buffers,Google's Data Exchange Format[EB/OL].2011.http://code.google.com/p/protobuf/
[2] Gligoric N,Dejanovic I,Krco S.Performance evaluation of compact binary XML representation for constrained devices[C]//Distributed Computing in Sensor Systems and Workshops (DCOSS), 2011 International Conference on.IEEE,2011:1-5.