小優有話說:vue
app研發不一樣於實驗室裏作研究,哪裏有「理想環境」。
理想裏,用戶用着性能卓越的手機,連着暢通無阻的wifi網絡。
「哇塞!這個app好用到飛起!」
現實是,他們可能正用着你聞所未聞的機型,穿梭於地鐵、公交、火車、鄉間、大山….. 信號「若隱若現,撲朔迷離」
「我去!又crash了!」
「唉,怎麼又連不上網了,其餘app好好的啊。」
這大概就是理想與現實之間的差距吧。linux
機型碎片化的問題,騰訊優測已經幫你解決了(廣告就是這麼硬)。
弱網絡引起的crash,anr,丟包等各類問題,除了親身到各個網絡崩潰的地方測試,祈求問題重現外,還有弱網絡模擬測試工具能夠助你一臂之力哦!
微信測試團隊的開發工程師親身實踐,爲你詳解弱網絡模擬測試工具的那些事兒。web
*瀏覽器
—————-我是正文分割線—————-微信
特約供稿人:微信測試團隊 CoderZhmarkdown
*網絡
移動互聯網時代,用戶會在各類網絡情況下使用咱們的APP。他們使用3G或4G 網絡,甚至還在用2G,他們也許正在商場閒逛,也許正在地鐵奔波,飛速的汽車穿過一個又一個基站,簇擁的人羣擠在演唱會現場。
在弱網絡下,你的APP表現還好嗎?你的手遊還能玩嗎?
因此,咱們須要一款可以模擬弱網絡的軟件,用來測試咱們的APP在弱網絡下的表現。app
市面上已經有一些弱網絡模擬工具,好比微軟的Network Emulator for Windows Toolkit(NEWT),Facebook的Augmented Traffic Control(ATC),以及WANem。框架
NEWT是基於Windows的,經過圖形化的界面,能夠對該機器的網絡參數進行設置,且模型較爲豐富。工具
參數設置:
優勢:
使用起來比較簡單,網絡模擬的參數也很豐富,模擬的準確性也比較高。
缺點:
基於 Windows。想在手機上測試時,需在 PC 上使用 USB 無線網卡創建 WIFI 熱點,使用方式爲獨佔式,且必須在 PC 上進行控制,不適用於長期開放熱點供多人使用。
WANem 的實現原理基於 iptables 和 tc。它推出的年份較早,能夠看出並非針對如今的移動互聯網設計的。他提供了一個可安裝的 Linux 系統鏡像文件,安裝後可在一個網頁裏對該機器的網絡流量進行控制。其餘被測機器經過修改路由表,將網絡流量引向裝好 WANem 的機器從而實現對網絡的模擬。
設置頁面:
優勢:
提供了安裝鏡像,解決了安裝配置複雜的問題。
缺點:
需手工配置路由表,用戶體驗很是不友好,對移動端經過 WIFI 接入支持很差。
ATC 是 Facebook 開源的弱網絡模擬工具,實現原理基於 iptables 和 tc。
服務啓動後,經過手機能夠對網絡參數進行設置:
優勢:
可多人使用,在手機端對網絡參數進行設置且互不影響。
缺點:
部署起來不太方便,在 Linux 上使用 USB 無線網卡創建 WIFI 熱點也是很頭疼的事。固然這些都不算什麼,關鍵是實際體驗 ATC 時出現了網絡模擬很是不許確的狀況,好比基本的上傳下載的速度控制都極爲不許。在 Github 上關於這點的 Issue 很是多,最後給出的解決方案是啓動 atcd 時加 —atcd-dont-drop-packets 參數,即便這樣也給人留下這丫怎麼那麼不許的印象。
ATC 的 Web 頁面在某些手機的瀏覽器裏顯示不出來,這麼明顯的 BUG,不知道他們如今修好了沒。
NEWT 在 Windows 裏進行網絡模擬的原理咱們不得而知,可是像 ATC 和 WANem 基於 Linux 的 iptables 和 tc 的實現原理咱們卻是能夠一窺究竟。
首先,有個基本的前提必須清楚,即咱們只能對網卡的出口流量(egress)進行精確控制。這也比較好理解,好比咱們頻繁的往互聯網發送數據,路由器能夠輕易的控制數據往外發的速度。但若是別人頻繁發送數據給你,發送速度的控制權不在你,數據來了路由器就會被動的接收,因此控制起來就會更困難。
那是否是無法對入口流量(ingress,能夠理解爲下載的流量)進行控制呢?其實不是的。咱們只須要有兩個網卡,讓他們互爲出口流量便可。
其中一個網卡(eth0)接入互聯網,另外一個網卡(eth1)接入內網。這對應到路由器的 WAN 口和 LAN 口上。
假設在 PC 上只有一個物理網卡的狀況下,也能夠虛擬出一個網卡,從而實現對出口和入口流量的控制。好比我須要建立一個名爲 wtc 的虛擬網卡:
若是是正式使用,建議仍是直接使用路由器的物理網卡。
一般,內網 eth1 經過 NAT 的方式將流量引入 eth0 進行上網。設置 NAT 的方式很簡單,首先開啓內核中的 IP 轉發:
爲了永久生效,修改 [/etc/sysctl.conf]文件,修改下行內容:
而後執行該命令使其生效:
配置 NAT 的方法:(假設 192.168.1.0/24 是你的內網 IP 段)
局域網內的機器只要將網關設置成該臺機器(192.168.1.1)便可經過 NAT 上網。
經過 vagrant,能夠很容易的在一臺機器上模擬出上述的網絡結構用於本地調試。
什麼是流量控制?流量控制就是在路由器上經過一系列隊列,對數據包進行排序以控制它們的發送順序,並經過一系列策略控制收到的和發送的數據包是否應該被丟棄,同時還要對數據包的發送速率進行控制。
Linux 下的流量控制能夠經過 tc 命令來實現的。
首先說說調度器 qdisc,也被稱爲排隊規則。它提供了對數據包不一樣的調度策略,好比最多見的 FIFO(先入先出隊列)、SFQ(隨機公平隊列)、TBF(令牌桶),以及咱們接下來須要使用的 HTB(分層令牌桶)。
HTB 的一個重要特性就是租借模型。當子分類的流量超過了 rate 時,它們就會向父分類借用令牌,直到子分類借到的令牌數量知足能讓其達到 ceil 指定的速度爲止,與此同時,它會暫緩發送數據包,直到有了足夠多的令牌(token 或 ctoken)。
簡單理解:經過 qdisc 的 HTB 模型能夠準確的對網絡流量的速度進行控制。
qdisc 提供可分類和不可分類兩種調度器。可分類的意思是,是在某個 qdisc 調度器之下,可否再分出多個子調度器。理論上,類能無限擴展,一個類能夠僅包含一個排隊規則,也能夠包含多個各自排隊規則的子類。一個類之下能夠包含多個分類的排隊規則。這就給 Linux 流量控制系統予以了極大的可擴展性和靈活性。
簡單理解:經過 class 能夠將調度器分紅多個子類。
過濾器是 Linux 流量控制系統中最複雜的對象,它是鏈接各個流量控制核心組件的紐帶。過濾器最簡單和最多見的用法就是對數據包進行分類。Linux 容許用戶使用一個或多個過濾器將出站數據包分類並送到不一樣的出站隊列上。
簡單理解:既然前面能夠分不一樣的 class,那流量具體要去到哪一個 class,就要經過 filter 來控制了。
首先,qdisc 咱們選用 HTB 模型,由於它能夠分類,並且流量控制的比較精確。接着是 class,因爲咱們但願流量控制是針對具體某個 IP 的,因此每一個 class 對應的是不一樣的用戶。過濾(filter)的規則是用戶的 IP 地址。
那麼問題來了,如何根據用戶的 IP 對流量進行分類呢?這就須要用到 iptables 的 mark 功能,經過 —set-xmark 給不一樣 IP 的數據打上標記,在 tc 的 filter 裏能夠識別這些標記,從而進入不一樣的分類。
不一樣 IP 用戶的流量進入到不一樣分類以後,就能夠針對具體的用戶進行流量控制了。經過 htb 模型能夠對流量進行限速,那丟包、延遲、亂序、重包等等,要怎樣模擬呢?
tc 裏提供了一個 netem 模塊,能夠對延遲(delay)、丟包(loss)、重包(duplication)、亂序(re-ordering)等進行控制,好比,給 eth0 網卡設置 100ms 的延遲:
詳盡的 netem 用法請參考:
http://www.linuxfoundation.org/collaborate/workgroups/networking/netem
基於 IP 的網絡模擬實現以下:
若是手工執行命令的話,大概是這樣的:
有了以上理論基礎,熟讀幾遍 iptables 和 tc 的文檔,實現一個基於 IP,經過手機直接設置網絡參數的弱網絡模擬工具就不是那麼難了。
我實現了一個版本:WTC(We Traffic Control),是 ATC 更加輕量級的實現,爲了把它塞進路由器裏,儘可能選用了體積小輕量級的框架,好比:web.py、vuejs。全部文件加起來只有幾百K,已經成功在路由器(刷 openwrt)上部署。
演示:
爲了在 openwrt 上方便部署,我製做了一個安裝好 WTC 依賴環境的 ROM(基於最新的 openwrt 15.05.1),想要使用WTC,只須要如下幾步:
申請一個支持刷 openwrt 的路由器。
刷配好 WTC 環境的 ROM。
作必定手工配置。
而後手機連上該 WIFI 後直接訪問:http://w.tc 就能夠進行網絡模擬了。
固然,你也能夠在你的 openwrt 環境手工配置並跑起來:
推薦直接在路由器上搭配 lighttpd 部署, wsgi 方式運行使用 wsgi.py。
(小優注:原做者已將WTC的具體實現放置在騰訊內網,由於「你懂的」緣由不方便對外公開。稍後有可能會開源哦,感興趣的同窗能夠關注做者私人公衆帳號hacker-thinking,私下交流。
或者,大牛們看過文章能夠親自動手實踐一番哦!)
*更多精彩內容歡迎關注優測的微信公衆號:
騰訊優測是專業的移動雲測試平臺,爲應用、遊戲,H5混合應用的研發團隊提供產品質量檢測與問題解決服務。不只在線上平臺提供「全面兼容測試」、「缺陷分析」、「雲手機」等多種質量檢測工具,同時在線下爲VIP客戶配備專家團隊,提供定製化綜合測試解決方案。真機實驗室配備上千款手機,覆蓋億級用戶,7*24小時在線運行,爲各種測試工具提供支持。