【技术干货】TC基础与自动化
互聯網產品的測試常常要覆蓋在不同網絡下的表現,例如丟包,帶寬受限,時延及抖動等網絡較差的情況,為了測試場景的網絡情況可定義及復現,就需要有個工具對弱網進行模擬。
業界一些通用的弱網模擬工具,如NEWT,fiddler,charles,atc,tc和packetstorm等軟硬件弱網模擬工具。
相較于硬件模擬器昂貴的價格和其他軟件模擬器部署難度大,TC成本低,部署難度較低且容易和自動化結合實現自動化測試,此外TC適用任何平臺的設備(包括PC、移動端等)。
本文著重介紹TC的原理及應用。
01
?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添加不同設置參數以實現對網絡的控制。
02
?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和類以及子類的關系:
03
?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%??
04
?TC的自動化?
通過把上述TC命令封裝成python或其他語言的命令,匹配ip地址來對指定的設備設置想要的弱網環境,可以實現通過一條命令即可設置想要的弱網條件。結合一些自動化測試的框架和原有的測試場景的覆蓋,實現測試場景的擴展,擴大測試的范圍,實現TC對不同弱網場景的自動化測試的支持,提升測試的深度和廣度。如下命令即為本文封裝,實現對192.168.2.10設備的上行添加弱網受限1000k,delay 200ms,jitter 50ms,丟包10%。
05
?擴? 展?
如下一段文字摘自《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.
由上文可見,特定網絡場景的弱網設置僅僅對應了第一條,對于一些個性化的網絡服務設置、帶寬借用以及優先級等更靈活多樣的應用,有待大家挖掘。
點擊“閱讀原文”,了解網易云信
總結
以上是生活随笔為你收集整理的【技术干货】TC基础与自动化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超干货 | 在线教育增长实操者案例分享:
- 下一篇: 网易云信集成视频教程(三):如何通过SD