LINUX网络流量限速控制

这篇具有很好参考价值的文章主要介绍了LINUX网络流量限速控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、TC原理介绍

Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。

Linux流量控制的基本原理如下图所示。

linux 网卡限速,LINUX,linux,网络,服务器,Powered by 金山文档

接收包从输入接口(Input Interface)进来后,经过流量限制(Ingress Policing)丢弃不符合规定的数据包,由输入多路分配器(Input De-Multiplexing)进行判断选择:如果接收包的目的是本主机,那么将该包送给上层处理;否则需要进行转发,将接收包交到转发块(Forwarding Block)处理。转发块同时也接收本主机上层(TCP、UDP等)产生的包。转发块通过查看路由表,决定所处理包的下一跳。然后,对包进行排列以便将它们传送到输出接口(Output Interface)。一般我们只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以我们可以通过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。

Linux的网络流控,控发不控收 , 所以只能对产生瓶颈网卡处的发包速率进行控制.

二、TC规则

1、流量控制方式

流量控制包括以下几种方式:

SHAPING(限制)

当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。

SCHEDULING(调度)

通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。

POLICING(策略)

SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。

DROPPING(丢弃)

如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。

2、流量控制处理对象

流量的处理由三种对象控制,它们是:qdisc(排队规则)、class(类别)和filter(过滤器)。

QDISC(排队规则)

QDisc(排队规则)是queueing discipline的简写,它是理解流量控制(traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。

CLASS(类)

某些QDisc(排队规则)可以包含一些类别,不同的类别中可以包含更深入的QDisc(排队规则),通过这些细分的QDisc还可以为进入的队列的数据包排队。通过设置各种类别数据包的离队次序,QDisc可以为设置网络数据流量的优先级。

FILTER(过滤器)

Filter(过滤器)用于为数据包分类,决定它们按照何种QDisc进入队列。无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可以有多种,使用fileter(过滤器)就是其中之一。使用filter(过滤器)分类时,内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有判决返回,就作进一步的处理,而处理方式和QDISC有关。需要注意的是,filter(过滤器)是在QDisc内部,它们不能作为主体。

3、操作原理

类(Class)组成一个树,每个类都只有一个父类,而一个类可以有多个子类。某些QDisc(例如:CBQ和HTB)允许在运行时动态添加类,而其它的QDisc(例如:PRIO)不允许动态建立类。允许动态添加类的QDisc可以有零个或者多个子类,由它们为数据包排队。此外,每个类都有一个叶子QDisc,默认情况下,这个叶子QDisc使用pfifo的方式排队,我们也可以使用其它类型的QDisc代替这个默认的QDisc。而且,这个叶子叶子QDisc有可以分类,不过每个子类只能有一个叶子QDisc。

当一个数据包进入一个分类QDisc,它会被归入某个子类。我们可以使用以下三种方式为数据包归类,不过不是所有的QDisc都能够使用这三种方式。

tc过滤器(tc filter)

如果过滤器附属于一个类,相关的指令就会对它们进行查询。过滤器能够匹配数据包头所有的域,也可以匹配由ipchains或者iptables做的标记。

服务类型(Type of Service)

某些QDisc有基于服务类型(Type of Service,ToS)的内置的规则为数据包分类。

skb->priority

用户空间的应用程序可以使用SO_PRIORITY选项在skb->priority域设置一个类的ID。

树的每个节点都可以有自己的过滤器,但是高层的过滤器也可以直接用于其子类。

如果数据包没有被成功归类,就会被排到这个类的叶子QDisc的队中。相关细节在各个QDisc的手册页中。

4、命名规则

所有的QDisc、类和过滤器都有ID。ID可以手工设置,也可以有内核自动分配。ID由一个主序列号和一个从序列号组成,两个数字用一个冒号分开。

QDISC

一个QDisc会被分配一个主序列号,叫做句柄(handle),然后把从序列号作为类的命名空间。句柄采用象10:一样的表达方式。习惯上,需要为有子类的QDisc显式地分配一个句柄。

类(CLASS)

在同一个QDisc里面的类分享这个QDisc的主序列号,但是每个类都有自己的从序列号,叫做类识别符(classid)。类识别符只与父QDisc有关,和父类无关。类的命名习惯和QDisc的相同。

过滤器(FILTER)

过滤器的ID有三部分,只有在对过滤器进行散列组织才会用到。

5、单位

tc命令的所有参数都可以使用浮点数,可能会涉及到以下计数单位。

1》带宽或者流速单位:

kbps 千字节/秒

mbps 兆字节/秒

kbit KBits/秒

mbit MBits/秒

bps或者一个无单位数字 字节数/秒

2》数据的数量单位:

kb或者k 千字节

mb或者m 兆字节

mbit 兆bit

kbit 千bit

3》时间的计量单位:

s、sec或者secs 秒

ms、msec或者msecs 分钟

us、usec、usecs或者一个无单位数字 微秒

三、具体操作场景测试

Linux流量控制主要分为建立队列、建立分类和建立过滤器三个方面。

1、基本实现步骤为:

(1) 针对网络物理设备(如以太网卡ens32)绑定一个队列QDisc;

(2) 在该队列上建立分类class;

(3) 根据需要建立子队列和子分类;

(4) 为每个分类建立过滤器。

2、环境模拟实例:

流量控制器上的以太网卡(ens32) 的IP地址为192.168.100.100。

假如有三种类型的流量需要控制:

1) 是发往主机1的,其IP地址为192.168.100.101。其流量带宽控制在30Mbit,优先级为2; 

2) 是发往主机2的,其IP地址为192.168.100.102。其流量带宽控制在20Mbit,优先级为1; 

3) 是发往子网1的,其子网号为192.168.101.*,子网掩码为255.255.255.0。流量带宽控制在10Mbit,优先级为6。

a. 建立队列

一般情况下,针对一个网卡只需建立一个队列。

首先,需要为网卡ens32配置一个HTB队列,使用下列命令:

tc qdisc add dev ens32 root handle 10: htb default 256

这里,命令中的"add 表示要添加,"dev ens32 表示要操作的网卡为ens32。"root 表示为网卡ens32添加的是一个根队列。"handle 10: 表示队列的句柄为10:。"htb 表示要添加的队列为HTB队列。命令最后的"default 256 是htb特有的队列参数,意思是所有未分类的流量都将分配给类别10:256。

b、为根队列创建相应的类别

可以利用下面这三个命令为根队列10创建三个类别,分别是10:11、10:12和10:13,它们分别占用30、20和10mb的带宽。

tc class add dev ens32 parent 10: classid 10:1 htb rate 30mbit ceil 30mbit

tc class add dev ens32 parent 10: classid 10:2 htb rate 20mbit ceil 20mbit

tc class add dev ens32 parent 10: classid 10:3 htb rate 10mbit ceil 10mbit

命令中,"parent 10:"表示类别的父亲为根队列1:。"classid10:1"表示创建一个标识为10:1的类别,"rate 30mbit"表示系统将为该类别确保带宽30mbit,"ceil 30mbit",表示该类别的最高可占用带宽为30mbit。

c、为各个类别设置过滤器

创建三个过滤器,如下面的三个命令:

tc filter add dev ens32 parent 10: protocol ip prio 2 handle 100 fw classid 10:1

tc filter add dev ens32 parent 10: protocol ip prio 1 handle 200 fw classid 10:2

tc filter add dev ens32 parent 10: protocol ip prio 6 handle 300 fw classid 10:3

d、结合iptables限速

iptables -t mangle -A POSTROUTING -d 192.168.100.101 -j MARK --set-mark 100

iptables -t mangle -A POSTROUTING -d 192.168.100.102 -j MARK --set-mark 200

iptables -t mangle -A POSTROUTING -d 192.168101.0/24 -j MARK --set-mark 300

e、取消限速操作

tc qdisc del dev ens32 root

iptables -t mangle -F文章来源地址https://www.toymoban.com/news/detail-596967.html

到了这里,关于LINUX网络流量限速控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux并发服务器 —— linux网络编程(七)

    C/S结构 - 客户机/服务器;采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互;C/S结构中,服务器 - 后台服务,客户机 - 前台功能; 优点 1. 充分发挥客户端PC处理能力,先在客户端处理再提交服务器,响应速度快; 2. 操作界面好看,满足个性化需求; 3.

    2024年02月09日
    浏览(62)
  • Linux服务器上EMQX Dashboard控制台登录密码忘了

    1.登录阿里云服务器管理控制台,[ 远程连接 ] 接入阿里Linux服务器;  2.输入以下代码 cd /usr/lib/emqx ,表示去到库目录emqx下 ./bin/emqx_ctl admins, 回车会出现 第一条命令添加用户(输入新用户名+新密码),第二条命令重置密码(原用户名+新密码),第三条命令删除用户(删除

    2024年02月15日
    浏览(39)
  • Dell R710 iDRAC6 远程控制卡设置_服务器如何配置远程控制网卡(1)

    设置串口重定向 COM1就是服务器接显示器的串口,我们需要将 COM1 的输入重定向到 COM2 接口,观察控制台的输出。 重新启动服务器,按F2 进入 BIOS 设置菜单: 选择 “Serial Communication ”,按图示设置串口重定向参数: 注意:如果telnet/SSH连接时出现乱码,可以设置 Remote Termin

    2024年04月26日
    浏览(28)
  • Linux - 进阶 NFS服务器 详解网络共享服务器 ( 预备知识)

               N  :  就是 网络 Network          F   :     就是  File  文件         S   :  system          简称为 网络文件系统                 官方   :               NFS 是一种古老的用于UNIX/LINUX主机之间进行文件共享的协议              Network  File  System 网

    2024年02月13日
    浏览(40)
  • linux服务器监控之内存、cpu、网络、磁盘

    一、服务器实时内存监控 1、Linux帮助命令 man:Linux下的函数手册命令,可以查看所有命令的使用方法 ls:  ls -al: ll: 2、实时监控命令 top:   能够实时监控系统的运行状态,并且可以按照cpu及内存等进行排序。            语法:top -hv|-bcHiOSs -d secs -n max -u|U user -p pid(s) -o file

    2024年02月09日
    浏览(49)
  • 【Linux网络编程】网络编程套接字(TCP服务器)

    作者:爱写代码的刚子 时间:2024.4.4 前言:本篇博客主要介绍TCP及其服务器编码 只介绍基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP地址 但是我们通常用点分十进制的字符串表示IP地址,以下函数可以在字符串表示和in_addr表示之间转换 字符串转in

    2024年04月14日
    浏览(53)
  • 【Linux网络服务】Centos7搭建nfs文件共享服务器

    1.NFS介绍 2.环境准备 3.在A服务端机器安装nfs-utils和rpcbind包 4.启动rpcbind检查是否启动了rpcbind服务并监听111端口 5.配置NFS服务的配置文件,参数配置:vi /etc/exports 数据同步与数据异步的区别 数据同步:当系统从内存中向磁盘中持久化数据时,同步发送表示只有当内存中的数据

    2024年02月06日
    浏览(50)
  • Linux服务器配置指南:网络、用户管理、共享服务及DNS配置详解

    💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】 🤟 基于Web端打造的:👉轻量化工具创作平台 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 设置虚拟机的网卡为仅主机模式,并要求服务器采用双网卡, ens33 IP地址设置为192.168. 5.x/24(其中x学号),

    2024年02月05日
    浏览(40)
  • Linux系统如何查看服务器带宽及网络使用情况

       操作系统: Linux    操作环境: Centos7   Linux系统中如何查看服务器带宽?本篇文章主要和大家分享一下Linux系统中查看服务器带宽的方法,有需要的朋友可以参考一下。 众多网络相关的命令可查看:【Linux】之【网络】相关的命令及解析[ethtool、nload、nethogs、iftop、

    2024年02月02日
    浏览(57)
  • Linux系统如何查看服务器带宽及网络使用情况?

    要查看Linux服务器的带宽和网络使用情况,可以使用以下命令和工具: ifconfig命令:ifconfig命令用于显示和配置网络接口信息,包括带宽和网络使用情况。 使用以下命令查看所有网络接口的信息: 该命令将显示每个网络接口的详细信息,包括接收和发送的数据包数量以及网络

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包