网络 QoS 配置
概述
QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制,是用来解决网络延迟和阻塞等问题的一种技术。在正常情况下,如果网络只用于特定的无时间限制的应用系统,并不需要 QoS,比如 Web 应用,或 E-mail 设置等。但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS 能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。如提高 QQ 的所有数据报文优先级并设置 dont_drop 选项,保证 QQ 在网络环境较差时不掉线。
度量指标
影响网络质量的因素包括传输链路的带宽、报文传送时延和抖动、以及丢包率等,它们也就成为了 QoS 的度量指标。
带宽
带宽也称为吞吐量,是指在一个固定的时间内(1 秒),从网络一端传输到另一端的最大数据位数,也可以理解为网络的两个节点之间特定数据流的平均速率。带宽的单位是比特/秒(bit/s)。在网络中,有两个常见的与带宽有关的概念:上行速率和下行速率。上行速率是指用户向网络发送信息时的数据传输速率,下行速率是指网络向用户发送信息时的传输速率。例如,用户通过FTP上传文件到网络,影响上传文件速度的就是上行速率;而从网络下载文件,影响下载文件速度的就是下行速率。
时延
时延是指一个报文或分组从网络的发送端到接收端所需要的延迟时间,一般由传输延迟及处理延迟组成。以语音传输为例,时延是指从说话者开始说话到对方听到所说内容的时间。一般人们察觉不到小于 100 毫秒的延迟。当延迟在 100 毫秒和 300 毫秒之间时,说话者可以察觉到对方回复的轻微停顿,这种停顿可能会使通话双方都感觉到不舒服。超过 300 毫秒,延迟就会很明显,用户开始互相等待对方的回复。当通话的一方不能及时接收到期望的回复时,说话者可能会重复所说的话,这样会与远端延迟的回复碰撞,导致重复。
抖动
如果网络发生拥塞,导致通过同一连接传输的分组延迟各不相同。抖动用来描述延迟变化的程度,也就是最大延迟与最小延迟的时间差。抖动对于实时性的传输是一个重要参数,特别是语音和视频等实时业务是极不容忍抖动的,抖动会造成话音或视频的断续。抖动也会影响一些网络协议的处理。有些协议是按固定的时间间隔发送交互性报文,抖动过大会导致协议震荡。所有传输系统都有抖动,只要抖动在规定容差之内就不会影响服务质量。利用缓存可以克服过量的抖动,但这将增加时延。
丢包率
丢包率是指在网络传输过程中丢失报文的数量占传输报文总数的百分比。少量的丢包对业务的影响并不大,例如,在语音传输中,丢失一个比特或一个分组的信息,通话双方往往注意不到。在视频的传输中,丢失一个比特或一个分组可能造成在屏幕上瞬间的波形干扰,但能很快恢复正常。使用 TCP 传送数据可以处理少量的丢包,因为 TCP 允许丢失的信息重发。但大量的丢包会影响传输效率。在 QoS 中,我们关注的是丢包的统计数据,也就是丢包率。所以正常传输时,网络丢包率应该控制在一定范围内即可。
实现原理
QoS 网络层次
QoS 层处于 TCP/IP 协议栈与 netjob 之间,解析每一个提交给协议栈和从协议栈发出的数据包。并针对不同类型的数据包按照指定的规则操作。
QoS 数据结构
QoS 相关的数据主要有两类,规则控制结构和 QoS 接口结构。规则控制结构又分 TCP、UDP、IP 三种。
规则控制结构 - TCP 规则
typedef struct { LW_LIST_LINE QOSRT_lineManage; /* TCP 规则管理链表 */ INT QOSRT_iRule; INT QOSRT_iCmpMethod; /* srouce, destination, both */ ip4_addr_t QOSRT_ipaddrHboS; /* IP 段起始 IP 地址 */ ip4_addr_t QOSRT_ipaddrHboE; /* IP 段结束 IP 地址 */ u16_t QOSRT_usPortHboS; /* 端口起始 主机序 */ u16_t QOSRT_usPortHboE; /* 端口结束 */ u8_t QOSRT_ucPrio; /* QoS 优先级 */ u8_t QOSRT_ucDontDrop; /* QoS 可靠服务 */ } __QOS_RULE_TCP; typedef __QOS_RULE_TCP *__PQOS_RULE_TCP;
规则控制结构 - UDP 规则
typedef struct { LW_LIST_LINE QOSRU_lineManage; /* UDP 规则管理链表 */ INT QOSRU_iRule; INT QOSRU_iCmpMethod; /* srouce, destination, both */ ip4_addr_t QOSRU_ipaddrHboS; /* IP 段起始 IP 地址 */ ip4_addr_t QOSRU_ipaddrHboE; /* IP 段结束 IP 地址 */ u16_t QOSRU_usPortHboS; /* 端口起始 主机序 */ u16_t QOSRU_usPortHboE; /* 端口结束 */ u8_t QOSRU_ucPrio; /* QoS 优先级 */ u8_t QOSRU_ucDontDrop; /* QoS 可靠服务 */ } __QOS_RULE_UDP; typedef __QOS_RULE_UDP *__PQOS_RULE_UDP;
规则控制结构 - IP 规则
typedef struct { LW_LIST_LINE QOSRI_lineManage; /* IP 规则管理链表 */ INT QOSRI_iRule; INT QOSRI_iCmpMethod; /* srouce, destination, both */ ip4_addr_t QOSRI_ipaddrHboS; /* IP 段起始 IP 地址 */ ip4_addr_t QOSRI_ipaddrHboE; /* IP 段结束 IP 地址 */ u8_t QOSRI_ucPrio; /* QoS 优先级 */ u8_t QOSRI_ucDontDrop; /* QoS 可靠服务 */ } __QOS_RULE_IP; typedef __QOS_RULE_IP *__PQOS_RULE_IP;
QoS 接口结构
typedef struct { LW_LIST_LINE QOSNI_lineHash; /* hash 表 */ LW_LIST_LINE_HEADER QOSNI_qosrnRule[__QOS_NETIF_RULE_MAX]; /* 规则表 */ CHAR QOSNI_cName[IF_NAMESIZE]; /* 网络接口名 */ BOOL QOSNI_bAttached; /* 是否已经连接 */ } __QOS_NETIF_CB; typedef __QOS_NETIF_CB *__PQOS_NETIF_CB;
QoS 插入规则
插入一个新规则时会根据网络接口名创建对应的 QoS 接口结构并放入 QoS 哈希表中,同样将此 QoS 接口保存到对应的网络接口结构中,以便此网络接口有数据交换时可以查找对应的规则。
然后将对应的规则保存到 QoS 接口结构的规则链表中,若之后需加入相同网络接口名的规则则添加到此链表中。
QoS 操作方法
QoS 相关的操作命令有三个,开关(ipqos)、添加(qosruleadd)、删除(qosruledel)和查看(qoss)。
开关 QoS
在 SylixOS 系统中,使用 ipqos
命令用于启动或停止 QoS 功能。使用 help ipqos
命令可以查看 ipqos 的具体使用方法 。
[root@sylixos:/root]# help ipqos
Set/Get IP QoS support setting
eg. ipqos
ipqos (show IP QoS support setting)
ipqos 1 (enable IP QoS support)
ipqos 0 (disable IP QoS support)
ipqos ipv4 1 (enable IPv4 QoS support)
ipqos ipv6 0 (disable IPv6 QoS support)
ipqos [[ipv4 / ipv6] 0 / 1]
[root@sylixos:/root]#
例:启动 QoS 功能
[root@sylixos:/root]# ipqos 1
[root@sylixos:/root]# ipqos
IPv4 QoS: On IPv6 QoS: On
[root@sylixos:/root]#
例:关闭 QoS 功能
[root@sylixos:/root]# ipqos 0
[root@sylixos:/root]# ipqos
IPv4 QoS: Off IPv6 QoS: Off
[root@sylixos:/root]#
添加规则
在 SylixOS 系统中,使用 qosruleadd
命令用于增加一条 QoS 规则。使用 help qosruleadd
命令可以查看 qosruleadd
命令的具体使用方法。
[root@sylixos:/root]# help qosruleadd
add a rule into QoS.
qosruleadd en1 ip 192.168.0.5 192.168.0.10 s 5 no
qosruleadd lo0 udp 0.0.0.0 255.255.255.255 433 500 b 6 yes
qosruleadd wl2 tcp 192.168.0.1 192.168.0.200 169 169 d 2 no
qosruleadd [netifname] [rule] [args...] [s|d|b] [prio] [dont_drop]
[root@sylixos:/root]#
例:增加一条 ip 规则命令。
[root@sylixos:/root]# qosruleadd en1 ip 192.168.31.1 192.168.31.5 s 5 no
参数说明:
- en1:表示网络接口。
- ip:表示规则针对的数据包类型,后面紧跟 IP 地址范围。
- 192.168.31.1:IP 地址范围的起始地址。
- 192.168.31.5:IP 地址范围的结尾地址。
- s:表示这条规则针对源地址。d - 针对目的地址,b - 针对所有地址。
- 5:优先级,范围为 1~7。
- no:dont_drop 选项, no 表示此包会被协议栈丢失, yes 表示此包不会被协议栈丢失。
若针对TCP或UDP的数据包类型,则需要加上对应的端口号范围,如下:
[root@sylixos:/root]# qosruleadd en1 tcp 192.168.31.1 192.168.31.5 1000 10010 b 4 yes
查看规则
在 SylixOS 系统中,使用 qoss
命令用于查看添加的 QoS 规则。
[root@sylixos:/root]# help qoss
show QoS rule(s).
qoss
[root@sylixos:/root]# qoss
NETIF ATTACH SEQNUM RULE CMP_METHOD PRIO DONT_DROP IPs IPe PORTs PORTe
en1 YES 0 IP SRC 5 NO 192.168.31.1 192.168.32.5 N/A N/A
en1 YES 1 IP SRC 5 NO 192.168.31.1 192.168.31.5 N/A N/A
en1 YES 2 TCP BOTH 4 YES 192.168.31.1 192.168.31.5 1000 10010
QoS State: Off
[root@sylixos:/root]#
删除规则
在 SylixOS 系统中,使用 qosruledel
命令用于删除 QoS 规则。删除时需要使用到网卡名和对应的序列号,使用 qoss
命令查看得出的序列号。
例:删除一条 Qos 规则。
[root@sylixos:/root]# qosruledel en1 0
[root@sylixos:/root]# qoss
NETIF ATTACH SEQNUM RULE CMP_METHOD PRIO DONT_DROP IPs IPe PORTs PORTe
en1 YES 0 IP SRC 5 NO 192.168.31.1 192.168.31.5 N/A N/A
en1 YES 1 TCP BOTH 4 YES 192.168.31.1 192.168.31.5 1000 10010
QoS State: Off
[root@sylixos:/root]#