
1.前言
- 在移動(dòng)互聯(lián)網(wǎng)的快速發(fā)展環(huán)境下,手機(jī)用戶日益對(duì)網(wǎng)絡(luò)的使用或體驗(yàn)有著更深度的訴求,因此應(yīng)用中的網(wǎng)絡(luò)體驗(yàn)已經(jīng)顯得由此重要,而背后對(duì)開(kāi)發(fā)者在網(wǎng)絡(luò)性能有更高的要求。
- 網(wǎng)絡(luò)影響:
1.最直觀的就是用戶交互體驗(yàn);
2.流量的流失;
3.電量的消耗; - 本文從連接、傳輸、監(jiān)控 三個(gè)維度提出相關(guān)的優(yōu)化。
- 文章中實(shí)例 linhaojian的Github
2.HTTP請(qǐng)求過(guò)程

http請(qǐng)求流程.png
- 通過(guò)上圖可以很清楚的理解HTTP協(xié)議的請(qǐng)求過(guò)程:
1.客戶端輸入域名,通過(guò)瀏覽器請(qǐng)求發(fā)送;
2.通過(guò)DNS解析域名,得到真正需要請(qǐng)求的服務(wù)器IP地址;
3.服務(wù)端接收到請(qǐng)求內(nèi)容之后,做出響應(yīng);
(HTTP使用Socket構(gòu)建基于TCP/IP協(xié)議的通訊) - 因此我們就可以針對(duì)上述流程總結(jié)可優(yōu)化2個(gè)方向:連接、傳輸。
3.連接
3.1 網(wǎng)絡(luò)狀態(tài)
- 可以根據(jù)不同的網(wǎng)絡(luò)狀態(tài)(2G、3G、4G、Wifi)針對(duì)性的提供處理策略。
3.2 弱網(wǎng)處理
- 弱網(wǎng)的影響:存在較多的丟包、誤碼、超時(shí)、連接中斷以及難以接入網(wǎng)絡(luò)等情況;
- 針對(duì)弱網(wǎng)情況,可做一下優(yōu)化:
1.失敗重試: 可在Retrofit等網(wǎng)絡(luò)框架添加攔截器,實(shí)現(xiàn)失敗重試;
3.3 IP直連
- 優(yōu)點(diǎn):能減少DNS的域名解析過(guò)程,從而提升連接或請(qǐng)求的速度。
- 缺點(diǎn):IP暴露,不安全。
3.4 HttpDns
- 出自:是阿里研發(fā)的產(chǎn)品HttpDns。
- 作用:使用HTTP協(xié)議進(jìn)行域名解析,代替現(xiàn)有基于UDP的DNS協(xié)議,域名解析請(qǐng)求直接發(fā)送到阿里云的HTTPDNS服務(wù)器,從而繞過(guò)運(yùn)營(yíng)商的Local DNS,能夠避免Local DNS造成的域名劫持問(wèn)題和調(diào)度不精準(zhǔn)問(wèn)題;
3.5 Http1.0、Http1.1、Http2.0
- 影響HTTP網(wǎng)絡(luò)請(qǐng)求主要是 帶寬 和 延遲 ;
-
Http1.0:每個(gè)TCP連接只能發(fā)送一個(gè)請(qǐng)求。發(fā)送數(shù)據(jù)完畢,連接就關(guān)閉,如果還要請(qǐng)求其他資源,就必須再新建一個(gè)連接,每次請(qǐng)求連接都需要3次握手,連接成本較高,性能較差。 -
Http1.1
* 持久連接: 即TCP連接默認(rèn)不關(guān)閉,可以被多個(gè)請(qǐng)求復(fù)用(對(duì)于同一個(gè)域名,大多數(shù)瀏覽器允許同時(shí)建立6個(gè)持久連接);
* 管道機(jī)制: 即在同一個(gè)TCP連接里面,客戶端可以同時(shí)發(fā)送多個(gè)請(qǐng)求,舉例:需要發(fā)送2個(gè)請(qǐng)求,以前HTTP1.0的做法是請(qǐng)求一次需要等等響應(yīng),再請(qǐng)求第二次類(lèi)似于一問(wèn)一答,而HTTP1.1就支持同時(shí)請(qǐng)求,之后按序響應(yīng);
* 缺點(diǎn):隊(duì)頭阻塞,上述已說(shuō)明HTTP1.1的TCP連接復(fù)用與響應(yīng)按序的,那么在多個(gè)請(qǐng)求使用同一個(gè)TCP連接的時(shí)候,一個(gè)響應(yīng)的特別慢的時(shí)候,會(huì)影響后續(xù)的響應(yīng)速度。 -
Http2.0
* 降低延遲: 路復(fù)用通過(guò)多個(gè)請(qǐng)求stream共享一個(gè)tcp連接的方式,解決了HOL blocking的問(wèn)題,降低了延遲同時(shí)提高了帶寬的利用率。
* 請(qǐng)求優(yōu)先級(jí): 多路復(fù)用帶來(lái)一個(gè)新的問(wèn)題是,在連接共享的基礎(chǔ)之上有可能會(huì)導(dǎo)致關(guān)鍵請(qǐng)求被阻塞。SPDY允許給每個(gè)request設(shè)置優(yōu)先級(jí),這樣重要的請(qǐng)求就會(huì)優(yōu)先得到響應(yīng)。
* header壓縮: 前面提到HTTP1.x的header很多時(shí)候都是重復(fù)多余的。選擇合適的壓縮算法可以減小包的大小和數(shù)量。
* 數(shù)據(jù)傳輸: HTTP/2采用二進(jìn)制格式而非文本格式。
3.6 連接復(fù)用
- 根據(jù)相同的HOST請(qǐng)求,可以設(shè)計(jì)連接的緩存,實(shí)現(xiàn)連接池進(jìn)行復(fù)用。例如:OkHttp中的Dispatcher;
4.傳輸
4.1 Protocol Buffers
- 定義:Protocol Buffers 和 XML、JSON一樣都是結(jié)構(gòu)數(shù)據(jù)序列化的工具。
- 作用:通過(guò)將結(jié)構(gòu)化的數(shù)據(jù)(擁有多種屬性)進(jìn)行序列化,從而實(shí)現(xiàn)**數(shù)據(jù)存儲(chǔ)和交換的功能 **。
- 優(yōu)點(diǎn):在傳輸數(shù)據(jù)量較大的需求場(chǎng)景下,Protocol Buffer 比 XML、JSON
更小(3到10倍)、更快(20到100倍)、使用 & 維護(hù)更簡(jiǎn)單;而且 Protocol Buffer 可以跨平臺(tái)、跨語(yǔ)音使用。
4.2 Gzip
- 定義:在 http/1.0 協(xié)議中關(guān)于服務(wù)端發(fā)送的數(shù)據(jù)可以配置一個(gè)
Content-Encoding字段,這個(gè)字段用于說(shuō)明數(shù)據(jù)的壓縮方法。(Content-Encoding:gizp、Accept-Encoding: gzip)
4.3 網(wǎng)絡(luò)緩存
-
網(wǎng)絡(luò)緩存:提供一種將數(shù)據(jù)存儲(chǔ)到本地的思想,實(shí)現(xiàn)減少服務(wù)器的請(qǐng)求負(fù)荷、加快請(qǐng)求速度、無(wú)網(wǎng)也能顯示內(nèi)容。例如:OkHttp的緩存機(jī)制(強(qiáng)制緩存與對(duì)比緩存)。
強(qiáng)制緩存:在緩存數(shù)據(jù)未失效的情況下,可以直接使用緩存數(shù)據(jù),由兩個(gè)字段Expires和Cache-Control用于標(biāo)明失效規(guī)則。
對(duì)比緩存:表示需要和服務(wù)端進(jìn)行相關(guān)信息的對(duì)比,由服務(wù)器決定是使用緩存還是最新內(nèi)容,如果服務(wù)器判定使用緩存,返回響應(yīng)嗎304,判定使用最新內(nèi)容,則返回響應(yīng)碼200和最新數(shù)據(jù)(ETag和If-None-Match)。
4.4 圖片傳輸
1.可通過(guò)Webp的圖片格式傳輸。
2.可實(shí)現(xiàn)圖片緩存機(jī)制(`二級(jí)緩存:Lrucache;DisLrucache等`)。
4.5 預(yù)加載
- 在設(shè)計(jì)業(yè)務(wù)請(qǐng)求時(shí),可合理的設(shè)計(jì)
數(shù)據(jù)提前加載的方式,提升用戶的體驗(yàn)。
5.監(jiān)控
5.1 Android Profiler

Android Profile.png
- Receiving:表示下行流量, 即下載接收;
- Sending:表示上行流量, 即上傳發(fā)送;
5.2 Stetho
-
Stetho是Facebook開(kāi)源的Andorid調(diào)試工具。當(dāng)你的應(yīng)用集成Stetho時(shí),開(kāi)發(fā)者可以訪問(wèn)Chrome,在Chrome Developer Tools中查看應(yīng)用布局,網(wǎng)絡(luò)請(qǐng)求,sqlite,preference等等,可視化一切應(yīng)用操作(更重要的是不用root)。
stetho.png
stetho1.png
5.總結(jié)
- 到此,
網(wǎng)絡(luò)優(yōu)化介紹完畢。 - 如果喜歡我的分享,可以點(diǎn)擊 關(guān)注 或者 贊,你們支持是我分享的最大動(dòng)力 。
- linhaojian的Github
歡迎關(guān)注linhaojian_CSDN博客或者linhaojian_簡(jiǎn)書(shū)!
不定期分享關(guān)于安卓開(kāi)發(fā)的干貨。
寫(xiě)技術(shù)文章初心
- 技術(shù)知識(shí)積累
- 技術(shù)知識(shí)鞏固
- 技術(shù)知識(shí)分享
- 技術(shù)知識(shí)交流

