1. 概述
一個(gè)app的表現(xiàn),往往和網(wǎng)絡(luò)狀態(tài)密切相關(guān)。這里的網(wǎng)絡(luò)診斷主要是針對(duì)特定的域名或者ip,也就是說(shuō)app的網(wǎng)絡(luò)診斷是對(duì)當(dāng)前網(wǎng)絡(luò)到域名指向的服務(wù)端的連通性和帶寬情況。
這里分幾個(gè)層面來(lái)說(shuō)。首先是哪些信息用來(lái)診斷網(wǎng)絡(luò),其次這些信息的診斷選擇什么工具,再次網(wǎng)絡(luò)診斷出來(lái)的數(shù)據(jù)如何理解。最后還需要給網(wǎng)絡(luò)狀況一個(gè)標(biāo)準(zhǔn),以便于用戶(hù)理解這個(gè)網(wǎng)絡(luò)問(wèn)題。
2. 網(wǎng)絡(luò)診斷的工具
常用的網(wǎng)絡(luò)工具或者方式,包括ping、DNS、traceroute、網(wǎng)絡(luò)測(cè)速
2.1.ping測(cè)試
ping命令是基于ICMP,是在網(wǎng)絡(luò)層。ping的運(yùn)作原理是向目標(biāo)主機(jī)傳出一個(gè)ICMP echo@要求數(shù)據(jù)包,并等待接收echo回應(yīng)數(shù)據(jù)包。程序會(huì)按時(shí)間和成功響應(yīng)的次數(shù)估算丟失數(shù)據(jù)包率(丟包率)和數(shù)據(jù)包往返時(shí)間(網(wǎng)絡(luò)時(shí)延,Round-trip delay time)。
(1)能驗(yàn)證網(wǎng)絡(luò)的連通性
(2)會(huì)統(tǒng)計(jì)響應(yīng)時(shí)間和TTL(IP包中的Time To Live,生存周期)
那么如何驗(yàn)證的呢?
(1)ping命令會(huì)先發(fā)送一個(gè) ICMP Echo Request給對(duì)端
(2)對(duì)端接收到之后, 會(huì)返回一個(gè)ICMP Echo Reply
(3)若沒(méi)有返回,就是超時(shí)了,會(huì)認(rèn)為指定的網(wǎng)絡(luò)地址不存在。
而端口號(hào),是傳輸層的內(nèi)容。所以在ICMP中根本就不關(guān)注端口號(hào)這樣的信息。

(4)TTL的理解。當(dāng)我們對(duì)網(wǎng)絡(luò)上的主機(jī)進(jìn)行ping操作的時(shí)候,本地機(jī)器會(huì)發(fā)出一個(gè)數(shù)據(jù)包,數(shù)據(jù)包經(jīng)過(guò)一定數(shù)量的路由器傳送到目的主機(jī),但是由于很多的原因,一些數(shù)據(jù)包不能正常傳送到目的主機(jī),那如果不給這些數(shù)據(jù)包一個(gè)生存時(shí)間的話,這些數(shù)據(jù)包會(huì)一直在網(wǎng)絡(luò)上傳送,導(dǎo)致網(wǎng)絡(luò)開(kāi)銷(xiāo)的增大。當(dāng)數(shù)據(jù)包傳送到一個(gè)路由器之后,TTL就自動(dòng)減1,如果減到0了還是沒(méi)有傳送到目的主機(jī),那么就自動(dòng)丟失。
PING中的TTL:Linux系統(tǒng)的TTL值為64或255。注意這里TTL值 指的是目標(biāo)主機(jī)到本地?cái)?shù)據(jù)的路由跳數(shù),比如上例中ping 百度的結(jié)果 ,即為的為64-52=12 意味著,從本地機(jī)到百度服務(wù)器經(jīng)過(guò)了12跳路由。解釋下這里的TTL: ping中的TTL為一個(gè)為ICMP回顯應(yīng)答(ICMP Echo Reply)的TTL,這是目標(biāo)機(jī)發(fā)回來(lái)的數(shù)據(jù)包的TTL。而我們發(fā)過(guò)去的TTL是由我們本地機(jī)類(lèi)型決定,并不會(huì)顯示在ping結(jié)果。
2.2.DNS解析
DNS(Domain Name System),它的作用就是根據(jù)域名,查出對(duì)應(yīng)的 IP 地址,它是 HTTP 協(xié)議的前提。只有將域名正確的解析成 IP 地址后,后面的 HTTP 流程才可以繼續(xù)進(jìn)行下去。
DNS 服務(wù)器的要求,一定是高可用、高并發(fā)和分布式的服務(wù)器。它被分為多個(gè)層次結(jié)構(gòu)。
- 根 DNS 服務(wù)器:返回頂級(jí)域 DNS 服務(wù)器的 IP 地址。
- 頂級(jí)域 DNS 服務(wù)器:返回權(quán)威 DNS 服務(wù)器的 IP 地址。
- 權(quán)威 DNS 服務(wù)器:返回相應(yīng)主機(jī)的 IP 地址。
這三類(lèi) DNS 服務(wù)器,類(lèi)似一種樹(shù)狀的結(jié)構(gòu),分級(jí)存在。

當(dāng)開(kāi)始 DNS 解析的時(shí)候,如果 LocalDNS 沒(méi)有緩存,那就會(huì)向 LocalDNS 服務(wù)器請(qǐng)求(通常就是運(yùn)營(yíng)商),如果還是沒(méi)有,就會(huì)一級(jí)一級(jí)的,從根域名查對(duì)應(yīng)的頂級(jí)域名,再?gòu)捻敿?jí)域名查權(quán)威域名服務(wù)器,最后通過(guò)權(quán)威域名服務(wù)器,獲取具體域名對(duì)應(yīng)的 IP 地址。

DNS 在提供域名和 IP 地址映射的過(guò)程中,其實(shí)提供了很多基于域名的功能,例如服務(wù)器的負(fù)載均衡,但是它也帶來(lái)了一些問(wèn)題。更多問(wèn)題這里不展開(kāi),見(jiàn)參考文章[2]
查詢(xún)DNS信息一般用下面兩個(gè)命令
- nslookup命令用于查詢(xún)DNS的記錄
- dig命令
在adb shell環(huán)境下測(cè)試發(fā)現(xiàn)并不支持以上兩種命令??捎梅桨?/li> - (1)利用so庫(kù) 執(zhí)行底層的命令
- (2)安裝Linux層第三方庫(kù),使Android系統(tǒng)支持上述命令
- (3)dnsjava
這兩種方法分別有他們的缺點(diǎn)so庫(kù)麻煩,并且體積大,而第二種方式需要root權(quán)限。
2.3.traceroute撥測(cè)
通過(guò)traceroute我們可以知道信息從你的計(jì)算機(jī)到互聯(lián)網(wǎng)另一端的主機(jī)是走的什么路徑。當(dāng)然每次數(shù)據(jù)包由某一同樣的出發(fā)點(diǎn)(source)到達(dá)某一同樣的目的地(destination)走的路徑可能會(huì)不一樣,但基本上來(lái)說(shuō)大部分時(shí)候所走的路由是相同的。linux系統(tǒng)中,我們稱(chēng)之為traceroute,在MS Windows中為tracert。 traceroute通過(guò)發(fā)送小的數(shù)據(jù)包到目的設(shè)備直到其返回,來(lái)測(cè)量其需要多長(zhǎng)時(shí)間。
traceroute也是基于ICMP協(xié)議實(shí)現(xiàn)的。
功能:
打印出可執(zhí)行程序主機(jī),一直到目標(biāo)主機(jī)之前經(jīng)歷多少路由器。
traceroute命令,但android不支持traceroute只有root設(shè)備支持它。
https://github.com/wangjing53406/traceroute-for-android
上述庫(kù)用JNI的生成SO來(lái)支持。
busybox實(shí)用程序包括traceroute。需要進(jìn)一步驗(yàn)證
2.4.網(wǎng)絡(luò)測(cè)速
主要測(cè)試上傳下載帶寬,例如
手機(jī)端網(wǎng)絡(luò)測(cè)試工具 (android、iOS)
測(cè)速網(wǎng)
Android上利用Trafficstats流量測(cè)速度:上行、下行,下載一個(gè)文件,然后進(jìn)行測(cè)試
Trafficstats.getUidRxBytes(uid)獲取當(dāng)前線程的
- (1).獲得當(dāng)前的總接受數(shù)據(jù),getTotalRxPackets()
- (2).每隔幾秒再獲取一次總接收的數(shù)據(jù)
- (3).講最新獲取的數(shù)據(jù)減去之前獲取的數(shù)據(jù)并且除以間隔的秒數(shù),就得到了每秒平均的網(wǎng)速b/s,最后進(jìn)行單位
轉(zhuǎn)換為kb、Mb等等
3. 網(wǎng)絡(luò)診斷數(shù)據(jù)如何分析
3.1 ping
用來(lái)測(cè)試當(dāng)前網(wǎng)絡(luò)的ip到目標(biāo)網(wǎng)絡(luò)的可達(dá)及延遲,例如,華佗的https://ping.huatuo.qq.com/

3.2 DNS
用來(lái)看域名解析是否正常,有無(wú)異常的劫持等
3.3 traceroute
用來(lái)看,每次路由經(jīng)過(guò)的機(jī)器的ip,中間環(huán)節(jié)是否有問(wèn)題,中間節(jié)點(diǎn)的是不是成為帶寬的瓶頸,看是否要及時(shí)改變調(diào)度策略
3.4 網(wǎng)絡(luò)測(cè)速
一些測(cè)速網(wǎng)站會(huì)選擇最近的運(yùn)營(yíng)商進(jìn)行測(cè)試。測(cè)試結(jié)果會(huì)受用戶(hù)計(jì)算機(jī)性能、資源使用情況、網(wǎng)絡(luò)高峰期、網(wǎng)站服務(wù)能力、線路等因素影響;所以,測(cè)試結(jié)果比實(shí)際速度略低。
測(cè)速的原理是 向服務(wù)器節(jié)點(diǎn)發(fā)送一批探測(cè)包,然后統(tǒng)計(jì)回包的質(zhì)量,并將測(cè)速的結(jié)果通過(guò)回調(diào)接口通知出來(lái)。
測(cè)速的結(jié)果將會(huì)用于優(yōu)化接下來(lái)的服務(wù)器選擇策略,因此在一些高帶寬場(chǎng)景下會(huì)(如視頻通話)先進(jìn)行一次測(cè)速,這將有助于選擇最佳的服務(wù)器。同時(shí),如果測(cè)試結(jié)果非常不理想,可以通過(guò)醒目的 UI 提示用戶(hù)選擇更好的網(wǎng)絡(luò)。
由于 測(cè)速服務(wù)同時(shí)可以連接的云端服務(wù)器通常有超過(guò)三個(gè)以上的節(jié)點(diǎn),測(cè)試過(guò)程是一臺(tái)接一臺(tái)串聯(lián)進(jìn)行的,所以測(cè)速結(jié)果的返回值會(huì)分多次回調(diào)通知出來(lái)。
4. 現(xiàn)有網(wǎng)絡(luò)診斷組件或者方案對(duì)比
- (1)HttpInfo
比較強(qiáng)大,記錄的信息包括
Index信息(域名以及請(qǐng)求時(shí)間)
Net信息(手機(jī)網(wǎng)絡(luò)信息)
Ping信息
Http信息
Host信息
MtuScan信息
PortScan信息
TraceRoute信息
NsLookup信息
(2)NetworkDiagnosis(內(nèi)網(wǎng))
ping測(cè)試
DNS解析
traceroute撥測(cè)
網(wǎng)絡(luò)測(cè)速
滿(mǎn)足大部分場(chǎng)景,代碼公開(kāi),只有Android端(3)LDNetDiagnoService_Android
功能:ping、tcp connect和traceroute
Android的實(shí)現(xiàn)方案一:
是通過(guò)后臺(tái)線程執(zhí)行ping命令的方式模擬traceroute的過(guò)程,缺點(diǎn)就是模擬過(guò)程較慢,timeout的出現(xiàn)比較頻繁
Android的實(shí)現(xiàn)方案二:
通過(guò)編譯開(kāi)源網(wǎng)絡(luò)檢測(cè)庫(kù)iputilsC代碼的方式對(duì)traceroute進(jìn)行了套接字發(fā)送ICMP報(bào)文模擬,可以明顯提高檢測(cè)速度;(關(guān)于iputils工具原理實(shí)現(xiàn),請(qǐng)參考博文)
這里用的方案2
- (3)facebook/network-connection-class gitHub地址
用Android的接口實(shí)現(xiàn)的功能,只能測(cè)試下行的帶寬 - (4)華佗診斷系統(tǒng)
https://ping.huatuo.qq.com/
功能:獲取客戶(hù)端IP,ldns,域名請(qǐng)求ip,請(qǐng)求耗時(shí)
特點(diǎn):無(wú)需客戶(hù)端,直接瀏覽器請(qǐng)求
缺點(diǎn):有時(shí)會(huì)獲取不到ip,dns信息,或不準(zhǔn)確
5. 根據(jù)現(xiàn)有業(yè)務(wù)如何選擇
像直播或者短視頻的應(yīng)用,對(duì)網(wǎng)絡(luò)要求比較高。需要對(duì)上述的幾個(gè)維度都進(jìn)行分析。而一般信息流或者IM的app對(duì)網(wǎng)絡(luò)要求實(shí)時(shí)性不高的僅僅可只測(cè)試ping
6. 參考文章
[1] 移動(dòng)端下各類(lèi)診斷方法與工具
[2] Android 網(wǎng)絡(luò)優(yōu)化,使用 HTTPDNS 優(yōu)化 DNS,從原理到 OkHttp 集成
[3] Android獲得DNS地址
[4] DNS(二)通過(guò)dig命令理解DNS
[5] Android網(wǎng)絡(luò)測(cè)試與診斷
[6] 通話前網(wǎng)絡(luò)測(cè)速
我的博客即將同步至騰訊云+社區(qū),邀請(qǐng)大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=18e75wmxxlru6