TC基礎與自動化

前言

互聯網產品的測試常常要覆蓋在不同網絡下的表現,例如丟包,帶寬受限,時延及抖動等網絡較差的情況,爲了測試場景的網絡情況可定義及復現,就需要有個工具對弱網進行模擬。業界一些通用的弱網模擬工具,如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. pfifo和pfifo_fast

FIFO是linux網絡接口的默認qdisc規則,沒有整形和重排序的功能,僅對收到的包按照先入先出的順序排出。pfifo_fast與pfifo類似,只是針對收到的流排出三個優先級。

SFQ

此種隊列企圖用一套公平的隊列算法(哈希函數)來實現收包隨機分配到不同FIFO序列,但是有些討厭的軟件上就無法保證折中公平性(分佈在多個FIFO序列上)。

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 

  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.

由上文可見,特定網絡場景的弱網設置僅僅對應了第一條,對於一些個性化的網絡服務設置、帶寬借用以及優先級等更靈活多樣的應用,有待大家挖掘。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章