前言
互聯網產品的測試經常要覆蓋在不一樣網絡下的表現,例如丟包,帶寬受限,時延及抖動等網絡較差的狀況,爲了測試場景的網絡狀況可定義及復現,就須要有個工具對弱網進行模擬。業界一些通用的弱網模擬工具,如NEWT,fiddler,charles,atc,tc和packetstorm等軟硬件弱網模擬工具。相較於硬件模擬器昂貴的價格和其餘軟件模擬器部署難度大,TC成本低,部署難度較低且容易和自動化結合實現自動化測試,此外TC適用任何平臺的設備(包括PC、移動端等)。本文着重介紹TC的原理及應用。
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添加不一樣設置參數以實現對網絡的控制。python
2、Linux中的隊列規則
Linux操做系統中的流量控制器TC(Traffic Control)用於Linux內核的流量控制,它利用隊列規定創建處理數據包的隊列,並定義隊列中的數據包被髮送的方式, 從而實現對流量的控制。TC使用的隊列規則分爲兩類,一類是無類別隊列規則, 另外一類是分類隊列規則。 無類別隊列規則相對簡單,而分類隊列規則則引出了分類和過濾器等概念,使其流量控制功能加強,本文中TC主要使用分類隊列規則。
一、無類別隊列規則是對進入網絡設備(網卡) 的數據流不加區分統一對待的隊列規則。
這類隊列規則造成的隊列能夠對整個網絡設備(網卡)的流量進行整形,但不能細分各類狀況。
經常使用的無類別隊列規則主要有pfifo _fast (先進先出) 、TBF ( 令牌桶過濾器) 、SFQ(隨機公平隊列) 、RED (隨機早期檢測)等等。這類隊列規則使用的整形手段主要是排序、限速和丟包。
1.1 pfifo和pfifo_fast
FIFO是linux網絡接口的默認qdisc規則,沒有整形和重排序的功能,僅對收到的包按照先入先出的順序排出。pfifo_fast與pfifo相似,只是針對收到的流排出三個優先級。
1.2 SFQ
此種隊列企圖用一套公平的隊列算法(哈希函數)來實現收包隨機分配到不一樣FIFO序列,可是有些討厭的軟件上就沒法保證折中公平性(分佈在多個FIFO序列上)。
1.3 TBF
如名字所示,令牌桶過濾器基於令牌和桶,只有當令牌足夠時,數據包纔會從網口發出,不然,數據包將會被延遲發送,以此來實現流量限速。
二、分類隊列規則是對進入網絡設備的數據包根據不一樣的需求以分類的方式區分對待的隊列規則。數據包進入一個分類的隊列後, 它就須要被送到某一個類中, 也就是說須要對數據包作分類處理。對數據包進行分類的工具是過濾器,隊列規則會根據過濾器的分類結果把數據包送入相應的類進行排隊。每一個子類均可以使用它們的過濾器進一步分類,直到不須要進一步分類爲止。以下圖所示,爲本文中TC用到的HTB,圖中詳細展現了qdisc和類以及子類的關係:
3、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% linux
隨機丟包,以下表明隨機丟包30%
# 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%。segmentfault
5、擴展
以下一段文字摘自《Traffic Control HOWTO》:
Common traffic control solutions網絡
由上文可見,特定網絡場景的弱網設置僅僅對應了第一條,對於一些個性化的網絡服務設置、帶寬借用以及優先級等更靈活多樣的應用,有待你們挖掘。架構
想要閱讀更多技術乾貨文章,歡迎關注網易雲信博客。
瞭解網易雲信,來自網易核心架構的通訊與視頻雲服務。
__
網易雲信(NeteaseYunXin)是集網易18年IM以及音視頻技術打造的PaaS服務產品,來自網易核心技術架構的通訊與視頻雲服務,穩定易用且功能全面,致力於提供全球領先的技術能力和場景化解決方案。開發者經過集成客戶端SDK和雲端OPEN API,便可快速實現包含IM、音視頻通話、直播、點播、互動白板、短信等功能。app