Network Test Framework - In-band Network Telemetry(INT)
2017年4月23日
介绍
INT是被设计用来收集和报告网络状态的一个框架,他通过数据平面实现,不需要控制平面的干涉。在INT的架构模型里,packet包含被称网络设备为“telemetry instruction”的header field。这些instruction告诉支持INT的设备它需要收集什么状态(信息),并将这些信息写入packet。INT traffic source(应用,网络终端,etc.)能够将这些instruction嵌入到普通或者特殊的packet中。同样,INT traffic sink取回这些instruction的结果,以此准确地监控着数据层面的状态。
一些traffic sink的行为例子如下所述:
- OAM
- Real-time control or feedback loops
- Network Event Detection
INT架构模型具有通用性,有面向高层应用的倾向:
- Network troubleshooting
- Advanced congestion control
- Advanced routing
- Network data-plane verification
术语
INT header:任何包含INT information的packet header。这里有两种类型:Hop-by-Hop和Destination。
INT Packet:任何包含INT Header的packet。
INT Instruction:被嵌入的packet instruction指明了那些INT Metadata需要被收集,被收集的数据会被写入到INT header。
INT Source:一个创造并嵌入INT header到packet中的受信任的实体。INT header至少要包含INT Instruction。
INT Sink:一个取出INT header并收集包含在INT header中的路径状态的受信任的实体。INT Sink负责移除INT header,使得INT对上层透明。
INT Transit Hop:一个把它自己的INT Metadata加入到INT Pakcet的网络设备。
INT Metadata:INT source或者INT Transit Hop插入到INT Header的信息。metadata的例子如下所示。
监控对象(Metadata)
理论上,我们可以收集任何交换机内部的信息。然而在实际中,我们如果定义一个小的通用子集则能够使得INT适用于更多的设备。
每个metadata有一个uint32_t的值编码而成,主要分为以下几类:
- 交换机信息
- 交换机ID
- 报文进入信息
- 入口端口号
- 进入时的时间戳
- 报文发出信息
- 出口端口号
- 在设备中停留的时间
- 出口端口的链路利用率
- 缓冲区信息
- Queue Occupation??
- Queue Congestion Status??
处理INT Header
INT Header类型
这里有两种INT Header类型:Hop-by-Hop和Destination。一个给定的packet可能会有这两者之一或者两者都有(神奇)。当这两者都存在与packet中时,Hop-by-Hop必须在Destination之前。
- Hop-by-Hop:中间设备必须处理该类型的packet header。
- Destination:中间设备必须无视该类型的packet header,该类型必须由INT Sink处理。
处理INT Packet
略
Header 格式
各种封装的INT
INT Header的位置特意没有被指定,这意味着INT header可以作为任何封装类型的payload或者option来插入。唯一的限制就是封装的header要有足够的空间来承载INT信息,并且source和sink在INT的位置上有共识。下面就是有可能被嵌入的封装,当然不限于此:
- INT over VXLAN(作为VXLAN option,每个GPE extension)
- INT over Geneve(作为Geneve option)
- INT over NSH(作为NSH option)
- INT over TCP(作为TCP option或payload)
- INT over UDP(作为UDP payload)
这里我们来看看INT over VXLAN,这里的例子使用VXLAN通用协议扩展来搬运INT Header。
链路上的Header创建
在INT模型中,packet转发路径上的每一个设备都会创建一个INT header。为了避免在转发loop或其他情况下的header空间的浪费,这里强烈建议限制设备可添加的INT metadata field数量。
Header格式-INT over VXLAN
VXLAN Header:
VXLAN GPE Header:
VXLAN是一种为网络虚拟化设计的通用的管道协议并受到大多数软件虚拟交换机的和硬件网络单元的支持,他的详细介绍可以参考Vxlan基础理解。VXLAN header总共有8字节,他自己用了4个,剩余空间的总数仅允许携带一个的网络状态信息,但我们希望能够携带的信息足够的多。
VXLAN定义了将以太网帧封装在外部UDP报文中的封装格式。VXLAN-GPE(Generic Protocol Extension VXLAN)则是对VXLAN的扩展,从而使得可以封装任意层次的数据包,另外还提供了对OAM(Operations ,Administration and Management)协议的支持。VXLAN-GPE扩展的方法是通过对外层VXLAN 头的一些保留位进行修改。如上图所示,VXLAN-GPE对VXLAN头做了以下4方面的变动:
1)增加封装协议域(Next Protocol Field):该域用于指明被封装的数据报的协议类型,当前已定义的Next Protocol值包括:
0x1 : IPv4
0x2 : IPv6
0x3 : Ethernet
0x4 : Network Service Header(NSH)
0x5 : In-band Network Telemetry Header(INT Header)
NSH头包括两部分内容:
1)服务路径相关信息(服务节点要利用它来选择服务路径上的下一个服务节点)。
2)为途径的网络设备和服务设备提供所需的元数据。NSH服务头是由具有服务分类功能的设备或应用添加,该设备或应用可以确定哪些数据包需要服务,需要哪些服务,相应地经过怎样的服务路径。
2)增加P bit域:Flag域中的第5位(从零开始编号)被定义为P bit,其中如果8比特的封装协议域(Next Protocol)存在,则P bit需要设置为1。如果P bit为0,则按照标准的VXLAN协议进行解析。
3)增加O bit域:Flag的第7位被定义为O(OAM)bit。当O bit被设置为1时,内层的被封装数据包为OAM包,从而触发OAM包的处理过程。
4)增加Ver域:Flag的第8和第9两位被定义为Ver(Version),用于指明VXLAN-GPE版本。
INT shim header:
INT Metadata Header格式
INT Metadata Header and Metadate Stack:
- 每个INT Metadata header是8B长。
- INT Instruction被写入到16bit的INT Instruction field,每一位的含义如下:
- bit0 (MSB): Switch ID
- bit1: Ingress port ID
- bit2: Hop latency
- bit3: Queue occupancy
- bit4: Ingress timestamp
- bit5: Egress port ID
- bit6: Queue congestion status
- bit7: Egress port tx utilization
- The remaining bits are reserved.
- 其他field:控制作用,与INT packet的行为有关,详见spec。
例子:
Example with VXLAN GPE encapsulation: