1. 背景、目標、目的
(1) 背景:
我們在使用網絡時,時常遇到在正常網絡環境下的代碼運行一切正常,可以複雜的網絡環境下的各種問題無法復現,必須搭建模擬各種網絡環境,去復現問題,定位問題。不管是移動平臺,還是pc 端; ios XCode已經具備此功能, Android設備,及 windows 平臺還是需要我們自己搭建。
(2) 目的:
通過Network-Emulator-Toolkit 配置控制網絡條件,滿足包括下行速度、下行丟包率、下行延遲、上行速度、上行丟包率、上行延遲、DNS延遲的設置、以及可抓包。
(3) 目標:
模擬複雜可複用的網絡環境,復現,定位問題
2. 方案
方案可以是1 wireshark、Fiddler、Charles等抓包工具提供代理、2.模擬器、3. Network Link Conditioner + 共享 wifi。
本文肯定是採用 3,要不標題就錯了 ;
介紹一款windows下的網絡模擬器,可以模擬各種丟包或延遲的網絡(Network Emulator for Windows Toolkit)
下載地址:https://blog.mrpol.nl/2010/01/14/network-emulator-toolkit/
這裏簡單介紹一下使用方法:
軟件界面:
No Loss:默認,不模擬丟包。
Periodic loss: 模擬週期性的丟包。按填寫數量(設爲x個),每x個包,就丟一個包(one packet is dropped per given number of packets)。
Random loss: 模擬隨機丟包,按給定丟包的概率,隨機丟包。
Burst loss: 模擬根據給定的可能性進行丟包。當發生一個丟包事件時,接着連續丟幾個包(丟包數量控制在最大(max)最小值(min)之間)。
G-E loss: 模擬發生數據包丟失遵循Gilbert-Elliot模型,由兩個狀態組成:好的狀態和壞的狀態。可分別爲這2個狀態指定數據包丟失率,同時可設置網絡傳輸在這兩種狀態的概率
(And the network transit between the two states is at given transition probabilities)
Error
說明:
真實世界中,當數據包經過網絡傳輸時,包中的一到多個字節(bit)數據可能發生錯誤。
No Error:不模擬傳輸錯誤。
Random error:根據給定的比例,模擬隨機發生傳輸錯誤。
G-E error:發生傳輸錯誤遵循Gilbert-Elliot Model, 模型,由兩個狀態組成:好的狀態和壞的狀態。可分別爲這2個狀態指定數據包丟失率,同時可設置網絡傳輸在這兩種狀態的概率(the network transit between the two states according to giventransition probabilities)
錯誤概率單元(Error Rate Unit):
Bit error: 設置出錯概率爲每個字節出錯的概率。
Packet error: 設置出錯概率爲每個包出錯的概率。
出錯和丟包的關係
大多數情況下,包出錯導致包丟失,特殊情況下,包中的數據被編碼,協議棧可恢復被損壞的包,經過修正後,包爲可接受的包,即包不丟失。此外,除了包出錯會導致包丟失,其它因素也會影響包丟失,如連接失敗(Link failure),緩衝區溢出(buffer overflow),隊列管理和傳輸超時(transmission timeout)等。
Latency
說明:
延遲來自某應用發送的數據包被另一個應用程序接收到的時間。
Fixed delay: 按給定值,延遲固定時間(單位:毫秒)packets are delayed fora fixed amount of time.
Uniform delay: 按統一分佈,延遲一定量的時間(時間控制在最大最小值之間)
Normal delay: 按正態分佈.延遲一定量的時間(average:平均值,Devation:偏差)
Linear delay: 延遲一定量的時間(在給定時間週期(Period)內,延遲的時間大小從最小值線性增加到最大值,當達到最大值時,又從最小值開始。
Burst delay: 根據給定概率(Probability),延遲一定量的時間(Latency), 丟包數控制最大值和最小值之間
BW&Queue
如果不指定帶寬(bandwith),則不修改傳輸速率。
如果不設置隊列,則不對接到的包做任何隊列操作
Queue
Normal queue:所有接收到的包都被放入一個指定隊列大小的先進先出(First In, First Out)隊列。
Randomly Early Detection (RED) queue:所有接收到的包都被放入一個RED隊列。如果隊列大小小於給定的最低閾值(Minimum Threshold),隊列被評估爲不擁擠的,什麼都不做;如果隊列大小大於給定最大閾值(Maximum
Threshold),則隊列被評估爲擁擠的,根據丟包規則,丟棄一些包。
丟包規則:
Drop front: 必要時,丟棄位於隊列頭部的包。.
Drop tail: 必要時,丟棄位於隊列尾部的包。
Drop random:必要時,根據統一分佈,隨機丟個包。
Queue Mode:設置隊列大小的單位,以包(Packet Mode)爲單位或者以字節爲單位Byte Mode
BgTraffic
一些網絡數據包交換和模擬的兩端沒有任何關係,被指爲背景流(background traffic)。這些背景流會帶來延時效果。
Constant-bit rate (CBR) traffic: 根據給定的固定比例生成背景流(每XX kbps、mbps數據包,xx字節背景流)
Exponential traffic:根據指數On/Off時間分佈生成背景流。個人理解,Burst則爲生成背景流時間,Idle則不生成背景流時間(時間單位:秒
Pareto traffic: 同上,不過是排列圖分佈(Pareto)
Recorder
模擬收到的包不是按發送順序排序的。
No Recoder:不模擬
其它:具體待定
Disconnection
模擬週期性斷開連接的行爲。
Connection time: 一段時間週期內,link保持連接狀態的持續時間。
Disconnection time: 一段時間週期那日,link保持斷開狀態的持續時間
Disconnection rates: link發生斷開連接的比率
例子:設置connection time爲10秒,disconnection爲5秒,那麼週期爲15秒,如果設置rate爲0.4,那麼平均每10秒內,有4秒是link處於連接斷開的時間(if connection time is 10 seconds, time is 5 seconds, the period will be 15 seconds. If rate is 0.4, then on average in 4 out of 10 periods disconnection occurs. )。
點擊觸發跟蹤按鈕[可選]
點擊“黃色小腳丫”按鈕,確保按鈕爲“點選”狀態
注:RT Traffic Monitor,RT Packet Monitor,Connection Analyzer,Information Watch
開啓控制
點擊開始按鈕
停止控制
點擊停止按鈕
保存文件[可選]
保存配置文件爲xml,方便後續導入,重用
附工具欄說明
連接方式:
Dialup56k:通過傳輸速率爲56kbps的modem進行連接
ADSL(128/512): 通過上行128kbps,下行512kbps的ADSL連接。
GPRS:它是GSM移動電話用戶可用的一種移動數據業務,理論傳輸速率115kbit/s,實際可達53.6Kbps。
CDMA2000:3G移動通訊標準。
WCDMA:寬帶碼分多址(英語:Wideband Code Division Multiple Access,常簡寫爲W-CDMA),是一種3G蜂窩網絡,使用的部分協議與2G GSM標準一致。
IEEE802.11b:通過無線局域網,帶寬最高可達11Mbps,實際的工作速度在5Mb/s左右,室外爲300米;在辦公環境中最長爲100米
案例:
App弱網測試整理總結:
首先,我們在正常網絡下ping一下我們的路由器:
可以看到沒有任何丟包:
接下來我們使用Network Emulator for Windows Toolkit,創建一個過濾器:configuration---》new filter,點擊add,如下:
接着,創建一個新的連接configuration ---》 new link ,創建好如下:
接着右鍵創建好的連接,設置上行和下載的丟包率,在這裏我們做如下設置:
我們將上行和下載的丟包率都設置爲0.03,確定後,點擊工具欄上的三角符號開始,再次ping路由:
此時,我們看到已經開始出現丟包了。
如下圖設置一個隨機丟包率在40%:
網絡延遲在10s-20s
再 ping 就會看到有延時和丟包;當然也可以配 Error
最後記得 不測試了,一定要停掉,因爲開了這個你的很多軟件可能已經掉線了;
如果要測試移動設備:可以下載一個 共享 wifi ,移動端連接WIFI 就可以了。
還有另外一個工具 開源移動網絡測試工具Augmented Traffic Control(ATC),這個似乎可以直接在手機上設置並切換網絡,就不用pc創建熱點了。後續再研究下。