iOS 如何進行網路測速

Joy_xx發表於2018-01-20

iOS 如何進行網路測速

對於網路測速的需求還是比較常見的,比如常見的手機管家、360 Wi-Fi 等 App 都有網路測速的功能。近期由於業務需求也涉及到網路測速這塊內容,同時自己好久沒更新部落格了,所以來寫一下網路測速這塊的一個簡單總結。

什麼是網路測速?

其實聽到網路測速這個需求,第一個想到的就是 ping,在群裡討論的時候也有同學說到 ping 一下不就可以了嗎?ping 和網速有什麼關聯和區別呢?

  • ping:它的全稱是 Packet Internet Groper,用來測試網路是否連通,以及響應時間是多少,通常客戶端也都有配置一個叫做網路診斷的功能,其實就是用到了這個 ping

  • 網速:顧名思義,也就是網路速度的意思。稍微專業來講就是上傳和下載時,每秒鐘可傳送的 最大資料量 ,資料量的大小一般用 KB、M來衡量。

看到上面的解釋,其實就明白了。ping 測的是點到點的網路延遲,而網速指的是點到點之間單位時間內的傳輸資料量。這個資料又可以細分為上傳資料和下載資料,理論上他們的速度是一致的,但是運營商會在其中做一些手腳,導致上行的寬頻一般偏小於下行的寬頻。

我們平時會使用 Shadowrocket 等利器來進行翻牆上網,這個軟體會顯示你 Wi-Fi 和 4G 的流量消耗,同時會顯示你每秒鐘你的上行和下行流量是多少。這個原理其實也很簡單,可以直接呼叫系統的介面來獲取網路卡的流量資料。這裡顯示的每秒鐘的上行和下行流量,只能代表此時的流量消耗,並不能代表當前的網速是多少,網速應該是充分利用頻寬後,單位時間內可以傳輸的最大資料量

iOS 如何進行網路測速

常見的網路測速方案

通過調研發現,目前常見的網路測速方案只有兩種:

  • 方案1:通過上傳和下載資料包,使用 TotalSize / TotalTime 來計算真實的上傳和下載速率是多少

  • 方案2:通過讀取網路卡資料來計算,讀取上一秒的整體流量消耗 T1,然後讀取當前的流量消耗 T2,那麼 T2 - T1 其實可以表示為當前的一個網速情況。同時這個流量資料是可以區分蜂窩網路、Wi-Fi的,也可以區分哪些是上行流量,那些是下行流量。

兩種方案各有優劣,可以在合適的場合來選擇對應的方案

  • 第一種方案感覺是比較準確,這個時候是真實的在下載或上傳資料,比較充分的利用了當前的頻寬,計算的網速也比較接近真實的網速值。但是蜂窩網路下,會消耗使用者的少量流量。

  • 第二種方案在下載和上傳東西時,計算的值和第一種方案比較接近。但是如果當前系統內沒有 App 在被使用,處於靜止狀態的話,其實當前讀取的流量值是比較小的,無法反映出網速情況,但是可以實時反映流量消耗狀況。

對於兩種方案,我寫了一個簡單的 Demo 放在了https://github.com/joy0304/Joy-Demo/tree/master/LDSpeedTest,這個只是一個很粗糙的 Demo,沒有區分 Wi-Fi 和 蜂窩網路,同時也只計算了下行的網速,如果要在專案中使用,需要完善後才可以上線使用。

延伸

其實上面談到的真實下載或上傳資料來進行測速,這個只是單個 TCP 連線的情況,如果多個 TCP 連線的話,肯定對頻寬的一個利用情況會比單個 TCP 連線更加高效,測出來的網速值也更加準確。

同時由於 TCP 和 UDP 協議本身特點的差異,TCP 測速和 UDP 測速的結果也會不同,可以根據業務的要求來選擇恰當的方案。對於網路測速,業界已經有很多強大的工具,有興趣的話可以體驗下 iperf 等工具。

相關文章