互联网产品的测试经常要覆盖在不一样网络下的表现,例如丢包,带宽受限,时延及抖动等网络较差的状况,为了测试场景的网络状况可定义及复现,就须要有个工具对弱网进行模拟。
业界一些通用的弱网模拟工具,如NEWT,fiddler,charles,atc,tc和packetstorm等软硬件弱网模拟工具。相较于硬件模拟器昂贵的价格和其余软件模拟器部署难度大,TC成本低,部署难度较低且容易和自动化结合实现自动化测试,此外TC适用任何平台的设备(包括PC、移动端等)。python
本文着重介绍TC的原理及应用。linux
1、TC及Netem简介
讲到tc工具不能不提iproute2工具集,iproute2工具集包括了一系列网络相关的工具,像大名鼎鼎的ip命令行工具,本文主要经过iptables建立一条linux系统的两块网卡的桥接。
netem 是 Linux 在2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块能够用来在性能良好的局域网中,模拟出复杂的互联网传输性能,如时延,丢包,抖动等场景。算法
2.6 (或以上) 版本内核的不少发行版 Linux 都开启了该内核功能,好比Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian等,本文以Ubuntu18为例。
tc 是 Linux 系统中的一个工具,全名为traffic control(流量控制)。tc 能够用来控制 netem 的工做模式,每个物理网卡都会和一个qdisc关联,而后经过netem添加不一样设置参数以实现对网络的控制。网络
2、Linux中的队列规则
Linux操做系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,它利用队列规定创建处理数据包的队列,并定义队列中的数据包被发送的方式, 从而实现对流量的控制。TC使用的队列规则分为两类,一类是无类别队列规则, 另外一类是分类队列规则。 无类别队列规则相对简单,而分类队列规则则引出了分类和过滤器等概念,使其流量控制功能加强,本文中TC主要使用分类队列规则。
一、无类别队列规则是对进入网络设备(网卡) 的数据流不加区分统一对待的队列规则。架构
这类队列规则造成的队列能够对整个网络设备(网卡)的流量进行整形,但不能细分各类状况。
经常使用的无类别队列规则主要有pfifo _fast (先进先出) 、TBF ( 令牌桶过滤器) 、SFQ(随机公平队列) 、RED (随机早期检测)等等。这类队列规则使用的整形手段主要是排序、限速和丢包。
1.1 pfifo和pfifo_fastapp
FIFO是linux网络接口的默认qdisc规则,没有整形和重排序的功能,仅对收到的包按照先入先出的顺序排出。pfifo_fast与pfifo相似,只是针对收到的流排出三个优先级。
此种队列企图用一套公平的队列算法(哈希函数)来实现收包随机分配到不一样FIFO序列,可是有些讨厌的软件上就没法保证折中公平性(分布在多个FIFO序列上)。
如名字所示,令牌桶过滤器基于令牌和桶,只有当令牌足够时,数据包才会从网口发出,不然,数据包将会被延迟发送,以此来实现流量限速。
二、分类队列规则是对进入网络设备的数据包根据不一样的需求以分类的方式区分对待的队列规则。函数
数据包进入一个分类的队列后, 它就须要被送到某一个类中, 也就是说须要对数据包作分类处理。对数据包进行分类的工具是过滤器,队列规则会根据过滤器的分类结果把数据包送入相应的类进行排队。每一个子类均可以使用它们的过滤器进一步分类,直到不须要进一步分类为止。以下图所示,为本文中TC用到的HTB,图中详细展现了qdisc和类以及子类的关系:
3、TC的实现
TC主要包括三个基本要素:队列规则(qdisc,queueing discipline)、类(class)和过滤器(filter)
# tc qdisc add dev eth0 root netem delay 200ms
# tc class add dev eth0 parent 1:1 classid 1:2 htb rate 500kbit
# tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match 192.168.2.10 flowid 1:3
其余经常使用到的弱网场景:工具
# tc qdisc add dev eth0 root netem delay 200ms 50ms
# tc qdisc add dev eth0 root netem delay 50ms reorder 25%
# tc qdisc add dev eth0 root netem loss 30%
4、TC的自动化
经过把上述TC命令封装成python或其余语言的命令,匹配ip地址来对指定的设备设置想要的弱网环境,能够实现经过一条命令便可设置想要的弱网条件。
结合一些自动化测试的框架和原有的测试场景的覆盖,实现测试场景的扩展,扩大测试的范围,实现TC对不一样弱网场景的自动化测试的支持,提高测试的深度和广度。
以下命令即为本文封装,实现对192.168.2.10设备的上行添加弱网受限1000k,delay 200ms,jitter 50ms,丢包10%。
5、扩展
以下一段文字摘自《Traffic Control HOWTO》:
Common traffic control solutions
1. Limit total bandwidth to a known rate; TBF, HTB with child class(es).
2. Limit the bandwidth of a particular user, service or client; HTB classes and classifying with a filter. traffic.
3. Maximize TCP throughput on an asymmetric link; prioritize transmission of ACK packets, wondershaper.
4. Reserve bandwidth for a particular application or user; HTB with children classes and classifying.
5. Prefer latency sensitive traffic; PRIO inside an HTB class.
6. Managed oversubscribed bandwidth; HTB with borrowing.
7. Allow equitable distribution of unreserved bandwidth; HTB with borrowing.
8. Ensure that a particular type of traffic is dropped; policer attached to a filter with a drop action.
由上文可见,特定网络场景的弱网设置仅仅对应了第一条,对于一些个性化的网络服务设置、带宽借用以及优先级等更灵活多样的应用,有待你们挖掘。
了解
网易云信,来自网易核心架构的通讯与视频云服务。
网易云信(NeteaseYunXin)是集网易18年IM以及音视频技术打造的PaaS服务产品,来自网易核心技术架构的通讯与视频云服务,稳定易用且功能全面,致力于提供全球领先的技术能力和场景化解决方案。开发者经过集成客户端SDK和云端OPEN API,便可快速实现包含IM、音视频通话、直播、点播、互动白板、短信等功能。