FD.IO-VPP研究及使用四(Qos策略)


我个人对QoS的理解总结如下:

1.流量分类

我的理解就是根据流量的(二、三、四层)特征(组合)将其分成不同的类别,归纳起来可以如下图所示:
在这里插入图片描述
2.流量标记

对分好类后对不同类别的流量进行标记(不同的服务优先级)。
在这里插入图片描述
3. 流量策略
在这里插入图片描述

实验一:QoS流量限速

配置步骤如下:

1.配置限速策略,如策略名字、令牌桶速率、大小、算法类型、匹配后的动作等参数;
2.创建匹配规则表;
3.往规则表中添加规则;
4.将策略应用到接口。

上面的这个步骤是我根据代码自己总结的,表述应该不完全正确,但总体思路是这样。
下面先看一下VPP提供的命令行。

配置限速策略

#configure policer name <name> <params> 

命令行的提示就这么一点,具体的参数需要阅读代码才能知道,总结如下:

configure policer 
para1: name 
para2: color-aware
para3: rate 1.kbps 2.pps
para4: cir belong to kbps
para5: eir belong to kbps
para6: cb belong to kbps
para7: eb belong to kbps
para8: round 1.closest 2.up 3 down
para9: type 1.1r2c 2.1r3c 3.2r3c-2698 4.2r3c-4115 5.2r3c-mef5cf1
para10: 1.conform-action 2.exceed-action 3.violate-action 
para11: 1.drop 2.transmit 3.mark-and-transmit 

上面的参数信息量比较大,最主要涉及几种不同的令牌桶算法原理以及它们的配置方法。
关于令牌桶算法的介绍,参考网上博客

创建匹配规则表

#classify table [miss-next|l2-miss_next|acl-miss-next <next_index>]
 mask <mask-value> buckets <nn> [skip <n>] [match <n>]
 [current-data-flag <n>] [current-data-offset <n>] [table <n>]
 [memory-size <nn>[M][G]] [next-table <n>]
 [del] [del-chain]

具体参数的意义总结如下:

para1: del 
para2: del-chain 
para3: buckets  该参数被分类器的哈希算法使用。推荐的值是预期条目的近似大小。
para4: skip     应用掩码之前要跳过的16字节向量的数量。
para5: match    定义要匹配的实际值,即字节向量,长度是16个字节的倍数
para6: table 
para7: mask 1.hex 
            2.l2  参数: src dst proto tag1 tag2 ignore-tag1 ignore-tag2 cos1 cos2 dot1q dot1ad 
            3.l3  参数: ip4 参数: version hdr_length src dst proto 
              l3  参数: ip6 参数: version traffic-class flow-label src dst proto
            4.l4  参数: tcp 参数 src dst 
              l4  参数: udp 参数: src_port dst_port
              l4  参数: src_port
              l4  参数: dst_port 
para8: memory-size    分类表及其条目的内存大小
para9: next-table    下一个分类表,当存在多个表链时使用
para10: miss-next     当数据包无法找到匹配项时被发送的node
para11: l2-input-miss-next
para12: l2-output-miss-next
para13: acl-miss-next
para14: current-data-flag
para15: current-data-offset

往规则表中添加规则

#classify session [hit-next|l2-hit-next|acl-hit-next <next_index>|policer-hit-next <policer_name>]

#table-index <nn> match [hex] [l2] [l3 ip4] [opaque-index <index>]
#[action set-ip4-fib-id|set-ip6-fib-id|set-sr-policy-index <n>] [del]

将策略应用到接口

#set policer classify interface <int> [ip4-table <index>]

该命令将指定的策略表应用到接口。

下面给出一个限速的示例,拓扑如下:
在这里插入图片描述
PC1 向 PC2 传送一个文件,在VPP1上配置QoS,将源地址为211.1.1.100的数据包传送速率限制在100KB/s。

配置命令如下:

#configure policer name policy1 cir 800 cb 90000 rate kbps round closest type 1r2c conform-action transmit exceed-action drop
#classify table mask l3 ip4 src
#classify session policer-hit-next policy1 exceed-color table-index 0 match l3 ip4 src 211.1.1.100
#set policer classify interface GigabitEthernet5/0/3 ip4-table 0

测试结果如下:

限速前:
在这里插入图片描述
限速后:
在这里插入图片描述
在这里插入图片描述
测试结果表明限速精度还是比较高。

实验二:修改DSCP

关于DSCP的概念理解:
在Internet上承载实时业务对IP技术来说是一大挑战。
这是因为,Internet是基于IP技术的,而IP网络承载实时应用有两大缺陷。首先,IP技术本身是面向无连接的技术,IP网络提供的业务仅是“尽力而为”的业务,网络本身是不保证传输可靠性的。其次,TCP/IP协议体系中的TCP或UDP协议虽然对于Internet的传统应用可以提供一定的容错和纠错功能,但对于实时业务来说,TCP的重传机制显得苍白无力。抛开TCP建链和确认的时延不说,重传引入的时延对于这些对时延极其敏感的实时业务来说是不能忍受的。而UDP本身就是不可靠的。因此,必须找到一个能够在Internet上提供良好的QoS保证的方法。

为了解决上述的问题,IETF组织提出了IntServ/RSVP和DiffServ机制。
IntServ/RSVP不详述,重点介绍DiffServ机制。
DiffServ采用边缘监管、分配和业务优先级的结合,为不同的QoS要求的应用分配不同的服务优先级,从而满足不同业务的QoS要求。
其基本思想是在网络入口处,根据用户和服务商(ISP)签订的服务等级协定(Service Level Agreement,SLA),为应用的分组分配一个区分服务代码(DSCP)。该机制重新命名了IPv4报头的TOS域和IPv6报头的TC域,统一定义为DS域。DS被分割为一个6bit的DSCP字段和一个2bit的未用字段(现在应该用在了区分MPLS优先级的业务上)。每个DSCP值就对应了一种特定的服务等级。在网络核心处,路由器就根据该DSCP值来决定分组的逐调行为(Per Hop Behavior, PHB)。具有相同的DSCP值的数据包将接受相同的处理,这些处理构成行为聚合(Behavior Aggragate, BA)。

DiffServ中提出了DiffServ域的概念。一个DiffServ域由许多路由器组成。处于域边缘的路由器称之为边缘路由器(ER),处于域核心的路由器称之为核心路由器(CR)。DiffServ将针对单一流的复杂处理推向网络的边缘,由ER来完成数据包的分类和流量调节;CR不再维护节点的状态信息,仅完成相应的PHB操作。因此,对于这种core-stateless方式的模型来说,具有很好的扩展性和伸缩性。

DiffServ中定义了三种业务类型:
快速转发:EF,提供类似专线和租用线的业务,DSCP值为101110;
保证转发:AF,提供比besteffort尽量好的业务,分四类,没类又定义了三种不同的丢弃优先级,共有12中推荐的DSCP值;
尽力而为:DSCP值为000000。

参考:https://wenku.baidu.com/view/f0db05e8524de518964b7d0e.html
简单来说就是DSCP就是优先级的标记。

在VPP上做了一个修改报文DSCP值的实验,配置如下:

# configure policer name policy1 cir 800 cb 90000 rate kbps round closest type 1r2c conform-action mark-and-transmit AF43 exceed-action drop
# classify table mask l3 ip4 src
# classify session policer-hit-next policy1 exceed-color table-index 0 match l3 ip4 src 211.1.1.100
# set policer classify interface GigabitEthernet5/0/3 ip4-table 0

该实验是要将在速率范围之内的流量的DSCP值修改为AF43
测试结果如下:
在这里插入图片描述
如上图所示:tos 0x98即对应DSCP的AF43,,修改成功!

其他

下面举例说明如下的几个问题:

  1. 如何在单个table中配置多条session;
  2. 如何使用多个表,即表链;
  3. 如何在一个session钟配置多个过滤条件。

单个table中配置多条session
example:对源IP地址为30.1.1.100、30.1.1.101、30.1.1.102以及30.1.1.103的数据包进行过滤。

# classify table mask l3 ip4 src buckets 16
# classify session acl-hit-next deny opaque-index 0 table-index 0 match l3 ip4 src 30.1.1.100
# classify session acl-hit-next deny opaque-index 1 table-index 0 match l3 ip4 src 30.1.1.101
# classify session acl-hit-next deny opaque-index 2 table-index 0 match l3 ip4 src 30.1.1.102
# classify session acl-hit-next deny opaque-index 3 table-index 0 match l3 ip4 src 30.1.1.103
# set int input acl intfc GigabitEthernet13/0/0 ip4-table 0

使用多个表
example:使用多个表过滤源IP地址和源MAC地址,即将参数next-table指向上一个表(要用到的表)

# classify table mask l3 ip4 src 
# classify session acl-hit-next deny opaque-index 0 table-index 0 match l3 ip4 src 30.1.1.100
# classify table mask l2 src next-table 0
# classify session acl-hit-next deny opaque-index 1 table-index 1 match l2 src 00:0c:29:e9:0e:9c
# set int input acl intfc GigabitEthernet13/0/0 ip4-table 1

在一个session钟配置多个过滤条件
example 1:对源MAC为00:0c:29:e9:0e:9c以及源IP为30.1.1.100的ICMP包进行过滤

# classify table mask hex 000000000000ffffffffffff0000000000000000000000ff0000ffffffff000000000000
# classify session acl-hit-next permit opaque-index 0 table-index 0 match hex 
    000000000000000c29e90e9c00000000000000000000000100001e010164000000000000
# set int input acl intfc GigabitEthernet13/0/0 l2-table 0

example2: 对源IP地址为30.1.1.100以及源UDP端口为200的数据包进行过滤

# classify table mask hex 0000000000000000000000000000000000000000000000000000ffffffff00000000FFFF
# classify session acl-hit-next permit opaque-index 0 table-index 0 match hex 
    00000000000000000000000000000000000000000000000000001e0101640000000000c8
# set int input acl intfc GigabitEthernet13/0/0 ip4-table 0

我们来观察classify table 与 classify session 的命令行参数:

classify table [miss-next|l2-miss_next|acl-miss-next <next_index>]
 mask <mask-value> buckets <nn> [skip <n>] [match <n>]
 [current-data-flag <n>] [current-data-offset <n>] [table <n>]
 [memory-size <nn>[M][G]] [next-table <n>]
 [del] [del-chain]

classify session [hit-next|l2-hit-next|acl-hit-next <next_index>|policer-hit-next <policer_name>]
 table-index <nn> match [hex] [l2] [l3 ip4] [opaque-index <index>]
 [action set-ip4-fib-id|set-ip6-fib-id|set-sr-policy-index <n>] [del]

classify table 里面有一个mask参数,classify session里面有一个match参数。这两个参数都是16字节对齐16进制,作用是这两个参数一起配合来实现高效率的规则匹配工作。

代码中的实现如下:
在这里插入图片描述
那如何使用这两个参数来实现规则过滤呢?先看一个配置实例:

对源IP地址为30.1.1.100以及UDP目的端口为200的数据包进行过滤

# classify table mask hex 0000000000000000000000000000000000000000000000000000ffffffff00000000FFFF
# classify session acl-hit-next permit opaque-index 0 table-index 0 match hex 
    00000000000000000000000000000000000000000000000000001e0101640000000000c8

中源IP为30.1.1.100,即match参数中的0x1e010164,源端口200即match参数中的0xc8。

那网络包中的字段是如何跟这16字节的数据匹配上的呢?
其实就是将这16个字节对齐的数据跟网络包的二、三、四层包头字段进行匹配。
更多信息可以参考链接:
https://wiki.fd.io/view/VPP/Introduction_To_N-tuple_Classifiers

000000000000 000000000000 0000 00000000 00000000 00000000 1e010164 00000000 00 c8
目的MAC 源MAC 类型 IP头第一个4字节 IP头第二个4字节 IP头第三个4字节 源IP地址 目的IP 源端口 目的端口

思科设备的QoS介绍以及配置方法的详细介绍可以参考下面的链接:
https://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus1000/sw/4_2_1_s_v_1_4/qos/configuration/guide/n1000v_qos.html
https://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus1000/sw/4_2_1_s_v_1_4/qos/configuration/guide/n1000v_qos/n1000v_qos_2classification.html

可以通过参考思科的配置来加深对QoS的理解。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页