Best Quality(最佳质量)
Best Quality(最佳质量)
基本概念
SD-WAN 规则选路原则是:选择具有“最佳质量”的链路。
最佳质量的标准有:

- 延迟
- 一个数据包从一个节点到另一个节点所需的时间
- 更少的延迟 = 更好的吞吐量
- 延迟大引起的问题:访问速度慢,连接失败
- 推荐应用:建议用于需要最佳响应时间的应用程序。例如:视频/VoIP
- 抖动
- 在网络中传输数据包,相邻的数据包被转发之间的时间延迟差异(毫秒级别)。这是设备在按序转发数据包,包和包之间的一个短暂的中断时间。抖动通常是由 IP 网络中的拥塞引起的
- 抖动大引起的问题:实时应用程序延迟
- 推荐应用:建议用于需要实时转发传递数据包的应用程序。例如:VoIP
- 丢包
- 发生在当通过网络传输的一个或多个数据包无法到达其目标地时候
- 丢包而引起的问题:信息超时、加载时间慢、加载中断、连接关闭和信息丢失
- 推荐应用:Oracle DB 和 SSH 这样的 CS 应用程序
- 下游带宽
- 内部用户通过网络传输下载数据
- 带宽不足而引起的问题:传输速度慢
- 推荐应用:需要网络资源下载数据的应用程序。例如:文件服务器、云存储(Dropbox、OneDrive、百度网盘)
- 上游带宽
- 内部用户通过网络传输上传数据
- 带宽不足而引起的问题:传输速度慢,无法完成上传
- 推荐应用:需要网络资源上传数据的应用程序。例如:备份系统
- 总体带宽
- 内部用户通过网络传输上传下载数据的总和
- 自定义配置文件
- 基于延迟、抖动、丢包、带宽权重的自定义。计算公式:【Link Quality Index = (packet-loss-weight * packet loss) + (latency-weight * latency) + (jitter-weight * jitter) + (bandwidth-weight/bandwidth)】
- 带宽不足而引起的问题:传输速度慢
- 推荐应用:需要网络资源上传和下载数据的应用程序。示例:文件服务器、云存储(Dropbox、OneDrive)
- 延迟
最佳质量顾名思义就是在 SD-WAN 规则里配置的多个出接口里面:选择最好的!

配置举例
网络拓扑

配置步骤
SD-WAN 接口成员定义。

config system sdwan set status enable config zone edit "virtual-wan-link" next end config members edit 1 set interface "port2" set gateway 202.100.1.192 next edit 2 set interface "port3" set gateway 101.100.1.192 next edit 3 set interface "port4" set gateway 111.100.1.192 next edit 4 set interface "PPPOE1_DR_PENG" next end end配置 SD-WAN 关联的默认路由。

config router static edit 1 set distance 1 set sdwan-zone "virtual-wan-link" next end配置性能 SLA,使用 HTTP 方法监控 www.skype.com 网站。

config system sdwan config health-check edit "SKYPE" set server "www.skype.com" set protocol http set members 1 2 3 next end end配置 SD-WAN 规则,目标地址为 Skype 相关应用和 Internet 服务,流出接口策略选择最佳质量,SLA 衡量标准选择上步创建的性能 SLA,质量标准选择延迟。


config system sdwan config service edit 1 set name "SKYPE-OUT-Best-Quality-Latency" set mode priority set link-cost-factor latency //标准为延迟 set link-cost-threshold 10 //误差范围10%,避免频繁切换 (默认值) set src "LAN_192.168.10.0" set internet-service enable set internet-service-name "Microsoft-Skype_Teams" set internet-service-app-ctrl 10 28554 43540 28587 29350 28597 set health-check "SKYPE" set priority-members 1 2 3 next end end配置 SD-WAN 的上网策略。
重要
如果使用 ippool 的方式做 SNAT,在 SD-WAN 环境下,一定要在 ippool 下配置绑定接口,防止 ippool 在 SD-WAN 成员中转换错误。
config firewall ippool edit xxxx set associated-interface port2 next end
config firewall policy edit 1 set name "To_Internet" set srcintf "port8" set dstintf "virtual-wan-link" set action accept set srcaddr "LAN_192.168.10.0" set dstaddr "all" set schedule "always" set service "ALL" set utm-status enable set ssl-ssh-profile "certificate-inspection" set webfilter-profile "default" set application-list "default" set logtraffic all set nat enable next end
结果验证
查看 SD-WAN 成员状态,以及健康检查监控状态,可以看到 port2、port3、port4 的监控延迟分别为 160ms 左右、260ms 左右、360ms 左右。
SDWAN # diagnose sys sdwan member Member(1): interface: port2, flags=0x0 , gateway: 202.100.1.192, priority: 1 1024, weight: 0 Member(2): interface: port3, flags=0x0 , gateway: 101.100.1.192, priority: 1 1024, weight: 0 Member(3): interface: port4, flags=0x0 , gateway: 111.100.1.192, priority: 1 1024, weight: 0 Member(4): interface: PPPOE1_DR_PENG, flags=0x8 , gateway: 114.100.1.196, priority: 1 1024, weight: 0 SDWAN # diagnose sys sdwan service Service(1): Address Mode(IPV4) flags=0x200 use-shortcut-sla Gen(1), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(priority), link-cost-factor(latency), link-cost-threshold(10), heath-check(SKYPE) Members(3): 1: Seq_num(1 port2), alive, latency: 171.847, selected 2: Seq_num(2 port3), alive, latency: 267.559, selected 3: Seq_num(3 port4), alive, latency: 366.488, selected Internet Service(7): Microsoft-Skype_Teams(327781,0,0,0) Skype(4294838051,0,0,0 10) Microsoft.Lync(4294837471,0,0,0 28554) Skype.Portals(4294838961,0,0,0 43540) Lync_Audio(4294837364,0,0,0 28587) Lync_Apps.Sharing(4294837363,0,0,0 29350) Lync_Video(4294837366,0,0,0 28597) Src address(1): 192.168.10.0-192.168.10.255 SDWAN # diagnose sys sdwan health-check Health Check(SKYPE): Seq(1 port2): state(alive), packet-loss(15.000%) latency(178.808), jitter(53.983), bandwidth-up(9999995), bandwidth-dw(9999954), bandwidth-bi(19999949) sla_map=0x0 Seq(2 port3): state(alive), packet-loss(14.000%) latency(261.427), jitter(62.005), bandwidth-up(9999995), bandwidth-dw(9999952), bandwidth-bi(19999947) sla_map=0x0 Seq(3 port4): state(alive), packet-loss(9.000%) latency(367.605), jitter(58.608), bandwidth-up(9999995), bandwidth-dw(9999951), bandwidth-bi(19999946) sla_map=0x0
查看策略路由列表,将会按照延迟的顺序 port2、port3、port4 这样排序,优先使用延迟小的出口 port2。
SDWAN # diagnose firewall proute list list route policy info(vf=root): id=2131492865(0x7f0c0001) vwl_service=1(SKYPE-OUT-Best-Quality-Latency) vwl_mbr_seq=1 2 3 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=0 sport=0-65535 iif=0(any) dport=1-65535 path(3) oif=4(port2) oif=5(port3) oif=6(port4) source(1): 192.168.10.0-192.168.10.255 destination wildcard(1): 0.0.0.0/0.0.0.0 internet service(7): Microsoft-Skype_Teams(327781,0,0,0) Skype(4294838051,0,0,0, 10) Microsoft.Lync(4294837471,0,0,0, 28554) Skype.Portals(4294838961,0,0,0, 43540) Lync_Audio(4294837364,0,0,0, 28587) Lync_Apps.Sharing(4294837363,0,0,0, 29350) Lync_Video(4294837366,0,0,0, 28597) hit_count=13 last_used=2023-01-03 17:40:51查看 SD-WAN 设备路由表。
SDWAN # get router info routing-table all ... S* 0.0.0.0/0 [1/0] via 101.100.1.192, port3, [1/0] [1/0] via 111.100.1.192, port4, [1/0] [1/0] via 114.100.1.196, PPPOE1_DR_PENG, [1/0] [1/0] via 202.100.1.192, port2, [1/0] ...使用客户端 PC 访问 Skype 相关资源,在 SD-WAN 设备上查看流量日志,可以看到相关流量被分配到 port2,符合上述 SD-WAN 检测结果。

故障切换测试
调整 port2 和 port4 的延迟,模拟延迟变化,将 port2 的延迟模拟为 360ms,port4 的延迟模拟为 160ms。

切换延迟后,查看 SLA 的检查状态,port2 和 port4 的延迟进行了对调。
Seq(1 port2): state(alive), packet-loss(0.000%) latency(367.850), jitter(36.092), bandwidth-up(9999995), bandwidth-dw(9999953), bandwidth-bi(19999948) sla_map=0x0 Seq(2 port3): state(alive), packet-loss(0.000%) latency(270.216), jitter(37.558), bandwidth-up(9999995), bandwidth-dw(9999953), bandwidth-bi(19999948) sla_map=0x0 SDWAN # diagnose sys sdwan health-check Health Check(SKYPE): Seq(3 port4): state(alive), packet-loss(0.000%) latency(169.290), jitter(28.239), bandwidth-up(9999995), bandwidth-dw(9999952), bandwidth-bi(19999947) sla_map=0x0
查看 SD-WAN 规则出接口的变化,出接口顺序也相应的对调,变为 port4,port3,port2。
SDWAN # diagnose sys sdwan service Service(1): Address Mode(IPV4) flags=0x200 use-shortcut-sla Gen(25), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(priority), link-cost-factor(latency), link-cost-threshold(10), heath-check(SKYPE) Members(3): 1: Seq_num(3 port4), alive, latency: 168.681, selected //port4,优先从port13转发 2: Seq_num(2 port3), alive, latency: 269.862, selected //port3 3: Seq_num(1 port2), alive, latency: 367.583, selected //port2 Internet Service(7): Microsoft-Skype_Teams(327781,0,0,0) Skype(4294838051,0,0,0 10) Microsoft.Lync(4294837471,0,0,0 28554) Skype.Portals(4294838961,0,0,0 43540) Lync_Audio(4294837364,0,0,0 28587) Lync_Apps.Sharing(4294837363,0,0,0 29350) Lync_Video(4294837366,0,0,0 28597) Src address(1): 192.168.10.0-192.168.10.255查看策略路由中的 SD-WAN 规则列表,接口顺序已经变化为 port4、port3、port2 了,依据延迟的大小排序,优先选择延迟小的 port4 出口。
SDWAN # diagnose firewall proute list list route policy info(vf=root): id=2131492865(0x7f0c0001) vwl_service=1(SKYPE-OUT-Best-Quality-Latency) vwl_mbr_seq=3 2 1 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=0 sport=0-65535 iif=0(any) dport=1-65535 path(3) oif=6(port4) oif=5(port3) oif=4(port2) source(1): 192.168.10.0-192.168.10.255 destination wildcard(1): 0.0.0.0/0.0.0.0 internet service(7): Microsoft-Skype_Teams(327781,0,0,0) Skype(4294838051,0,0,0, 10) Microsoft.Lync(4294837471,0,0,0, 28554) Skype.Portals(4294838961,0,0,0, 43540) Lync_Audio(4294837364,0,0,0, 28587) Lync_Apps.Sharing(4294837363,0,0,0, 29350) Lync_Video(4294837366,0,0,0, 28597) hit_count=19 last_used=2023-01-03 18:05:39查看客户端访问 SKYPE 相关资源的流量日志,可以看到流量被分配到了 port4。

注意事项
由于我的 SD-WAN 规则里面选择了应用程序 Skype,这样基于应用的 SD-WAN 规则(策略路由)要生效的话需要满足一些条件:

第一步:应用程序是需要先通过内网用户通过使用 SKPYE,然后 FGT 进行应用识别的,因此策略里面一定要开启 APP Control 才可以(需要识别加密流量需要开启 SSL 深度检测)。

第二步:识别之后将会学习到相应的应用程序(SKYPE)的 IP 地址,将会形成一个动态的应用程序(SKYPE)IP 地址数据库,最终才会将这个学习到的 IP 数据库加入到 SD-WAN 规则(策略路由)里面,因此这需要有一个学习的过程,SD-WAN 中的应用程序的调用不会立即生效,因此在没有成功学习之前,SKPYE 的流量会走到其他线路上去,FGT 会去学习这些识别出来的应用程序的 IP 地址,这并非问题,而是 SD-WAN 调用应用的工作逻辑就是这样,学习完毕之后,新发起的流量才会匹配到 SD-WAN 规则(策略路由),我们可以通过命令行查看到学习的应用程序 IP 数据库信息。
SDWAN # diagnose sys sdwan internet-service-app-ctrl-list Skype(10 4294838051): 52.113.194.133 6 443 Tue Jan 3 18:05:37 2023 Skype.Portals(43540 4294838961): 13.107.42.16 6 443 Tue Jan 3 15:40:51 2023如果需要学习将到的 Skype 数据库立马完全生效,旧的会话是会保持原有出口的,想要这些旧的会话立即生效需要清除旧的会话和路由缓存信息,而新建的会话则不需要此操作,具体命令行如下。
SD-WAN # diagnose sys session filter src 192.168.10.100 SD-WAN # diagnose sys session clear //清除测试机器的会话,让其重新匹配新的SD-WAN规则(有skype的IP数据库更新) SD-WAN # diagnose ip rtcache flush //清除路由缓存
SD-WAN 规则中参数:link-cost-threshold 的作用。
SDWAN # config system sdwan SDWAN (sdwan) # config service SDWAN (service) # show full-configuration config service edit 1 set name "SKYPE-OUT-Best-Quality-Latency" ... set link-cost-threshold 10 ... next end根据上述的实验测试可以看出 SD-WAN 规则的工作逻辑:
- 切换前延迟:
- port2 联通延迟 160ms //选择延迟小的
- port3 电信延迟 260ms
- port4 移动延迟 360ms
- 优先选择 port2
- 切换后的延迟:
- port2 联通延迟 360ms
- port3 电信延迟 260ms
- port4 移动延迟 160ms //选择延迟小的
- 优先选择 port4
- 切换前延迟:
我们再来做一个测试,让延迟变成下面这个样子:
- port2 联通延迟 166ms
- port3 电信延迟 156ms //设置 port3 的延迟比 port2 低,但是低的不多
- Port4 移动延迟 266ms
此时如何优先出接口呢?我们来看具体情况。
SDWAN # diagnose sys sdwan health-check Health Check(SKYPE): Seq(1 port2): state(alive), packet-loss(0.000%) latency(166.441), jitter(42.834), bandwidth-up(9999995), bandwidth-dw(9999953), bandwidth-bi(19999948) sla_map=0x0 Seq(2 port3): state(alive), packet-loss(0.000%) latency(156.610), jitter(29.137), bandwidth-up(9999995), bandwidth-dw(9999952), bandwidth-bi(19999947) sla_map=0x0 Seq(3 port4): state(alive), packet-loss(0.000%) latency(268.445), jitter(21.758), bandwidth-up(9999995), bandwidth-dw(9999953), bandwidth-bi(19999948) sla_map=0x0
此时看 SD-WAN 规则的选择,此时 port2 会被优选,port3 延迟虽然比 port2 低,但是没有被优选,这是为什么呢?
SDWAN # diagnose sys sdwan service Service(1): Address Mode(IPV4) flags=0x200 use-shortcut-sla Gen(1), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(priority), link-cost-factor(latency), link-cost-threshold(10), heath-check(SKYPE) Members(3): 1: Seq_num(1 port2), alive, latency: 166.993, selected //此时port2会被优选 2: Seq_num(2 port3), alive, latency: 156.219, selected //port3延迟虽然比port2低,但是没有被优选,这是为什么呢? 3: Seq_num(3 port4), alive, latency: 268.677, selected Internet Service(7): Microsoft-Skype_Teams(327781,0,0,0) Skype(4294838051,0,0,0 10) Microsoft.Lync(4294837471,0,0,0 28554) Skype.Portals(4294838961,0,0,0 43540) Lync_Audio(4294837364,0,0,0 28587) Lync_Apps.Sharing(4294837363,0,0,0 29350) Lync_Video(4294837366,0,0,0 28597) Src address(1): 192.168.10.0-192.168.10.255查看策略路由列表,策略路由的接口顺序 port2、port3、port4。
SDWAN # diagnose firewall proute list list route policy info(vf=root): id=2131623937(0x7f0e0001) vwl_service=1(SKYPE-OUT-Best-Quality-Latency) vwl_mbr_seq=1 2 3 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=0 sport=0-65535 iif=0(any) dport=1-65535 path(3) oif=4(port2) oif=5(port3) oif=6(port4) //策略路由的接口顺序port2、port3、port4 source(1): 192.168.10.0-192.168.10.255 destination wildcard(1): 0.0.0.0/0.0.0.0 internet service(7): Microsoft-Skype_Teams(327781,0,0,0) Skype(4294838051,0,0,0, 10) Microsoft.Lync(4294837471,0,0,0, 28554) Skype.Portals(4294838961,0,0,0, 43540) Lync_Audio(4294837364,0,0,0, 28587) Lync_Apps.Sharing(4294837363,0,0,0, 29350) Lync_Video(4294837366,0,0,0, 28597) hit_count=24 last_used=2023-01-03 18:34:50此时 SD-WAN 规则选择了 port2 作为出接口,port3 延迟虽然比 port2 低,但是没有被优选,这是为什么呢?
答案正是因为 set link-cost-threshold 10 此参数在起作用:当两个 SD-WAN 接口成员链路之间的 SLA 测量值存在显著差异时,结果是可以预期的,越小则越优先被选择。然而,当标准的 SLA 测量值足够接近时,SD-WAN 会优先考虑配置中的靠前位置位置的出口链路。比如 port2/port3/port4 的延迟差不多的时候,会优先选择 port2,这种逻辑是为了避免当 SLA 相对接近时链接之间的频繁切换而设计的。它由一个名为“set link-cost-threshold”的设置进行控制,该设置默认为 10%,如果差距在 10% 以内的值,会优先选择 SD-WAN 规则中配置靠前的接口进行数据转发。
- port2 联通延迟 166ms,10% 的最低值:166 /(1 + 0.1)= 150.9,150.9 ~ 166 之间的值对于 port2 来说都是会被忽略的,即便延迟比 port2 要低,但是没有超过 10%,因此就忽略了比较计算值,依旧保持 port2 出口的选择。
- port3 电信延迟 156ms,延迟比 port2 虽然要低,但是没有超过 < 150.9 ~166 (port2 百分之 10 的忽略范围),因此 port3 不会被优选。
- port4 移动延迟 266ms,超过了 150.9 ~166 的范围,肯定不会被优选。
此时将 port3 的延迟设置为 149ms,查看 SD-WAN 策略中的顺序,发现 port3 的延迟 149.5 < 150.9 马上就会被优选。
Service(1): Address Mode(IPV4) flags=0x200 use-shortcut-sla Gen(1), TOS(0x0/0x0), Protocol(0: 1->65535), Mode(priority), link-cost-factor(latency), link-cost-threshold(10), heath-check(SKYPE) Members(3): 1: Seq_num(2 port3), alive, latency: 149.569, selected 2: Seq_num(1 port2), alive, latency: 164.794, selected 3: Seq_num(3 port4), alive, latency: 259.659, selected Internet Service(7): Microsoft-Skype_Teams(327781,0,0,0) Skype(4294838051,0,0,0 10) Microsoft.Lync(4294837471,0,0,0 28554) Skype.Portals(4294838961,0,0,0 43540) Lync_Audio(4294837364,0,0,0 28587) Lync_Apps.Sharing(4294837363,0,0,0 29350) Lync_Video(4294837366,0,0,0 28597) Src address(1): 192.168.10.0-192.168.10.255查看策略路由列表,出接口顺序变为 port3,port2,port4。
SDWAN # diagnose firewall proute list list route policy info(vf=root): id=2131623937(0x7f0e0001) vwl_service=1(SKYPE-OUT-Best-Quality-Latency) vwl_mbr_seq=2 1 3 dscp_tag=0xff 0xff flags=0x0 tos=0x00 tos_mask=0x00 protocol=0 sport=0-65535 iif=0(any) dport=1-65535 path(3) oif=5(port3) oif=4(port2) oif=6(port4) source(1): 192.168.10.0-192.168.10.255 destination wildcard(1): 0.0.0.0/0.0.0.0 internet service(7): Microsoft-Skype_Teams(327781,0,0,0) Skype(4294838051,0,0,0, 10) Microsoft.Lync(4294837471,0,0,0, 28554) Skype.Portals(4294838961,0,0,0, 43540) Lync_Audio(4294837364,0,0,0, 28587) Lync_Apps.Sharing(4294837363,0,0,0, 29350) Lync_Video(4294837366,0,0,0, 28597) hit_count=24 last_used=2023-01-03 18:34:50总结来看:Best Quality(最佳质量)在 SD-WAN 规则中会选择最好质量的线路(延迟、丢包、抖动)最低值的出接口优先用于 SD-WAN 流量的转发,为了避免频繁的切换,当所有的出接口质量都差不多的时候(差距在 10% 以内),则会选择 SD-WAN 规则配置接口顺序靠前的接口用于 SD-WAN 流量的转发。