对网站建设起到计划和指导的作用,怎么样网站速度快,云南高端网站建设公司,网页翻译算切屏吗TC和QoS 1 流量控制#xff08;Traffic Control#xff09;1.1 TC工作原理1.2 TC的三个组成1.2.1 Qdisc-无类队列和有类队列1.2.2 过滤器1.2.3 类别 1.3 基本命令1.3.1 TBF操作实例1.3.2 CBQ操作实例1.3.3 HTB操作实例1.3.4 监视1.3.5 维护 2 服务质量#xff08;Quality of… TC和QoS 1 流量控制Traffic Control1.1 TC工作原理1.2 TC的三个组成1.2.1 Qdisc-无类队列和有类队列1.2.2 过滤器1.2.3 类别 1.3 基本命令1.3.1 TBF操作实例1.3.2 CBQ操作实例1.3.3 HTB操作实例1.3.4 监视1.3.5 维护 2 服务质量Quality of Service2.1 概念2.2 服务模型2.2.1 Best-Effort服务模型2.2.2 IntServ服务模型2.2.3 Differ服务模型 2.3 技术背景 1 流量控制Traffic Control
最简单的流量控制往往是通过采集速率在超过指定速率后丢弃数据包但这种方案并不能将流量控制在指定速率还会导致传输质量的较大损失。Linux内核内置了一个TC流量控制框架主要实现流量限速、流量整形和策略应用策略包括丢弃、NAT等。在输出端口处建立一个队列基于目的IP地址或目的子网的网络号将需要延迟发送的数据包缓冲在队列中并在合适的时间发送出去。因此TC主要有三个要素
QdiscQueue discipline队列规定filter 过滤器class 类别
1.1 TC工作原理 数据包在经过网卡后按需求经过过滤器后被存入不同叶子队列中。
Linux在实现TC的时候对队列进行了抽象基本维护了两个回调函数指针分别是入队enqueue操作和出队dequeue操作。对于叶子节点队列进行数据包的入队和出队对于非叶子节点的队列来说并没有真正的数据包排入或排出而是递归调用其它抽象队列的相应入队和出队操作。
1.2 TC的三个组成
1.2.1 Qdisc-无类队列和有类队列
无类队列CLASSLESS QDISC对进入网络设备网卡的数据流不加以区分统一对待的队列规定。 有类队列CLASSFUL QDISC对进入网络设备网卡的数据包根据不同的需求以分类的方式区别对待的队列规定。有类队列包括CBQClass Based Queueing基于类别队列、HTBHierarchy Token Bucket分层令牌桶队列和PRIO优先级队列
CBQ实现了一个丰富的连接共享类别结构既有限制带宽的能力也具有带宽优先级别管理的能力。HTB实现了一个丰富的连接共享类别结构可以很容易地保证每个类别的带宽虽然它也允许特定的类可以突破带宽上限占用别的类的带宽。HTB可以通过TBFToken Bucket Filter实现带宽限制也能够划分类别的优先级。PRIO很容易管理流量的优先级但限制不能限制带宽因为属于不同类别的数据包是顺序离队的。只有属于高优先级类别的数据包全部发送完毕才会发送属于低优先级类别的数据包。
CBQ与HTB相比HTB更佳。基于令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。
令牌桶算法
#include iostream
#include atomic
#include ctime
#include time.hclass TokenBucket {typedef enum color{GREEN,RED}COLOR;
private :int m_cir; // 添加令牌的速率int m_cbs; // 桶的容量std::atomicint64_t m_clsLastUpdateTime; // 上次桶内令牌数更新时间std::atomicint64_t m_clsCurTokenNum; // 当前桶内令牌数// 毫秒级时间不够用可以自己重写int64_t _get_cur_time() {return clock();}public:TokenBucket(int cir, int cbs) {m_cir cir;m_cbs cbs;m_clsLastUpdateTime _get_cur_time();}~TokenBucket() {}/************************ 数据包处理函数参数token, 数据包大小返回值RED, 惩罚处理GREED, 放行************************/COLOR packetProcess(int token) {int64_t nowTime;int64_t timeInterval;int64_t updateTokenNum;int64_t curTokenNum m_clsCurTokenNum.load();if (token curTokenNum) {m_clsCurTokenNum.fetch_sub(token);return GREEN;}nowTime _get_cur_time();timeInterval nowTime - m_clsLastUpdateTime.load();updateTokenNum timeInterval * m_cir curTokenNum;if (updateTokenNum token) {return RED;}else {updateTokenBucket(nowTime, updateTokenNum);}m_clsCurTokenNum.fetch_sub(token);return GREEN;}/************************ 更新令牌桶内的时间以及数量参数time, 更新时间num, 数量返回值void************************/void updateTokenBucket(int64_t time, int64_t num) {m_clsLastUpdateTime.store(time);m_clsCurTokenNum.store(num);}
};代码来源令牌桶算法原理及实现
1.2.2 过滤器
过滤器filter是用于对数据包进行分类的工具。
u32过滤器源/目的IP地址源/目的端口协议类型服务类型TOS
sudo tc filter add dev ens33 parent 1:0 protocol ip prio 1 u32 match ip src 192.168.79.131 flowid 1:1 #源IP地址
sudo tc filter add dev ens33 parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.79.131 flowid 1:1 #目的地址
sudo tc filter add dev ens33 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid 1:1 #源端口
sudo tc filter add dev ens33 parent 1:0 protocol ip prio 1 u32 match ip dport 80 0xffff flowid 1:1 #目的端口
sudo tc filter add dev ens33 parent 1:0 protocol ip prio 1 u32 match ip protocol 1 0xffff flowid 1:1 #根据/etc/protocols来决定协议号
sudo tc filter add dev ens33 parent 1:0 protocol ip prio 1 u32 match ip tos 0x10 0xff flowid 1:1 #选择交互和最小延迟的数据流匹配大量传输根据iptables的标记fwmark进行过滤
sudo iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6
sudo tc filter add dev ens33 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1根据路由具体可见下一节中的操作实例。
1.2.3 类别
类class组成一个树每个类都只有一个父类而一个类可以有多个子类。
1.3 基本命令
1.3.1 TBF操作实例
sudo tc qdisc add dev ens33 handle 1: root tbf rate 100Mbit burst 100Kbit limit 200MbitSize: 168.9M Time: 14.19s Speed: 11.35MB/s
1.3.2 CBQ操作实例
虚拟机IP地址18.04(Server)192.168.79.13116.04192.168.79.12916.04_1192.168.79.132
针对网络物理设备网卡ens33绑定队列针对一个网卡只需要建立一个队列
tc qdisc add dev ens33 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64将一个cbq队列绑定到网络物理设备ens33上其编号为1:0网络物理设备eth0的实际带宽为10Mbit包的平均大小为1000字节包间隔发送单元的大小为8字节最小传输包大小为64字节。
针对一个队列需建立一个根分类对于分类按其分类的编号顺序起作用编号小的优先一但符合某个分类匹配规则通过该分类发送数据包则其后的分类不在起作用
tc class add dev ens33 parent 1:0 classid 1:1 cbq bandidth 10Mbit rate 10Mbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 1Mbit 该队列的最大可用带宽为10Mbit实际分配的带宽为10Mbit可接收冲突的发送最长包数目为20字节最大传输单元加MAC头的大小为1514字节优先级别为8包的平均大小为1000字节包间隔发送单元的大小为8字节相当于实际带宽的加权速率为1Mbit。
在根分类里建立子分类1:2
tc class add dev ens33 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 8Mbit maxburst 20 allot 1514 prio 2 avpkt 1000 cell 8 split 1:0 bounded 该队列的最大可用带宽为10Mbit实际分配的带宽为8Mbit可接收冲突的发送最长包数目为20字节最大传输单元加MAC头的大小为1514字节优先级别为2包的平均大小为1000字节包间隔发送单元的大小为8字节相当于实际带宽的加权速率为800Kbit分类的分离点为1:0且不可借用未使用带宽。
在根分类里建立子分类1:3
tc class add dev ens33 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 2Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 split 1:0该队列的最大可用带宽为10Mbit实际分配的带宽为2Mbit可接收冲突的发送最长包数目为20字节最大传输单元加MAC头的大小为1514字节优先级别为1包的平均大小为1000字节包间隔发送单元的大小为8字节相当于实际带宽的加权速率为200Kbit分类的分离点为1:0。
为每一次分类建立一个过滤器并为每一个分类建立一个路由映射
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 3 flowid 1:3与过滤器相配合建立特定的路由表
ip route add 192.168.79.129 dev eth0 via 192.168.79.131 realm 2发往主机192.168.79.129的数据包通过分类2转发分类2的速率8Mbit。
ip route add 192.168.79.132 dev eth0 via 192.168.79.131 realm 3发往主机192.168.79.132的数据包通过分类3转发分类3的速率1Mbit。
通过由两个FTP客户机分别从服务器下载同一个168.9M的文件通过改变参数得到以下限速结果
SituationNameTimeSpeed未设置TC16.040.86s187MB/s未设置TC16.04_10.61s263MB/s8Mbit bounded16.04164s1004KB/s5Mbit bounded16.04270s610KB/s8Mbit16.040.98s164MB/s2Mbit16.04_11.14s141MB/s
8Mbit 8192Kbit/s 1024 KB/s 5Mbit 640KB/s
1.3.3 HTB操作实例
步骤大致如上一节不赘述。
sudo tc qdisc add dev ens33 root handle 1: htb
sudo tc class add dev ens33 parent 1: classid 1:1 htb rate 10Mbit ceil 10Mbit
sudo tc class add dev ens33 parent 1:1 classid 1:2 htb rate 8Mbit ceil 8Mbit
sudo tc class add dev ens33 parent 1:1 classid 1:2 htb rate 2Mbit ceil 10Mbit
sudo tc filter add dev ens33 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.79.129 flowid 1:2
sudo tc filter add dev ens33 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.79.132 flowid 1:3同样由两个FTP客户机分别从服务器下载同一个168.9M的文件通过改变参数得到以下限速结果
SituationNameTimeSpeed未设置TC16.040.86s187MB/s未设置TC16.04_10.61s263MB/srate 8 ceil 816.04176s933KB/srate 2 ceil 1016.04_1141s1.14MB/srate 2 ceil 216.04_1706s233KB/s
2Mbit 256KB/s 10Mbit 1.25MB/s
1.3.4 监视
主要包括对队列、分类、过滤器和路由状况进行监视。 对队列、分类和过滤器的监视
tc (-s) qdisc/class/filter ls dev eth0对路由情况的监视
ip route1.3.5 维护
主要包括对队列、分类、过滤器和路由的增添、修改和删除。
增添动作一般依照 队列 - 分类 - 过滤器 - 路由 的顺序进行修改动作则没有什么要求删除则依照路由 - 过滤器 - 分类 - 队列 的顺序进行。
2 服务质量Quality of Service
2.1 概念
QoS现指解决网络延迟和阻塞等问题的一种技术用于区分流量保证高优先级带宽的要求与网络质量。QoS技术本身不会增加网络带宽而是在有限的带宽资源下如何平衡地为各种业务分配带宽针对不同需求为业务提供端到端的服务质量保证。实现QoS的一个最基本的方法就是分类和标记。 一个QoS策略包含一个或多个限速规则一个限速规则包含一个或多个流分类规则。QoS通过流分类划分流量并根据配置的限速规则的优先级保证高优先级限速下的带宽。 影响网络服务质量的因素也就成为QoS的度量指标包括带宽、时延和抖动。
2.2 服务模型
2.2.1 Best-Effort服务模型
Best-Effort是最简单也是最早出现的QoS服务模型。在这种模型中网络中的设备上除了保证网络之间路由可达之外不需要部署额外的功能。应用程序可以在任何时候发出任意数量的报文而且不需要通知网络。网络只是尽最大的可能性来发送报文但对时延、可靠性等性能不提供任何保证。 在理想状态下如果有足够的带宽Best-Effort是最简单的服务模式。而实际上这种“简单“带来一定的限制。因此Best-Effort适用于对时延、可靠性等性能要求不高的业务如FTP、E-Mail等。
2.2.2 IntServ服务模型
InterServ模型下网络需要为某个业务预留一条专用通道。这种资源预留的状态称为“软状态”。为了保证这条通道不被占用RSVP会定期发送大量协议报文进行探测。通过RSVP各网元可以判断是否有足够的资源可以预留。只有所有的网元都预留了足够的资源专用通道方可建立。
2.2.3 Differ服务模型
DiffServ服务模型也叫差分服务模型意思就是提供有差别的服务。DiffServ模型中网络中的流量可以根据多种条件被分成多个类或者标记不同的优先级。当网络出现拥塞时不同的类会享受不同的优先处理从而实现差分服务。同一类的业务在网络中会被聚合起来统一发送保证相同的延迟、抖动、丢包率等QoS指标。 报文分类是基础是有区别地实施服务的前提流量监管、流量整形和接口限速主要用于预防拥塞拥塞管理和拥塞避免是用来解决拥塞。
2.3 技术背景
QoS Workflow 当数据包进入设备后它依次经过标记、计量、管制、重分类、队列、整形以及优先级调度。
分类将数据分为不同类别不会修改原来的数据包 标记将数据设置为不同的优先级会修改原来的数据包 计量通过漏桶算法或令牌桶算法实现计量后的数据包会根据不同的整形类别分别保存在缓冲区中待满足对应的要求后再发送 管制丢弃超出带宽的数据包 整形将超出带宽的数据包缓存在内存中限制流出某一网络的某一连接的流量与突发使这类报文以比较均匀的速度向外发送 队列当网络发生拥塞后数据还是要被传递的依照什么样的方式来传数据就需要队列的指导。