Linux下的网络输入输出流量的带宽控制

整理者:赤子玄心

QQ:280604597

Email:280604597@qq.com

大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的

1   概念

Linux中可以对不同网卡的网络输入输出的数据包做复杂的带宽控制,可以做到针对输入或输出的数据包的不同的源发地址、不同的源发端口、不同的目的地址、不同的目的端口做不同的带宽控制。

Linux中的QoS分为入口(Ingress)部分和出口(Egress)部分,入口部分主要用于进行输入流量的带宽控制,出口部分主要用于进行输出流量的带宽控制。

Linux是通过队列对网络流量进行带宽控制,大多数队列(qdisc)都是用于输出流量的带宽控制,例如HTB队列等,而输入流量只有一个队列,即Ingress队列。HTB队列的可以设置复杂的队列规则,从而灵活的控制输出流量的带宽,而ingress队列的功能很简单,不可指定复杂的队列规则,但可以重定向数据包incoming packets。如果要对输入流量做复杂的带宽控制,可以通过Ingress队列把输入流量重定向到虚拟设备ifb,然后对虚拟设备ifb的输出流量配置HTB队列,就能达到对输入流量设置复杂的队列规则。

Linux的每个网络设备上,默认都会有一个输出队列,默认没有输入队列。添加新的输出队列会覆盖默认的输出队列。

当队列的带宽被占满时,操作系统就会延迟发送数据包,再不行就丢包。

2   HTB队列

2.1 模型

2.2 简介

队列等级划分:一个HTB队列有且只有一个根分类,一个根分类下可以有零至多个主分类,一个主分类下可以有零至多个子分类,一个子分类下还可以有零至多个子分类,……

所有分类的流量统计是在这个分类的入口做的。

所有分类的流量带宽控制是在这个分类的通道里做的。

只有根分类入口上能添加过滤器,其他队列入口只做分流,即使添加过滤器也不会触发。

过滤器只能把数据包扔给最底层的队列,如果该队列有子分类,则数据包不能扔给这个队列,因为有子分类的主分类或子分类是没有队列通道的。注意:如果一定要扔给父队列,这个过滤器能添加成功,且过滤器还能匹配成功,但是数据包就是不走这个队列。

经过测试,发现子分类的带宽不受父分类的带宽控制。

网络设备名:网络设备的名字,一般叫ethX,用ifconfig或ip link命令查看。

虚拟网络设备名:虚拟网络设备的名字,一般叫ifbX,用ifconfig或ip link命令查看。

优先级:优先处理的等级,为整数,数值越低优先级越高。经过测试,发现htb队列的优先级高低没有对数据包产生影响。

队列的优先级由高到低为0、1、2、3、4、5、6、7,最高为0,最低为7。如果过滤器的优先级为0,会导致无法删除此过滤器。

3   输出流量控制

注意:tc命令都是实时生效的。

3.1 查看根分类

Shell命令:tc  [-s]  qdisc  show  dev  网络设备名

注意:-s选项表示显示网络流量信息。

例如:tc  qdisc  show  dev  eth0

解释:查看eth0设备的队列信息。

例如:tc  -s  qdisc  show  dev  eth1

解释:查看eth1设备的队列信息,并显示队列的网络流量信息。

3.2 添加根分类

Shell命令:tc  qdisc  add  dev  网络设备名  root  [handle  根分类句柄]  htb  [default  默认分类句柄]

注意:如果指定了默认分类句柄,当数据包在不被任何过滤器匹配成功时候,就走默认分类。如果指定的默认分类不存在或不指定,数据包就走根分类。

注意:如果要指定根分类句柄,那么其范围必须是大于等于1、小于等于ffff的十六进制数值。如果是其他数值或不指定,则会出现随机的句柄。

例如:tc  qdisc  add  dev  eth0  root  htb

解释:在eth0设备上添加HTB队列的根分类,队列句柄为随机,默认分类为根分类。

例如:tc  qdisc  add  dev  eth0  root  handle  1:  htb

解释:在eth0设备上添加HTB队列的根分类,队列句柄为1:,默认分类为根分类。

例如:tc  qdisc  add  dev  eth1  root  handle  2:  htb  default 2:1

解释:在eth1设备上添加HTB队列的根分类,队列句柄为2:,默认分类句柄为2:1的分类。

3.3 删除根分类

Shell命令:tc  qdisc  del  dev  网络设备名  root

3.4 查看主分类或子分类

Shell命令:tc  [-s]  class  show  dev  网络设备名

注意:-s选项表示显示网络流量信息。

3.5 添加主分类或子分类

Shell命令:tc  class  add  dev  网络设备名  [parent  父分类句柄]  classid  该分类句柄  htb  rate  保留带宽{MBps|KBps|Bps|Mbit|Kbit|bit}  [ceil  共享带宽{MBps|KBps|Bps|Mbit|Kbit|bit}]  [prio  优先级]

注意:如果指定的父队列句柄不存在或不指定时,则父分类就是根分类。

注意:如果不指定共享带宽,则共享带宽和保留带宽一样。

注意:如果指定的优先级为负数,则会导致命令执行失败。如果指定的优先级大于等于8,则优先级实际会设置成7。如果不指定优先级,则优先级实际会设置成0。

bit表示位每秒传输

Bps表示字节每秒传输

KBps表示千字节每秒传输

MBps表示兆字节每秒传输

1MBps=1000KBps

1KBps=1000Bps

使用Mbit、Kbit、bit单位控制输出流量带宽时,会导致控制不准,控制输入流量带宽时没问题。

使用MBps、KBps、Bps单位控制输入输出流量带宽都很准。

例如:tc  class  add  dev  eth0  classid  1:1  htb  rate  100MBps

解释:在eth0设备上添加主分类,父分类默认为根分类,该分类句柄为1:1,保留带宽为100MBps(800000Kbit),共享带宽默认与保留带宽一样,优先级默认为0。

例如:tc  class  add  dev  eth0  parent  1:1  classid  1:2  htb  rate  50MBps  ceil  100MBps  prio  1

解释:在eth0设备上添加子分类,父分类为1:1,该分类句柄为1:2,保留带宽为50MBps(400000Kbit),共享带宽为100MBps(800000Kbit),优先级为1。

3.6 修改主分类或子分类

Shell命令:tc  class  change  dev  网络设备名  classid  分类句柄  htb  rate  保留带宽{MBps|KBps|Bps|Mbit|Kbit|bit}  [ceil  共享带宽{MBps|KBps|Bps|Mbit|Kbit|bit}]  [prio  优先级]

注意:保留带宽是必须要填的,且无法修改父分类。

注意:如果不指定共享带宽,则共享带宽和保留带宽一样。

注意:如果指定的优先级为负数,则会导致命令执行失败。如果指定的优先级大于等于8,则优先级实际会设置成7。如果不指定优先级,则优先级实际会设置成0。

3.7 删除主分类或子分类

Shell命令:tc  class  del  dev  网络设备名  classid  分类句柄

注意:如果有过滤器的与要删除的队列有关联,必须先删除过滤器,然后才能删除该队列。

注意:如果要删除的队列有子队列时,必须先删除子队列,然后才能删除该队列。

3.8 查看过滤器

Shell命令:tc  [-s]  filter  {show|ls}  dev  网络设备名

3.9 添加过滤器

Shell命令:tc  filter  add  dev  网络设备名  parent  根分类句柄  protocol  ip  [prio  优先级]  u32 [match  ip  src  源发IP地址/XX]  [match  ip  sport  XXX  0xffff]  [match  ip  dst  目的IP地址/XX]  [match  ip  dport  XXX  0xffff]  flowid  分类句柄

注意:如果优先级为0或不指定,则优先级实际会设置成很大的一个数,也就是说优先级很低。

3.10  删除过滤器

删除指定优先级的所有过滤器:tc  filter  del  dev  网络设备名  prio  优先级

删除指定句柄的单个过滤器:tc  filter  del  dev  网络设备名  parent  根分类句柄  protocol  ip  prio  优先级  handle  句柄  u32

4   输入流量控制

加载虚拟网络设备驱动:

modprobe ifb

启用虚拟网络设备:

ip  link  set  dev  虚拟网络设备名  up  [txqueuelen  1000]

给网络设备添加ingress队列,ingress队列用于对输入流量控制:

tc  qdisc  add  dev  网络设备名  ingress

注意:ingress队列的句柄默认是ffff:,无法修改。

将网络设备的输入流量重定向到虚拟网络设备的输出流量上:

tc  filter  add  dev  网络设备名  parent  ffff:  protocol  ip  u32  match  u32  0  0  flowid  1:1  action  mirred  egress  redirect  dev  虚拟网络设备名

5   tc命令

tc qdisc

tc class {add | replace | change | del}

tc filter

6   例子

l  一个:

以下eth1为内网网卡地址

tc qdisc del dev eth1 root #删除以前的队列

tc qdisc add dev eth1 root handle 1: htb #开启限速规则为htb(分层令牌桶)

tc class add dev eth1 parent 1: classid 1:1 htb rate 3mbit burst 15k #规划限制带宽为3M峰值15k

tc qdisc add dev eth1 parent 1:1 handle 10: sqf perturb 10 #设定平均分配带宽

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.8.17 flowid 1:1 #限制192.168.8.17速度为3mbit

Linux下的网络输入输出流量的带宽控制(2015-11-23更新)的更多相关文章

  1. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  2. Linux下的网络远程安装

    Linux下的网络远程安装 1.用RHEL6.5光盘安装第一台服务器 2.在第一台服务器上配置YUM服务器 先创建一个挂载 #mount #umount /dev/cdrom #mkdir /mnt/ ...

  3. 八、Linux下的网络服务器模型

    服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器,按处理方式来分有循环服务器和并发服务器. 在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提 ...

  4. linux下Python网络编程框架-Twisted安装

    Twisted是python下的用来进行网络服务和应用程序编程的框架,安装Twisted前需要系统预先安装有python. 一.安装Twisted http://twistedmatrix.com/R ...

  5. netstat 在windows下和Linux下查看网络连接和端口占用

    假设忽然起个服务,告诉我8080端口被占用了,OK,我要去看一下是什么服务正在占用着,能不能杀 先假设我是在Windows下: 第一列: Proto 协议 第二列: 本地地址[ip+端口] 第三列:远 ...

  6. linux下python启动第三方程序,并控制关闭

    import subprocess import os import signal p = subprocess.Popen("recordmydesktop -o /home/test/t ...

  7. linux下socket connect 阻塞方式 阻塞时间控制

    同事今天问我,如何在linux下的c代码里面控制connect的阻塞时间.应用的背景是:linux下的c程序有两个目标IP需要connect,如果用阻塞方式,当其中一个IP不能连接的情况下,程序将阻塞 ...

  8. Linux下SVN部署/安全及权限配置,实现web同步更新

    转自:http://www.cnblogs.com/me115/archive/2013/04/07/3002058.html 本文包含以下内容: SVN服务器安装 SVN权限管理 SVN使用SASL ...

  9. linux下如何使用vnstat查看服务器带宽流量统计

    因为很多vps或者服务器都是限流量的,但是又很多服务商并没有提供详细的流量表,比如每天的流量表,所以肯定有人很想知道自己服务器到底跑了多少流量. vnstat就是一个很好用的服务器流量统计命令.我截几 ...

  10. LInux下实时网络流量监控工具nload教程

    https://jingyan.baidu.com/article/642c9d340cbef0644a46f72a.html http://blog.csdn.net/u014171641/arti ...

随机推荐

  1. tomcat Filter内存马

    idea调试的时候加入源代码 <dependency> <groupId>org.apache.tomcat</groupId> <artifactId> ...

  2. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-6-元素定位大法-下篇

    1.简介 上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的定位方法的理论基础知识以及在什么情况下推荐使用.今天这一篇讲解和分享一下,在日常中很少用到或者很少见的定位 ...

  3. BUUCTF-MISC-面具下的flag(vmdk的解压和Brainfuck与Ook解密)

    准备工作 下载附件得到一个一张图片 丢入winhex,发现还有一个flag.vmdk文件 vmdk文件其实是虚拟机使用的硬盘文件 打开kali binwalk -e mianju.jpg 关键步骤 这 ...

  4. LeetCode 周赛上分之旅 #33 摩尔投票派上用场

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思 ...

  5. PWM点灯

    目录 PWM脉冲宽调点灯 前言 1.什么是PWM 2.PWM的实现 3.PWM实现步骤(通用定时器) 3.1 打开定时器的时钟 3.2 配置端口 3.3 设置定时器 3.4 设置PWM 3.5 完整代 ...

  6. .NET for Apache Spark 入门演练

    .NET for Apache Spark 入门演练 微软官方文档: .NET for Apache Spark 入门 | Microsoft Learn 注意:由于本次在windows平台下进行演练 ...

  7. C语言链表实现(郝斌数链表学习笔记)

    #include "stdafx.h" #include<stdio.h> #include<stdlib.h> typedef struct Node { ...

  8. Elementary OS old version download 旧版本下载

    Elementary OS 号称是最漂亮的Linux发行版,没有之一.确实,他的整体风格看起来就是特别舒服,说不出哪里特别好,但也挑不出什么毛病.相比之下,其他Linux的界面总感觉不太和谐.比如特别 ...

  9. SpringBoot里的Servlet和实现

    Servlet 接口,一个规范, SpringBoot Spring Boot 是 Spring 的子项目,正如其名字,提供 Spring 的引导( Boot )的功能. 通过 Spring Boot ...

  10. 【pandas小技巧】--反转行列顺序

    反转pandas DataFrame的行列顺序是一种非常实用的操作.在实际应用中,当我们需要对数据进行排列或者排序时,通常会使用到Pandas的行列反转功能.这个过程可以帮助我们更好地理解数据集,发现 ...