【前言】html
【本篇为原创】网络遥感,Network telemetry,为何叫“telemetry”呢?我我的的理解是将网络中的数据进行一种“采集”,也就是其实是一种网络数据的采集手段。因为工做须要,接触了一些网络遥感方面的技术,本篇文章就来谈一谈主流的网络遥感技术。本篇文章会介绍传统网络中基于“流”的遥感技术,以思科的Netflow技术为表明和IETF的IPFIX标准,再到最近比较流行的INT技术,INT技术会着重介绍思科的IOAM和华为的PBT两种。node
【场景】数据库
网络遥感是一种网络信息采集技术,目的是为了采集网络中的信息,网络越大,出了问题越难排查,所以须要一些技术对网络进行史实的流量分析监控或是能够自动化排查网络中的“断路”,而且在DCN网络中(Datacenter Network)更须要一套手段来实现对网络的监控与探测,对网络的实时监控须要一套技术来实现,那么网络遥感就是用来解决这个问题而诞生的一种技术。网络遥感通常分为两种,分别是主动探测和被动探测。被动探测以思科的Netflow技术为表明,而主动探测则大多数相似于微软Everflow中的guided probe组件为表明(还有vmware为表明的虚拟网络的Traceflow,以及华为的FusionNetDoctor,固然华为作的有点low...实话实说)。编程
【主动探测】服务器
主动探测,顾名思义,就是“主动去探测网络中的状态”,为表明的以微软Everflow系统中的guided probe组件为表明,微软于2016年在SIGCOMM发了一篇名为《Packet-Level Telemetry in Large Datacenter Networks》文章,这篇文章主要介绍了微软的一套实现数据包级别的网络遥感技术,感兴趣的能够去google一下,我我的以为写的很是好的一篇文章。其中提到了一个重要组件,叫作“guided probe”,那么这个guided probe是用来作什么的呢?网络
图1.典型的虚拟网络拓扑架构
图1是一个典型的虚拟网络拓扑,虚拟机A到虚拟机B须要通过三个虚拟交换机,两个虚拟路由器,那么假设某一时刻“正在发生”虚拟机A到虚拟机B发生了“断路”致使虚拟机A到虚拟机B的业务流量不通,怎么定位到具体发生故障的位置以及发生故障的缘由呢?dom
微软的guided probe和vmware的traceflow就是作这个事情的。guided probe会在VM A注入一种“探测数据包”,而后在网元上设置一些“探测识别点”,这个数据包每通过一个网元都会上传状态信息,例如图2.ide
图2.主动探测的一种实现性能
以图2为例,我在每个网元的输入和输出设置一些“探测识别点”,“探测数据包”通过“探测识别点”会向控制器上传状态信息,那么假设虚拟机A到虚拟机B中的虚拟交换机3的输入出发生故障,那么最终上传的信息会缺乏“虚拟交换机3的OUT”,那么控制器就能够判断出虚拟交换机3处存在“正在发生“的故障,那么就能够经过北向通道告知管理面,管理面再告知用户,或直接发出告警。
固然还不止这样,若是数据面是自家公司研发的话还有一种升级的玩法,若是能够感知到“某条具体的背景流发生了断路”,“流“能够用5-tuple来标识(src ip、dst ip、src port、dst port、l4 protocol或者加上tos),那么我便在注入探测数据包的时候,拿出现“断流”的背景流量做为模板,构造出与出现“断路”的背景流量相同的数据包进行主动探测,而且若是数据面是自家公司研发的话,彻底能够在数据面转发中的丢包处设置“探测识别点”,那么这样不只知道出现断流的背景流具体的断流位置,还能够知道断流的缘由,这样能够直接告诉用户“xxx条流量出现了断流,在xxx的位置,断流丢包的缘由是xxx”,例如图3是VMWare的Traceflow的显示结果。
图3.VMWare的Traceflow使用效果图
上述流程即是主动探测的大多数实现,微软的Everflow、Vmware的Traceflow以及华为的FusionNetDoctor都是这样实现的(这里我必定要吹一波Vmware,作的真的有点好,真尼玛炫酷...)可是主动探测一样存在一些致命缺点:
微软的Everflow中提到,这种主动探测主要就是探测正在发生的断路,由于正在发生的断路的故障优先级最高,能实现这点已经足够,没办法期望单纯的一种技术来应付全部场景。
固然主动探测之后我会写一篇专门的文章来说解其中存在的一些技术难点和实现方法。
【被动探测】
被动探测是与主动探测相对应的一种探测,被动探测的定义是在“不影响当前网络流量的状况下进行探测”,因为主动探测“注入探测数据包”会对当前网络中的流量作出一些影响(出现了一条新的流量)。被动探测以思科的Netflow做为表明,可是近年来也有一些新的技术分别亮相,好比思科提出的INT技术以及其具体应用IOAM,以及华为根据思科IOAM技术进行优化提出的PBT技术。因为被动探测的技术内容比主动探测的内容复杂一些,所以接下来会分别介绍,先介绍Netflow技术。
【Netflow】
Netflow技术由思科与1996年提出(和我同一年生....),到如今已通过了24年,已是一种很是成熟的技术了,而且各家根据思科Netflow的思想还发展处了一些方言版本,例如jFlow,sFlow等等等等。Netflow的架构经常如图4所示。
图4.Netflow架构图
只要是基于Netflow的采集技术(其实不光是Netflow,主要是流量采集技术基本都差很少...),不管作成什么样,作的多大,基本都离不开Netflow架构的这几个组件。
固然还有一个最终要的组件即是Netflow设备的Flow cache。在Netflow设备中会存在一张表,这张表会存放流的信息,如图
图5.Netflow Main Cache原理图
原理也很是简单,即:
当某条流的数据包第一次进入当前Netflow设备后,Netflow设备会根据此数据包的5-tuple信息(这里随意定义)提取并在Netflow cache中添加一条Flow Entry,这条Flow Entry便表明此条流,那么即可以统计这条流的信息,并定时(Netflow cache一般都有老化机制)导出封装为Netflow协议数据包送往Netflow Collector
Netflow技术的原理很是简单,就是采集流信息,上传,而后分析。固然Netflow也有缺点,即是:
Netflow的缺点中,第一种其实并非Netflow技术的缺陷,而是基于“流”的网络信息采样的共性缺陷,第三种为Netflow这种传输层协议在设计的时候出现的缺陷,而第二种更偏向于“哲学”问题,“想看的更多就得花费更多的代价”,不想付出代价还想对网络进行细粒度的观察,是不可能的,就比如“你不能要一把枪射程又长,精度又高,为例又大,体积又小,射击速度又高”,这是不现实的。
【IPFIX】
IPFIX协议,IETF提出的一种“标准流信息导出协议”,目的就是为了替代Netflow v9协议和众多的方言版本协议,能够看作是将来的趋势,大多数厂商都已经兼容IPFIX协议,例如思科、华3、华为的交换机,VMware一样将IPFIX导出协议做为一种标准的流信息导出协议。
可是要注意的是IPFIX协议只是一种“信息导出协议”,目的是为了替代Netflow架构中的Exporter到Collector中的信息导出协议,可是总体架构基本如Netflow架构。IPFIX协议由Netflow v9协议发展而来,Netflow协议中的协议头的version为9,意味Netflow v9,而IPFIX协议中的协议头与Netflow v9基本一致,而且version为a(10),也就是Netflow v10,如图6.
图6.IPFIX头格式和Netflow v9头格式对比
而IPFIX做为IETF推出的标准流信息协议,在Netflow v9的基础上作了以下的改进:
能够看到,IPFIX相较于思科的Netflow更是一种协议标准,其中的企业字段能够很好的兼容一些方言版本的流信息导出协议,解决了不少兼容的麻烦,而且从功能的角度讲,IPFIX是兼容Netflow v9的(注意这里的功能值指的是导出内容上IPFIX要更全于Netflow v9),可是单纯从协议的角度讲是无法兼容的(也就是仍然得增长IPFIX的开发量)。
【INT】
INT技术是最近几年一种新型的网络遥感技术,全称是Inband Network Telemetry,意味“带内网络遥感技术”,是由思科提出的一个技术,INT是一种技术手段,一种思想,在思科产品中的应用叫作IOAM(inband OAM)那么这里就有一个新的概念,什么是“inband”?inband的意思直译是“带内”,可是“带内“又如何理解呢?
我我的的理解是:相似于Netflow或是IPFIX这类流监控技术,能够称之为”outband“,也就是带外。举个生活中的例子,带外就比如你是一个监控人,你在监控这条流的状态,你仍然处于一个旁观者的位置,既然是在一个旁观者的位置,那么观测的方法和观测的位置势必会对观测的结果有很大偏差;而怎么最大化消除这种偏差呢?生后中的经验告诉咱们叫作”设身处地“,也就是咱们把本身摆在当事人的视角去看待事情,那么咱们能够看到更多有关事情的真面目,而inband就是这样,inband Network telemetry就是这么实现的,将旁观者监测流,改成将检测信息植入到数据包内部,这样就至关于监测点挂载到了流中的每个数据包,那么这样数据包所经历的,必然是监测点所经历的。
图7.INT的实现方式
如图7所示,INT的实现方式就是将监测检查点插入到数据包的内部,也就是途中的OAM层,INT一般的作法就是将数据包的头(header)和数据包内部数据(payload)之间插入一块OAM层,那么这个数据包就从一个普通的网络数据包变成了一个被咱们打上”标记“的数据包。再举个例子,相信看过动物世界节目的朋友都知道,海洋学家为了监测一些动物的行为轨迹,会在海洋动物身上装上遥感器,好比海龟、海豚、企鹅之类的,那么最后海洋学家就能够回收海豚的探测器,并根据探测器中记录的数据来分析这个海豚的行动轨迹,海豚的行为特征。那么INT就是这个原理,间图8.
图8.INT技术监测网络情况的原理示意
如图8中的例子,一个数据包(就比如一只海豚)进入”起点“网元设备(被科学家捕获)后,被插上了OAM层(被装上了探测器),然后数据包通过每个网元(每一片海洋),都会将探测信息插入到OAM层中(被探测器记录),包括网元对数据包的行为,是转发仍是丢弃(海豚死亡),最后数据包到达终点后,数据包中的OAM层被剥离出来,经过信息导出协议上传到远程的分析服务器(探测器被科学家回收分析数据)。那么这里有一个问题,网元设备,也就是OAM域内的传输节点怎么知道要收集哪些信息呢?
图8.IOAM数据包中的OAM层
实际上,OAM层是由两部分组成的,一部分叫作instruction,也就是指令,另外一部分就是data,也就是数据,指令中会携带须要收集的信息,translation node只须要根据指令把相应的信息塞入data部分中便可完成数据的收集。
能够看到INT技术自己的原理仍是很是简单的,就是在数据包内部插入一个自定义的层,而后记录通过每个网元的信息,最后再将探测信息上传至远程的分析服务器。那么INT技术会带来什么样的优点,或者换句话说,能够怎么应用这种技术呢?
可是INT技术一样带来一些显而易见的缺点,以传统的INT技术,也就是思科的IOAM为例:
IOAM的软件实现能够去看VPP的源代码,VPP 17.xx版本之后的版本中都带有IPv6的IOAM实现。
【PBT】
PBT(Postcards-Based Telemetry)技术本质上也是INT技术,是由华为提出的一种基于思科IOAM技术的”升级版“,能够理解为一种优化版,华为主要是针对IOAM缺陷中的第2条、第3条以及第4条进行了优化,而且华为推出了两种优化版,一种是PBT-I,另一种是PBT-M,前者为超级版,后者为兼容版。那么PBT是怎么作的呢?其实PBT的优化有点相似与以前说的主动探测的包注入技术。既然PBT技术本质上和IOAM技术并没有不一样,一样拿海豚的例子来举例:
能够看到,PBT和IOAM技术最大的不一样是PBT是没有携带OAM探测数据的,而是没通过一个转发节点(严格来讲是OAM域内的translate node)都会马上上传信息,具体如PBT-I技术的实现原理能够如图9所示。
图9.PBT-I技术的实现原理
那么PBT-T的原理叙述以下,数据包通过OAM域(能够理解为INT的监测域),并进入“起始节点”(encapsulation node),起始节点对数据包进行标记,注意这里是标记,并非插入OAM层,和主动探测中的包注入技术相同,那么被标记的数据包,接下来能够称之为PBT探测数据包,接下来PBT探测数据包通过OAM域中每个网络设备(translation node),传输节点都会去检查数据包中的标记位,观察是否时PBT探测数据包,若是是PBT探测数据包,则马上上传监测数据。
可是这里仍然有一个问题,既然从原始的IOAM数据包的“监测模板” + “监测数据”缩小到只有1个bit的标记位,那么设备怎么知道要收集并上传那些信息呢?这个地方能够经过相似于ipfix的模板来实现,也就是实现管里面或者控制面向OAM域中的每个传输节点下配置通知收集哪些信息。这样的话,管控面须要对OAM域中的全部节点下发数据收集的模板配置,而不像IOAM同样,只须要给encapsulation node下发数据收集的模板配置就行了。
那么根据上述的原理介绍,咱们至少能够知道,PBT-I相较于IOAM作了以下几种较为明显的改进:
光这两点改进,其实就已是质变了,尤为是第二条的改进,大大的增长了INT技术在软件转发平台上的可行性(软件实现的转发平台最怕的就是对数据包进行从新分配内存+内存拷贝+从新计算checksum,这些会带来大量的性能消耗),可是世界上没有一种完美的技术,PBT-I技术的改进一样带来了其余的缺点:
虽然带来了这几个缺点,可是PBT-I的改进确实让人看到了软件实现INT技术的可行性。说完了PBT-I,接着说说“折中版”PBT-M,华为提出的draft中一样认可了PBT-I技术作得太绝,致使了上述几个问题的出现,那么能不能稍微作的不那么绝,来个折中点的方案呢?因此就来了PBT-M这种折中版本。
PBT-M相较于PBT-I技术,没有彻底舍弃OAM层,而相比于IOAM技术,又放弃了在OAM层中插入探测数据,所以PBT-M就是至关于IOAM与PBT-I的折中,即:
数据包第一次通过encapsulation node,一样会插入OAM层,可是,直插入instruction,不插入data,至关于只插入收集指令,用于告知当前PBT探测数据包通过的每个网元,要给这个数据包收集什么样的信息,而后再将这个信息导出至远程的分析服务器。那么根据这个特征,咱们能够知道,实际上PBT-M时对PBT-T的4条缺点中的一、4进行了优化,管控面只须要给encapsulation node下发配置便可,举个例子,网络中有A、B、C、D、E五条流,其中我须要对A、B两条流收集的信息集合为M,对C、D、E三条流收集的信息集合为N。A、B两条流的数据包通过encapsulation node时,encapsulation node根据管控面下发的配置,对A、B中插入OAM层,instruction为M,对C、D、E插入OAM层,instruction为N,假若A流的数据包通过translation node时,translation node根据内置的OAM层中的instruction M就知道该上传instruction M所对应的数据,这样灵活性大大增强。不过PBT-M这种折中版仍然会带来IOAM技术中的缺点2,也就是encapsulation node须要对这个数据包插入OAM层,对软件实现来讲仍然不友好。
【总结-说一说我本身的一些见解】
唉,网络遥感技术这块领域,大佬打架,我等渣渣只能吃瓜了....
先站一个坑,之后再慢慢具体说一说这些技术的一些具体细节,以及该怎么实现。
原文出处:https://www.cnblogs.com/jungle1996/p/12209348.html