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ì)開發(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)求過程
http請(qǐng)求流程.png
- 通過上圖可以很清楚的理解HTTP協(xié)議的請(qǐng)求過程:
1.客戶端輸入域名本涕,通過瀏覽器請(qǐng)求發(fā)送业汰;
2.通過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的域名解析過程污朽,從而提升連接或請(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ù)器顷锰,從而繞過運(yùn)營(yíng)商的Local DNS,能夠避免Local DNS造成的域名劫持問題和調(diào)度不精準(zhǔ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)求第二次類似于一問一答蛤袒,而HTTP1.1就支持同時(shí)請(qǐng)求,之后按序響應(yīng)壮不;
* 缺點(diǎn):隊(duì)頭阻塞汗盘,上述已說明HTTP1.1的TCP連接復(fù)用與響應(yīng)按序的皱碘,那么在多個(gè)請(qǐng)求使用同一個(gè)TCP連接的時(shí)候询一,一個(gè)響應(yīng)的特別慢的時(shí)候,會(huì)影響后續(xù)的響應(yīng)速度。 -
Http2.0
* 降低延遲: 路復(fù)用通過多個(gè)請(qǐng)求stream共享一個(gè)tcp連接的方式健蕊,解決了HOL blocking的問題菱阵,降低了延遲同時(shí)提高了帶寬的利用率。
* 請(qǐng)求優(yōu)先級(jí): 多路復(fù)用帶來一個(gè)新的問題是缩功,在連接共享的基礎(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ù)序列化的工具甫男。
- 作用:通過將結(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)直砂、跨語音使用菌仁。
4.2 Gzip
- 定義:在 http/1.0 協(xié)議中關(guān)于服務(wù)端發(fā)送的數(shù)據(jù)可以配置一個(gè)
Content-Encoding
字段,這個(gè)字段用于說明數(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ǎ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.可通過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開源的Andorid調(diào)試工具肌似。當(dāng)你的應(yīng)用集成Stetho時(shí),開發(fā)者可以訪問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)書!
不定期分享關(guān)于安卓開發(fā)的干貨云稚。
寫技術(shù)文章初心
- 技術(shù)知識(shí)積累
- 技術(shù)知識(shí)鞏固
- 技術(shù)知識(shí)分享
- 技術(shù)知識(shí)交流