NQA(网络质量分析)技术前言与介绍
NQA,中文名“网络质量分析”技术,和BFD一样都是一种链路探测技术,不同的是BFD技术用于检测IP网络中链路的连通情况,检测速度可以达到毫秒级,但只是发送UDP报文;相比之下,NQA技术检测速度不及BFD,但可以执行多种类型的探测,适用场景多,例如LB负载均衡中对服务器HTTP、HTTPS网页的检测,DNS服务器检测等
NQA技术配置非常简单,但博主在工作中遇到了很多咨询NQA报文发送细节的问题,如“多少秒探测一次?”、“两个报文发送间隔是多久?”等等问题。
NQA底层原理不是几句话可以说完的,为了让大家遇到这类问题可以自己计算到结果以及按现场要求配置最优的参数,写这篇文章解释
由于博主目前仅处理华三设备,此篇介绍以华三为主,如其他厂商机制有不同点,请以各厂商技术文档为主
本篇仅仅介绍NQA中报文的发送机制,具体实现请以官方技术文档为主
NQA 机制介绍
NQA技术介绍
先说机制,在说配置
华三的NQA可以拆分为三个部分来理解:NQA测试组、NQA服务器与客户端、NQA模板
这三者的最终目的都是用于探测某个协议是否可达,但使用场景不同
NQA测试组:在NQA测试设备上做的单向NQA配置,称为NQA测试组。
有两个特点:
- 只需要单向配置,对端只负责回包,不需要配置NQA动作(这也意味着无法探测具备会话的连接,如TCP)
- 探测需要手动开启,要和其他模块联动需要使用Track模块
支持探测的类型如下:ICMP-echo测试(判断可达)、ICMP-jitter测试(获得网络的单向和双向时延抖动)、DHCP测试、DNS测试、FTP测试、HTTP测试、SNMP测试、UDP-tracert测试(使用UDP报文进行tracert测试)、DLSw测试
NQA客户端与服务器
NQA测试组中有提到,测试组的特点是只需要单向配置,对于如TCP此类需要三次握手的协议而言,仅仅NQA探测设备的单向报文无法满足要求
所以对于TCP、UDP-echo(探测UDP端口之间的连通性以及UDP报文的往返时间)、UDP-jitter(用UDP探测链路抖动时间,用于实时性业务)和Voice(语音)类型测试,探测对端也必须配置NQA来响应探测报文。探测方就称为NQA客户段,被探测方称为NQA服务器
NQA客户端其实就是NQA测试组,不过是换了名字,客户端配置后需要手动开启探测。NQA服务器配置后自动监听
NQA模板
和NQA客户端服务器类似,NQA模块同样是对NQA测试组的补充
测试组中有提及要联动其他模块必须使用Track,这对于一些功能来说极为不便,比如LB健康检测。NQA模板主要解决这类问题,其本质和测试组相同,只是命令和测试组不同,同时可以被支持的模块直接调用而无需手动开启探测。其报文发送原理和测试组完全一致
NQA机制构成
了解上述的三个概念,再看配置应该十分简单,但深入去看配置逻辑可能还是会有疑惑,所以还需要明白NQA配置的构成
一个NQA测试组在构成上分三级:一轮NQA测试 -> 一次NQA探测-> 一个NQA探测报文
注意这里特意注明“一次、一个”,是由于NQA是有多轮、多次、多个探测的,根据探测类型的不同,探测的数量也不相同
先来看一个基本的NQA配置模板:
[SW1]nqa ?
agent NQA客户端的开关,如果要配置entry必须先使能agent
entry NQA客户端测试组配置
schedule NQA调度,配置测试组后,必须调用调度才能启动
server NQA服务端配置,只有有限的几个有用
template NQA模板配置,对于例如LB的功能,只需要调用NQA模块就可以自动执行而无需调度(schedule)
nqa entry 1 1 # 创建NQA测试组
type icmp-echo # 配置类型为ICMP-ECHO(ping测试)
destination ip 2.2.2.2 # 配置目的地址
source ip 10.0.12.1 # 配置源地址
frequency 5000
probe count 3
probe timeout 1000
reaction 1 checked-element probe-fail threshold-type consecutive 3 action-type trigger-only
NQA测试组运行一次可以进行多轮NQA测试,测试轮次和frequency
参数有关,这个参数缺省为0ms,即测试组一次运行只发送一轮测试。所以如果要一直探测,这个参数必须配置,配置后当上轮测试结束,再隔一个frequency指定的时间间隔,NQA进行下一轮探测。
每一轮测试可以有多次探测,这个数量由probe count决定,除UDP-tracert缺省是3次外,其他类型缺省都是一次
每一次探测中ICMP-jitter、UDP-jitter或Path-jitter发送10个探测报文;一次Voice探测中发送1000个探测报文,这个数量可以通过probe packet-number修改。此外的其他类型均为1且无法修改。
注意:如果不支持修改,则对应的命令无法配置
NQA报文发送间隔
一次NQA探测发送多个报文的探测中,报文发送间隔由probe packet-interval命令决定,其中报文超时时间
packet-timeout
只和单个报文本身有关,不会影响后续报文发送;在一次探测发送一个报文的NQA测试类型中,报文超时时间为本次探测超时时间一次探测的超时时间由probe timeout 命令决定
一轮测试的间隔由frequency命令决定
在一次探测内,对于发送多个探测报文的测试类型,只要到达报文发送间隔就立即发送下一个报文,不等待上个报文超时,单次探测报文中所有发送的报文均收到响应或均超时则进入下次探测;对于发送单个报文的探测类型,本次探测超时或收到响应,进入下一次探测。
下图为多报文UDP-jitter类型探测,只有收到响应或者所有报文均超时,才进入下一次探测动作
下图为单报文icmp-echo探测,收到响应后立即进入下次探测动作,不继续等待probe timeout 到达
这个逻辑细分为三个原则:
- 无论单次探测多报文还是单报文,一次探测完成(收到响应或全部超时)后,下一次探测立即开始,探测之间没有等待时间
- 单次探测多报文类型发送间隔和超时时间无关,无论是否收到回应报文,均在到达报文发送间隔后发送下个探测报文
- 报文超时时间由packet-timeout指定,和probe timeout配置互斥。即多报文一次探测的时间只和配置的报文发送数量有关,单报文和probe timeout有关
如下图是多报文的UDP-jitter类型探测抓包,第一个框是是一次探测结束,下次探测开始的现象。此时上次探测发送完最后一个报文,下次探测立即开始;第二个框是探测正常执行的状态,前一个报文发送后,等待一个发送间隔发送下个报文
因为probe timeout和packet-timeout互斥,两者不会同时配置在一个类型的探测中。所以不存在packet-timeout没有结束,probe timeout已经超时的情况
在一轮测试内,只有上轮测试完成,才进行下轮测试的等待,等待时间由frequency决定。【例如frequency 5s,上轮测试用时10s,那么还需要再等待5s才能进入下轮测试,那么总计就用了15s】
NQA动作
NQA有三种动作
none:只在本地记录监测结果,以便通过显示命令查看,不向网络管理系统发送Trap消息。
trap-only:不仅在本地记录监测结果,当阈值告警项的状态改变时,还向网络管理系统发送Trap消息。
trigger-only:在显示信息中记录监测结果的同时,触发其他模块联动。
所以想要让测试组和其他模块联动,动作必须配置为trigger-only
NQA测试失败条件
NQA失败条件有三种
平均值(average):监测一次测试中探测结果的平均值,如果平均值不在指定的范围内,则该监测对象超出阈值。例如,监测一次测试中探测持续时间的平均值。
累计数目(accumulate):监测一次测试中探测结果不在指定范围内的累计数目,如果累计数目达到或超过设定的值,则该监测对象超出阈值。
连续次数(consecutive):NQA测试组启动后,监测探测结果连续不在指定范围内的次数,如果该次数达到或超过设定的值,则该监测对象超出阈值。
除平均值外,累计数目和连续次数的单位都是报文,1个报文探测失败失败次数就会+1
例如配置ICMP-ECHO测试,一轮探测次数为3次,连续3次失败为阈值,则只要一轮全部失败,立即认为超出阈值。如果一轮探测次数为1次,连续3次失败为阈值,则三轮连续失败认为超出阈值。
对于一些特殊的类型,只能按其功能选择其中一项,如丢包探测只能选择累计
探测成功的条件也是按报文计算,但需要注意,NQA探测计数是在一次探测完毕后才计算的,比如probe packet-number 10,那么只有这是个报文都探测发送完毕,NQA才会计数,否则不计数(大部分NQA测试类型只发送一个报文,不涉及这种场景)
NQA配置案例
了解完上面的机制,相信大家可以自己按业务场景计算关于NQA探测的一些时间值了,下面贴一些案例加强了解
一次探测单个报文的NQA测试组场景(ICMP-ECHO)
1. 组网需求
使用NQA的ICMP-echo测试功能,测试本端(Device A)发送的报文是否可以经过指定的下一跳设备(Device C)到达指定的目的端(Device B),以及报文的往返时间。
2. 组网图
图1-2 ICMP-echo测试组网图
3. 配置步骤
# 配置各接口的IP地址。(配置过程略)
# 配置静态路由或动态路由协议,确保各设备之间路由可达。(配置过程略)
# 创建ICMP-echo类型的NQA测试组(管理员为admin,操作标签为test1),并配置探测报文的目的地址为10.2.2.2。
system-view
[DeviceA] nqa entry admin test1
[DeviceA-nqa-admin-test1] type icmp-echo
[DeviceA-nqa-admin-test1-icmp-echo] destination ip 10.2.2.2
# 配置下一跳地址为10.1.1.2,以便测试报文经过指定的下一跳设备(Device C)到达目的端,而不是通过Device D到达目的端。
[DeviceA-nqa-admin-test1-icmp-echo] next-hop ip 10.1.1.2
# 配置可选参数:一次NQA测试中探测的次数为10,探测的超时时间为500毫秒,测试组连续两次测试开始时间的时间间隔为5000毫秒。
[DeviceA-nqa-admin-test1-icmp-echo] probe count 10
[DeviceA-nqa-admin-test1-icmp-echo] probe timeout 500
[DeviceA-nqa-admin-test1-icmp-echo] frequency 5000
# 开启NQA历史记录保存功能,并配置一个测试组中能够保存的最大历史记录个数为10。
[DeviceA-nqa-admin-test1-icmp-echo] history-record enable
[DeviceA-nqa-admin-test1-icmp-echo] history-record number 10
[DeviceA-nqa-admin-test1-icmp-echo] quit
# 启动ICMP-echo测试操作,并一直进行测试。
[DeviceA] nqa schedule admin test1 start-time now lifetime forever
# 测试执行一段时间后,停止ICMP-echo测试操作。
[DeviceA] undo nqa schedule admin test1
4. 验证配置
# 显示ICMP-echo测试中最后一次测试的当前结果。
[DeviceA] display nqa result admin test1
NQA entry (admin admin, tag test1) test results:
Send operation times: 10 Receive response times: 10
Min/Max/Average round trip time: 2/5/3
Square-Sum of round trip time: 96
Last succeeded probe time: 2011-08-23 15:00:01.2
Extended results:
Packet loss ratio: 0%
Failures due to timeout: 0
Failures due to internal error: 0
Failures due to other errors: 0
# 显示ICMP-echo测试的历史记录。
[DeviceA] display nqa history admin test1
NQA entry (admin admin, tag test1) history records:
Index Response Status Time
370 3 Succeeded 2011-08-23 15:00:01.2
369 3 Succeeded 2011-08-23 15:00:01.2
368 3 Succeeded 2011-08-23 15:00:01.2
367 5 Succeeded 2011-08-23 15:00:01.2
366 3 Succeeded 2011-08-23 15:00:01.2
365 3 Succeeded 2011-08-23 15:00:01.2
364 3 Succeeded 2011-08-23 15:00:01.1
363 2 Succeeded 2011-08-23 15:00:01.1
362 3 Succeeded 2011-08-23 15:00:01.1
361 2 Succeeded 2011-08-23 15:00:01.1
以上显示信息表示,Device A发送的报文可以通过Device C到达Device B;测试过程中未发生丢包;报文的最小、最大、平均往返时间分别为2毫秒、5毫秒和3毫秒。
一次探测多个报文的NQA测试组场景(ICMP-jitter)
1. 组网需求
使用NQA的ICMP-jitter测试功能,测试本端(Device A)和指定目的端(Device B)之间传送报文的时延抖动。
2. 组网图
图1-3 ICMP-jitter测试组网图
3. 配置步骤
(1) 配置各接口的IP地址。(配置过程略)
(2) 配置静态路由或动态路由协议,确保各设备之间路由可达。(配置过程略)
(3) 配置Device A
# 创建ICMP-jitter类型的NQA测试组(管理员为admin,操作标签为test1)。
system-view
[DeviceA] nqa entry admin test1
[DeviceA-nqa-admin-test1] type icmp-jitter
# 配置测试操作的探测报文的目的地址为10.2.2.2。
[DeviceA-nqa-admin-test1-icmp-jitter] destination ip 10.2.2.2
# 配置可选参数:测试组连续两次测试开始时间的时间间隔为1000毫秒。
[DeviceA-nqa-admin-test1-icmp-jitter] frequency 1000
[DeviceA-nqa-admin-test1-icmp-jitter] quit
# 启动ICMP-jitter测试操作,并一直进行测试。
[DeviceA] nqa schedule admin test1 start-time now lifetime forever
# 测试执行一段时间后,停止ICMP-jitter测试操作。
[DeviceA] undo nqa schedule admin test1
4. 验证配置
# 显示ICMP-jitter测试中最后一次测试的当前结果。
[DeviceA] display nqa result admin test1
NQA entry (admin admin, tag test1) test results:
Send operation times: 10 Receive response times: 10
Min/Max/Average round trip time: 1/2/1
Square-Sum of round trip time: 13
Last packet received time: 2015-03-09 17:40:29.8
Extended results:
Packet loss ratio: 0%
Failures due to timeout: 0
Failures due to internal error: 0
Failures due to other errors: 0
Packets out of sequence: 0
Packets arrived late: 0
ICMP-jitter results:
RTT number: 10
Min positive SD: 0 Min positive DS: 0
Max positive SD: 0 Max positive DS: 0
Positive SD number: 0 Positive DS number: 0
Positive SD sum: 0 Positive DS sum: 0
Positive SD average: 0 Positive DS average: 0
Positive SD square-sum: 0 Positive DS square-sum: 0
Min negative SD: 1 Min negative DS: 2
Max negative SD: 1 Max negative DS: 2
Negative SD number: 1 Negative DS number: 1
Negative SD sum: 1 Negative DS sum: 2
Negative SD average: 1 Negative DS average: 2
Negative SD square-sum: 1 Negative DS square-sum: 4
SD average: 1 DS average: 2
One way results:
Max SD delay: 1 Max DS delay: 2
Min SD delay: 1 Min DS delay: 2
Number of SD delay: 1 Number of DS delay: 1
Sum of SD delay: 1 Sum of DS delay: 2
Square-Sum of SD delay: 1 Square-Sum of DS delay: 4
Lost packets for unknown reason: 0
# 显示ICMP-jitter测试的统计结果。
[DeviceA] display nqa statistics admin test1
NQA entry (admin admin, tag test1) test statistics:
NO. : 1
Start time: 2015-03-09 17:42:10.7
Life time: 156 seconds
Send operation times: 1560 Receive response times: 1560
Min/Max/Average round trip time: 1/2/1
Square-Sum of round trip time: 1563
Extended results:
Packet loss ratio: 0%
Failures due to timeout: 0
Failures due to internal error: 0
Failures due to other errors: 0
Packets out of sequence: 0
Packets arrived late: 0
ICMP-jitter results:
RTT number: 1560
Min positive SD: 1 Min positive DS: 1
Max positive SD: 1 Max positive DS: 2
Positive SD number: 18 Positive DS number: 46
Positive SD sum: 18 Positive DS sum: 49
Positive SD average: 1 Positive DS average: 1
Positive SD square-sum: 18 Positive DS square-sum: 55
Min negative SD: 1 Min negative DS: 1
Max negative SD: 1 Max negative DS: 2
Negative SD number: 24 Negative DS number: 57
Negative SD sum: 24 Negative DS sum: 58
Negative SD average: 1 Negative DS average: 1
Negative SD square-sum: 24 Negative DS square-sum: 60
SD average: 16 DS average: 2
One way results:
Max SD delay: 1 Max DS delay: 2
Min SD delay: 1 Min DS delay: 1
Number of SD delay: 4 Number of DS delay: 4
Sum of SD delay: 4 Sum of DS delay: 5
Square-Sum of SD delay: 4 Square-Sum of DS delay: 7
Lost packets for unknown reason: 0
NQA服务器客户端场景(TCP)
1. 组网需求
使用NQA的TCP测试功能,测试本端(Device A)和指定目的端(Device B)的端口9000之间建立TCP连接所需的时间。
2. 组网图
图1-10 TCP测试组网图
3. 配置步骤
(1) 配置各接口的IP地址。(配置过程略)
(2) 配置静态路由或动态路由协议,确保各设备之间路由可达。(配置过程略)
(3) 配置Device B
# 使能NQA服务器,配置监听的IP地址为10.2.2.2,TCP端口号为9000。
system-view
[DeviceB] nqa server enable
[DeviceB] nqa server tcp-connect 10.2.2.2 9000
(4) 配置Device A
# 创建TCP类型的测试组(管理员为admin,操作标签为test1)。
system-view
[DeviceA] nqa entry admin test1
[DeviceA-nqa-admin-test1] type tcp
# 配置探测报文的目的地址为10.2.2.2,目的端口号为9000。
[DeviceA-nqa-admin-test1-tcp] destination ip 10.2.2.2
[DeviceA-nqa-admin-test1-tcp] destination port 9000
# 开启NQA测试组的历史记录保存功能。
[DeviceA-nqa-admin-test1-tcp] history-record enable
[DeviceA-nqa-admin-test1-tcp] quit
# 启动测试操作,并一直进行测试。
[DeviceA] nqa schedule admin test1 start-time now lifetime forever
# 测试执行一段时间后,停止TCP测试操作。
[DeviceA] undo nqa schedule admin test1
4. 验证配置
# 显示TCP测试中最后一次测试的当前结果。
[DeviceA] display nqa result admin test1
NQA entry (admin admin, tag test1) test results:
Send operation times: 1 Receive response times: 1
Min/Max/Average round trip time: 13/13/13
Square-Sum of round trip time: 169
Last succeeded probe time: 2011-11-22 10:27:25.1
Extended results:
Packet loss ratio: 0%
Failures due to timeout: 0
Failures due to disconnect: 0
Failures due to no connection: 0
Failures due to internal error: 0
Failures due to other errors: 0
# 显示TCP测试的历史记录。
[DeviceA] display nqa history admin test1
NQA entry (admin admin, tag test1) history records:
Index Response Status Time
1 13 Succeeded 2011-11-22 10:27:25.1
以上显示信息表示,Device A可以与Device B的端口9000建立TCP连接,建立连接所需的时间为13毫秒。
NQA模块场景(HTTP)
1. 组网需求
外部特性通过引用HTTP类型的NQA模板,测试是否可以和指定的HTTP服务器之间建立连接,以及能否从HTTP服务器获取数据。
2. 组网图
图1-22 HTTP类型的NQA模板配置组网图
3. 配置步骤
# 配置各接口的IP地址。(配置过程略)
# 配置静态路由或动态路由协议,确保各设备之间路由可达。(配置过程略)
# 创建HTTP类型的NQA模板,模板名为http。
system-view
[DeviceA] nqa template http http
# 配置HTTP测试的网址为https://10.2.2.2/index.htm。
[DeviceA-nqatplt-http-http] url http://10.2.2.2/index.htm
# 配置HTTP测试的操作方式为get操作。(get操作为缺省操作方式,因此,可以不执行本配置)
[DeviceA-nqatplt-http-http] operation get
# 配置确定节点有效前需要连续探测成功的次数为2。当连续探测成功次数达到2次时,NQA客户端把探测成功的消息发送给外部特性,使外部特性能利用NQA测试的结果进行相应处理。
[DeviceA-nqatplt-http-http] reaction trigger probe-pass 2
配置后使用其他支持NQA模板的功能模块调用即可