弱网环境搭建之 Linux tc 详解

  • 0. 背景
  • 1. 工具选择
  • 2. 搭建流程
    • 2.1 Linux tc 简介
    • 2.2 弱网搭建思路
    • 2.3 完整代码展示

0. 背景

笔者有一个需要搭建弱网环境来复现某个网络问题的需求,因此开始在网络中寻找能够快速搭建弱网环境的方式。

不同应用对于弱网环境的定义是不同的,需要根据具体的应用场景进行划分。但一般意义而言,对于弱网环境的测试主要集中于对带宽、丢包、延时等方面的模拟,来还原当用户网络环境较差时的情况。

弱网环境搭建可以分为客户端服务端,客户端模拟弱网环境主要是通过控制移动设备的上下行流量来实现,比如腾讯的 QNET;客户端一般也可以是 Windows 客户端,常见的搭建工具有 Network Emulator;而在服务端(这里指Linux服务器),常用的有 Facebook 的 ATC。

1. 工具选择

通过调研,市面上其实已经有许多现成的易于使用的工具,但是由于灵活性及可靠性的要求,使用现有工具不利于排查问题,因此最终还是选择了 tciptables 辅助的方式来进行搭建。

这里没有选择 ATC 的原因主要还是因为 ATC 非 Linux 自带的工具,可能会存在版本等问题,但如果为了快速搭建弱网环境还是建议选择 ATC。

2. 搭建流程

2.1 Linux tc 简介

因为选择了 tc 作为搭建工具,这里简单的介绍一下 Linux tc :

Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。接收包从输入接口进来后,经过流量限制丢弃不符合规定的数据包,由输入多路分配器进行判断选择。
一般只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以可以通过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。

简单来说,tc 就是一个流量控制器,可以实现限速、流量整形等功能,主要原理是通过设置不同类型的队列,来控制数据包发送的速率和优先级,达到流量控制的效果。

在 tc 中,对流量的处理由三种对象控制,qdisc(排队规则),class(类),filter(分类器)

  • qdisc : qdisc 是 queueing discipline 的缩写。qdisc 的含义是,当内核需要通过配置了 qdisc 的网卡发送数据包时,必须根据 qdisc 的规则将数据包放入队列中,然后内核从队列中取出数据包发送。qdisc 可以分为可分类与不可分类两种,不可分类的有pfifo(最简单的先进先出策略)、red(随机丢弃部分数据包)、tbf(内部采用令牌桶, 主要用于限速)等;可分类的包括HTB(主要用于带宽控制)、PRIO(用于优先级管理)。更详细的解释可参考这篇文章

  • class :对于不同的数据流可能需要不同的控制策略,因此部分 qdisc 可以包含一些类别,不同的类别中还可以包含下一层 qdisc 从而形成一棵策略树。

  • filter : filter 本该翻译为过滤器,但由于它与 class(类) 的关系,将它译为了分类器。顾名思义,filter用于为数据包分类,决定它们按照哪种 qdisc 进入队列。需要注意的是,filter 位于 qdisc内部,它们不能作为主体。

综上,qdisc 可以添加类,类(Class)组成一个树,由它们为数据包排队。此外,每个类都有一个叶子 qdisc,默认情况下,这个叶子 qdisc 使用pfifo的方式排队,也可以使用其它类型的 qdisc 代替。一般有有三种方式——tc filter、ToS、skb 为数据包归类,常见的一般是 tc filter。

2.2 弱网搭建思路

弱网搭建主要是使用 tc 的基本功能来还原弱网的情况,以下将讲解几个常用的命令:

首先是带宽限制功能,一般来说可以用 htb 或者 tbf 来实现,但因为 tbf 是无类别的,无法添加子类规则,所以选择了 htb 进行限速。

首先为网卡添加一个 htb 队列,下述命令指定了该队列的类别,使用”major:minor”这样的形式来标识一个队列,其中major和minor都是数字。default xx 是 htb 特有的参数,是为了指定在默认情况下,数据包会被分给哪一个子类。

tc qdisc add dev ${adapter} root handle 10: htb default ${handle_id} r2q 100

然后为该父队列添加一个子类,子类的 major 必须与父类的 major 相同,并且指定 rate limit,可以用 Mbit、Kbit 等作为单位。

tc class add dev ${adapter} parent 10: classid 10:1 htb rate 1000mbit ceil 1000mbit

在进行限速之后,可以通过如下命令设置数据包的发送延迟,delay_time 是发送延迟,而后面紧跟的 10ms 代表实际发送中会有 10ms 的波动,从而模拟更真实的情况。

tc qdisc add dev ${adapter} parent 10:20 handle 101: netem delay ${delay_time}ms 10ms distribution normal

也可以通过如下命令增加丢包频率、包损坏、乱序等规则,模拟出需要的弱网情况。

# 设置丢包频率
tc qdisc add dev ${adapter} parent 101: handle 102: netem loss ${loss}%# 设置包重复
tc qdisc add dev ${adapter} parent 10:20 handle 103: netem duplicate ${duplicate}%# 设置包损坏
tc qdisc add dev ${adapter} parent 10:20 handle 104: netem corrupt ${corrupt}%# 设置数据包乱序
tc qdisc add dev ${adapter} parent 10:20 handle 105: netem reorder ${reorder}% 50%

使用 iptables 模拟一些极端网络情况,

2.3 完整代码展示

完整的代码如下所示,tc 的命令并不是特别复杂,需要注意的父类子类之间的关系,以及如何设置 qdisc 和 class

#!/bin/bash# 网卡
adapter="eth0"
handle_id=20# 初始化参数
rate_limit=500
delay_time=30
loss=1
duplicate=0
corrupt=0
reorder=0
default_ip="0.0.0.0"
is_ip_filter=0
default_port=443
is_port_filter=0# 删除之前规则 (root)
tc qdisc del dev ${adapter} root### 设置tc规则 (2. 指定端口 4. iptables规则)
tc qdisc add dev ${adapter} root handle 10: htb default ${handle_id} r2q 100# 设置限速(非严格限速)
tc class add dev ${adapter} parent 10: classid 10:1 htb rate 1000mbit ceil 1000mbit
tc class add dev ${adapter} parent 10:1 classid 10:10 htb rate 1000mbit ceil 1000mbit
tc class add dev ${adapter} parent 10:1 classid 10:20 htb rate ${rate_limit}Kbit ceil ${rate_limit}Kbit# 设置过滤器(ip & 端口过滤)
if [ ${handle_id} -eq 10 ];thenif [ ${is_ip_filter} -eq 1 ];thentc filter add dev ${adapter} protocol ip parent 10:0 prio 1 u32 match ip dst ${default_ip} flowid 10:20fiif [ ${is_port_filter} -eq 1 ];thentc filter add dev ${adapter} protocol ip parent 10:0 prio 1 u32 match ip sport ${default_port} 0xffff flowid 10:20fi
fi# 设置延迟
tc qdisc add dev ${adapter} parent 10:20 handle 101: netem delay ${delay_time}ms 10ms distribution normal# 设置丢包频率
tc qdisc add dev ${adapter} parent 101: handle 102: netem loss ${loss}%# 设置包重复
tc qdisc add dev ${adapter} parent 10:20 handle 103: netem duplicate ${duplicate}%# 设置包损坏
tc qdisc add dev ${adapter} parent 10:20 handle 104: netem corrupt ${corrupt}%# 设置数据包乱序
tc qdisc add dev ${adapter} parent 10:20 handle 105: netem reorder ${reorder}% 50%#iptables -A OUTPUT -p tcp --sport 8080 -j DROP

弱网环境搭建之 Linux tc iptables 详解相关推荐

  1. 【测试笔记】弱网环境搭建—clumsy0.2

    因工作需求,最近接触了弱网环境搭建,浅浅的总结一下给手机搭建弱网环境的整个过程: 实现效果:手机连接指定WiFi上网,延时和丢包在弱网预期内 预期:ping阿里云时延>300ms:丢包率10%. ...

  2. Python3 环境搭建、pycharm安装配置详解、新建Python项目(新手小白版Windows系统)

    Python3 环境搭建 .pycharm安装配置详解 window系统上环境搭建: 一.环境搭建,下载Python (Python 3.8为例) 二.pycharm的下载与安装 window系统上环 ...

  3. Facebook ATC弱网环境搭建

    本文记录如何利用facebook ATC使用搭建一个弱网环境,与前一篇Dash net(网速控制,可变)类似,但是这个弱网环境不能动态变化,相比DASH_NET好处在可以连接多个设备,分别控制网速 为 ...

  4. (转)Facebook ATC弱网环境搭建

    用户的网络环境并不是一直处于能高速传输的状态,网络的好坏受用户所处地理位置,同一基站使用人数等许多因素影响.百度公开的数据显示,百度APP使用者约有1%的人群处于弱网状态.所以研究弱网测试,来提升这部 ...

  5. 【Linux】iptables详解

    文章目录 iptables简介 iptables基础 iptables和netfilter的关系 iptables传输数据包的过程 iptables的规则表和链 表(tables) 链(chains) ...

  6. linux 内网环境搭建 maven 私库

    linux 内网环境搭建 maven 私库 参考资料: https://www.codenong.com/cs106446840/ https://blog.csdn.net/lch_wyl/arti ...

  7. Android 中流量、电量、弱网环境怎么测?

    在使用安卓机时,可能又是会经常感受到以下问题: 1.应用后台开着,手机很快没有电了---应用耗电大: 2.首次/非首次启动应用,进入应用特别慢---应用启动慢: 3.使用使用过程中,越来越卡---CP ...

  8. App-IOS与Android弱网环境测试

    弱网环境下App的功能是否正常使用,是否会发生Crash的等情况? 1.IOS ios系统一般自带弱网环境测试,可以通过设置各种网络环境,模拟弱网环境,如3G,wifi,very bad Networ ...

  9. 网易云信即时通讯推送保障及网络优化详解(三):如何在弱网环境下优化大数据传输

    对于移动 APP 来说,IM 功能正变得越来越重要,它能够创建起人与人之间的连接.社交类产品中,用户与用户之间的沟通可以产生出更好的用户粘性. 在复杂的 Android 生态环境下,多种因素都会造成消 ...

最新文章

  1. 个人技术生涯的感悟(2)
  2. 移动APP的自动化测试
  3. 更加优雅的iOS自动布局
  4. 《Programming WPF》翻译 第3章 2.处理输入
  5. python 单线程_python的单线程多任务的实现
  6. 恒驰机器人_机器人如何造恒驰?探秘最牛汽车生产基地
  7. boost::sort模块实现相关字符串插入测试
  8. 使用Prometheus监控Linux系统各项指标
  9. 013.Zabbix的Items(监控项)
  10. hibernate3配置文件hibernate.cfg.xml的详细解释
  11. 世界上第一台计算机国际象棋大师是如何诞生的?
  12. 6010dn 华为 组网 胖ap_1、认识胖瘦AP以及组网场景
  13. 安防监控芯片市场高清化趋势愈显 成行业共识
  14. 【解决idea谷歌翻译失败问题】
  15. 安卓推送、android文本推送、安卓富媒体推送解决方案
  16. Tomcat服务部署
  17. 关于网络安全里蜜罐的详细介绍
  18. 数据规整化:清理、转换、合并、重塑 《用Python进行数据分析》读书笔记第7章
  19. Android:logo
  20. 科罗拉多大学波尔得分校计算机科学,科罗拉多大学波尔得分校计算机工程专业排名第34(2020年USNEWS美国排名)...

热门文章

  1. 云服务器搭建和Linux基本指令
  2. c:forEach中的 varStatus
  3. 10.2_approx-training
  4. 使用Unity创造动态的2D水体效果
  5. AutoLink平台功能特色及文档说明
  6. matlab2020a安装失败License Manager Error -8的解决方法
  7. Redis Geospatial 地理位置 类型
  8. DWR(2):DWR配置详情
  9. IoT 物联网平台自定义Topic同步调用RRPC实战(二)
  10. 大文娱,文学与文娱(2)