前言
互联网产品的测试常常要覆盖在不同网络下的表现,例如丢包,带宽受限,时延及抖动等网络较差的情况,为了测试场景的网络情况可定义及复现,就需要有个工具对弱网进行模拟。业界一些通用的弱网模拟工具,如 NEWT,fiddler,charles,atc,tc 和 packetstorm 等软硬件弱网模拟工具。相较于硬件模拟器昂贵的价格和其他软件模拟器部署难度大,TC 成本低,部署难度较低且容易和自动化结合实现自动化测试,此外 TC 适用任何平台的设备(包括 PC、移动端等)。本文着重介绍 TC 的原理及应用。
一、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 添加不同设置参数以实现对网络的控制。
二、Linux 中的队列规则
Linux 操作系统中的流量控制器 TC(Traffic Control)用于 Linux 内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控制。TC 使用的队列规则分为两类,一类是无类别队列规则,另一类是分类队列规则。无类别队列规则相对简单,而分类队列规则则引出了分类和过滤器等概念,使其流量控制功能增强,本文中 TC 主要使用分类队列规则。
1、无类别队列规则是对进入网络设备(网卡) 的数据流不加区分统一对待的队列规则。
这类队列规则形成的队列可以对整个网络设备 (网卡) 的流量进行整形,但不能细分各种情况。
常用的无类别队列规则主要有 pfifo _fast (先进先出)、TBF (令牌桶过滤器)、SFQ(随机公平队列)、RED (随机早期检测)等等。这类队列规则使用的整形手段主要是排序、限速和丢包。
1.1 pfifo 和 pfifo_fast
FIFO 是 linux 网络接口的默认 qdisc 规则,没有整形和重排序的功能,仅对收到的包按照先入先出的顺序排出。pfifo_fast 与 pfifo 类似,只是针对收到的流排出三个优先级。
1.2 SFQ
此种队列企图用一套公平的队列算法(哈希函数)来实现收包随机分配到不同 FIFO 序列,但是有些讨厌的软件上就无法保证折中公平性(分布在多个 FIFO 序列上)。
1.3 TBF
如名字所示,令牌桶过滤器基于令牌和桶,只有当令牌足够时,数据包才会从网口发出,否则,数据包将会被延迟发送,以此来实现流量限速。
2、分类队列规则是对进入网络设备的数据包根据不同的需求以分类的方式区分对待的队列规则。数据包进入一个分类的队列后,它就需要被送到某一个类中,也就是说需要对数据包做分类处理。对数据包进行分类的工具是过滤器,队列规则会根据过滤器的分类结果把数据包送入相应的类进行排队。每个子类都可以使用它们的过滤器进一步分类,直到不需要进一步分类为止。如下图所示,为本文中 TC 用到的 HTB,图中详细展示了 qdisc 和类以及子类的关系:
三、TC 的实现
TC 主要包括三个基本要素:队列规则(qdisc,queueing discipline)、类(class)和过滤器(filter)
qdisc:队列规则,TC 的核心,用于确定数据包的发送方式。如下命令实现了指定的 eth0 网卡上所有的包固定加了 200ms 延时
# tc qdisc add dev eth0 root netem delay 200ms
class 和 filter:类和过滤器。类即是数据流量的类别,各种应用和终端的流量通过 filter 进行分类,进入到队列规则里排队进行发送。如下命令行所示即通过 class 和 filter 实现了对指定 ip 的限速,其他弱网类似:
# 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
其他常用到的弱网场景:
延迟波动,如下命令表示延迟为时延 150ms-250ms 波动(由于网卡上发出的包延迟不同,所以会有一定程度的乱序发生):
# tc qdisc add dev eth0 root netem delay 200ms 50ms
乱序,如下代表随机丢包 30%
# tc qdisc add dev eth0 root netem delay 50ms reorder 25%
随机丢包,如下代表随机丢包 30%
# tc qdisc add dev eth0 root netem loss 30%
四、TC 的自动化
通过把上述 TC 命令封装成 python 或其他语言的命令,匹配 ip 地址来对指定的设备设置想要的弱网环境,可以实现通过一条命令即可设置想要的弱网条件。结合一些自动化测试的框架和原有的测试场景的覆盖,实现测试场景的扩展,扩大测试的范围,实现 TC 对不同弱网场景的自动化测试的支持,提升测试的深度和广度。如下命令即为本文封装,实现对 192.168.2.10 设备的上行添加弱网受限 1000k,delay 200ms,jitter 50ms,丢包 10%。
五、扩展
如下一段文字摘自《Traffic Control HOWTO》:
Common traffic control solutions
- Limit total bandwidth to a known rate; TBF, HTB with child class(es).
- Limit the bandwidth of a particular user, service or client; HTB classes and classifying with a filter. traffic.
- Maximize TCP throughput on an asymmetric link; prioritize transmission of ACK packets, wondershaper.
- Reserve bandwidth for a particular application or user; HTB with children classes and classifying.
- Prefer latency sensitive traffic; PRIO inside an HTB class.
- Managed oversubscribed bandwidth; HTB with borrowing.
- Allow equitable distribution of unreserved bandwidth; HTB with borrowing.
- 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、音视频通话、直播、点播、互动白板、短信等功能。