1 QoS简介
QoS(Quality of
Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制,是用来解决网络延迟和阻塞等问题的一种技术。在正常情况下,如果网络只用于特定的无时间限制的应用系统,并不需要QoS,比如Web应用,或E-mail设置等。但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS
能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。如提高QQ的所有数据报文优先级并设置dont_drop选项,保证QQ在网络环境较差时不掉线。
2 QoS操作方法
QoS相关的操作命令有三个,添加(qosruleadd)、删除(qosruledel)和查看(qoss)。
2.1 添加
如下是一条添加ip规则命令:
# qosruleadd en1 ip 192.168.31.1 192.168.31.5 SRC 5 no
其中“en1”表示网络接口,“ip”表示规则针对的数据包类型,后面紧跟IP地址范围。IP地址范围之后为方法及表示这条规则针对源地址(SRC)、目的地址(DEST)还是所有地址(BOTH)都有效。方法后是优先级,范围为1到7。最后是是否打开dont_drop选项及不丢包选项,“yes”就表示此包不会被协议栈丢失。
若针对tcp或udp的数据包类型,则需要加上对应的端口号范围,如下:
# qosruleadd en1 tcp 192.168.31.1 192.168.31.5 1000 10010 BOTH 4 yes
2.2 查看
查看使用qoss命令,如图 2.1所示。
图 2.1 qoss查看
2.3 删除
删除时需要使用到网卡名和对应的序列号,即使用qoss查看得出的序列号,如下:
# qosruledel en1 0
3 QoS实现原理
3.1 QoS网络层次
QoS层处于TCP/IP协议栈与netjob之间,解析每一个提交给协议栈和从协议栈发出的数据包。并针对不同类型的数据包按照指定的规则操作,基本结构如图 3.1所示。
图 3.1 QoS网络层次结构
3.2 QoS数据结构
QoS相关的数据主要有2类,规则结构和QoS接口结构。规则结构又分TCP、UDP、IP三种,共4种结构,如程序清单 3.1所示。
程序清单 3.1 QoS数据结构
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;
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;
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;
/*********************************************************************************************************
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;
3.3 QoS插入规则流程
插入一个新规则时会根据网络接口名创建对应的QoS接口结构并放入QoS哈希表中,同样将此QoS接口保存到对应的网络接口结构中,以便此网络接口有数据交换时可以查找对应的规则。如图 3.2所示。
图 3.2 QoS哈希表结构框图
然后将对应的规则保存到QoS接口结构的规则链表中,若之后需加入相同网络接口名的规则则添加到此链表中,如图 3.3所示。
图 3.3 QoS规则链表
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/192354.html