TC基础与自动化
前言
互聯(lián)網(wǎng)產(chǎn)品的測(cè)試常常要覆蓋在不同網(wǎng)絡(luò)下的表現(xiàn),例如丟包,帶寬受限,時(shí)延及抖動(dòng)等網(wǎng)絡(luò)較差的情況,為了測(cè)試場(chǎng)景的網(wǎng)絡(luò)情況可定義及復(fù)現(xiàn),就需要有個(gè)工具對(duì)弱網(wǎng)進(jìn)行模擬。業(yè)界一些通用的弱網(wǎng)模擬工具,如NEWT,fiddler,charles,atc,tc和packetstorm等軟硬件弱網(wǎng)模擬工具。相較于硬件模擬器昂貴的價(jià)格和其他軟件模擬器部署難度大,TC成本低,部署難度較低且容易和自動(dòng)化結(jié)合實(shí)現(xiàn)自動(dòng)化測(cè)試,此外TC適用任何平臺(tái)的設(shè)備(包括PC、移動(dòng)端等)。本文著重介紹TC的原理及應(yīng)用。
一、TC及Netem簡(jiǎn)介
講到tc工具不能不提iproute2工具集,iproute2工具集包括了一系列網(wǎng)絡(luò)相關(guān)的工具,像大名鼎鼎的ip命令行工具,本文主要通過(guò)iptables創(chuàng)建一條linux系統(tǒng)的兩塊網(wǎng)卡的橋接。
?????? netem 是?Linux 在2.6?及以上內(nèi)核版本提供的一個(gè)網(wǎng)絡(luò)模擬功能模塊。該功能模塊可以用來(lái)在性能良好的局域網(wǎng)中,模擬出復(fù)雜的互聯(lián)網(wǎng)傳輸性能,如時(shí)延,丟包,抖動(dòng)等場(chǎng)景。
2.6 (或以上)?版本內(nèi)核的很多發(fā)行版?Linux?都開(kāi)啟了該內(nèi)核功能,比如Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian等,本文以Ubuntu18為例。
?????? tc 是?Linux?系統(tǒng)中的一個(gè)工具,全名為traffic control(流量控制)。tc?可以用來(lái)控制?netem?的工作模式,每一個(gè)物理網(wǎng)卡都會(huì)和一個(gè)qdisc關(guān)聯(lián),然后通過(guò)netem添加不同設(shè)置參數(shù)以實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)的控制。
二、Linux中的隊(duì)列規(guī)則
Linux操作系統(tǒng)中的流量控制器TC(Traffic Control)用于Linux內(nèi)核的流量控制,它利用隊(duì)列規(guī)定建立處理數(shù)據(jù)包的隊(duì)列,并定義隊(duì)列中的數(shù)據(jù)包被發(fā)送的方式, 從而實(shí)現(xiàn)對(duì)流量的控制。TC使用的隊(duì)列規(guī)則分為兩類,一類是無(wú)類別隊(duì)列規(guī)則, 另一類是分類隊(duì)列規(guī)則。 無(wú)類別隊(duì)列規(guī)則相對(duì)簡(jiǎn)單,而分類隊(duì)列規(guī)則則引出了分類和過(guò)濾器等概念,使其流量控制功能增強(qiáng),本文中TC主要使用分類隊(duì)列規(guī)則。
1、無(wú)類別隊(duì)列規(guī)則是對(duì)進(jìn)入網(wǎng)絡(luò)設(shè)備(網(wǎng)卡) 的數(shù)據(jù)流不加區(qū)分統(tǒng)一對(duì)待的隊(duì)列規(guī)則。
這類隊(duì)列規(guī)則形成的隊(duì)列可以對(duì)整個(gè)網(wǎng)絡(luò)設(shè)備(網(wǎng)卡)的流量進(jìn)行整形,但不能細(xì)分各種情況。
常用的無(wú)類別隊(duì)列規(guī)則主要有pfifo _fast (先進(jìn)先出) 、TBF ( 令牌桶過(guò)濾器) 、SFQ(隨機(jī)公平隊(duì)列) 、RED (隨機(jī)早期檢測(cè))等等。這類隊(duì)列規(guī)則使用的整形手段主要是排序、限速和丟包。
FIFO是linux網(wǎng)絡(luò)接口的默認(rèn)qdisc規(guī)則,沒(méi)有整形和重排序的功能,僅對(duì)收到的包按照先入先出的順序排出。pfifo_fast與pfifo類似,只是針對(duì)收到的流排出三個(gè)優(yōu)先級(jí)。
SFQ
此種隊(duì)列企圖用一套公平的隊(duì)列算法(哈希函數(shù))來(lái)實(shí)現(xiàn)收包隨機(jī)分配到不同F(xiàn)IFO序列,但是有些討厭的軟件上就無(wú)法保證折中公平性(分布在多個(gè)FIFO序列上)。
TBF
如名字所示,令牌桶過(guò)濾器基于令牌和桶,只有當(dāng)令牌足夠時(shí),數(shù)據(jù)包才會(huì)從網(wǎng)口發(fā)出,否則,數(shù)據(jù)包將會(huì)被延遲發(fā)送,以此來(lái)實(shí)現(xiàn)流量限速。
2、分類隊(duì)列規(guī)則是對(duì)進(jìn)入網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)包根據(jù)不同的需求以分類的方式區(qū)分對(duì)待的隊(duì)列規(guī)則。數(shù)據(jù)包進(jìn)入一個(gè)分類的隊(duì)列后, 它就需要被送到某一個(gè)類中, 也就是說(shuō)需要對(duì)數(shù)據(jù)包做分類處理。對(duì)數(shù)據(jù)包進(jìn)行分類的工具是過(guò)濾器,隊(duì)列規(guī)則會(huì)根據(jù)過(guò)濾器的分類結(jié)果把數(shù)據(jù)包送入相應(yīng)的類進(jìn)行排隊(duì)。每個(gè)子類都可以使用它們的過(guò)濾器進(jìn)一步分類,直到不需要進(jìn)一步分類為止。如下圖所示,為本文中TC用到的HTB,圖中詳細(xì)展示了qdisc和類以及子類的關(guān)系:
三、TC的實(shí)現(xiàn)
?????? TC主要包括三個(gè)基本要素:隊(duì)列規(guī)則(qdisc,queueing discipline)、類(class)和過(guò)濾器(filter)
qdisc:隊(duì)列規(guī)則,TC的核心,用于確定數(shù)據(jù)包的發(fā)送方式。如下命令實(shí)現(xiàn)了指定的eth0網(wǎng)卡上所有的包固定加了200ms延時(shí)
# tc qdisc add dev eth0 root netem delay 200ms
class和filter:類和過(guò)濾器。類即是數(shù)據(jù)流量的類別,各種應(yīng)用和終端的流量通過(guò)filter進(jìn)行分類,進(jìn)入到隊(duì)列規(guī)則里排隊(duì)進(jìn)行發(fā)送。如下命令行所示即通過(guò)class和filter實(shí)現(xiàn)了對(duì)指定ip的限速,其他弱網(wǎng)類似:
# 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
其他常用到的弱網(wǎng)場(chǎng)景:
延遲波動(dòng),如下命令表示延遲為時(shí)延150ms-250ms波動(dòng)(由于網(wǎng)卡上發(fā)出的包延遲不同,所以會(huì)有一定程度的亂序發(fā)生):
# tc qdisc add dev eth0 root netem delay 200ms 50ms
亂序,如下代表隨機(jī)丟包30%
# tc qdisc add dev eth0 root netem delay 50ms reorder 25%??
?
隨機(jī)丟包,如下代表隨機(jī)丟包30%
# tc qdisc add dev eth0 root netem loss 30%??
四、TC的自動(dòng)化
通過(guò)把上述TC命令封裝成python或其他語(yǔ)言的命令,匹配ip地址來(lái)對(duì)指定的設(shè)備設(shè)置想要的弱網(wǎng)環(huán)境,可以實(shí)現(xiàn)通過(guò)一條命令即可設(shè)置想要的弱網(wǎng)條件。結(jié)合一些自動(dòng)化測(cè)試的框架和原有的測(cè)試場(chǎng)景的覆蓋,實(shí)現(xiàn)測(cè)試場(chǎng)景的擴(kuò)展,擴(kuò)大測(cè)試的范圍,實(shí)現(xiàn)TC對(duì)不同弱網(wǎng)場(chǎng)景的自動(dòng)化測(cè)試的支持,提升測(cè)試的深度和廣度。如下命令即為本文封裝,實(shí)現(xiàn)對(duì)192.168.2.10設(shè)備的上行添加弱網(wǎng)受限1000k,delay 200ms,jitter 50ms,丟包10%。
?
五、擴(kuò)展
如下一段文字摘自《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.
由上文可見(jiàn),特定網(wǎng)絡(luò)場(chǎng)景的弱網(wǎng)設(shè)置僅僅對(duì)應(yīng)了第一條,對(duì)于一些個(gè)性化的網(wǎng)絡(luò)服務(wù)設(shè)置、帶寬借用以及優(yōu)先級(jí)等更靈活多樣的應(yīng)用,有待大家挖掘。
總結(jié)
- 上一篇: 网易云信5月大事记
- 下一篇: 从强提醒说起——社交场景下的万有“隐力”