1. 介紹
okHttp技術(shù)已被Android4.4之后納入HttpURLConnection底層通信庫(kù),重要性不言而喻。
okhttp對(duì)網(wǎng)絡(luò)通信中的通信協(xié)議,數(shù)據(jù)解析冰啃,I/O,緩存刘莹,并發(fā)請(qǐng)求實(shí)現(xiàn)了良好的策略阎毅,并拓展和支持了Application/NetWork攔截,HTTP2協(xié)議点弯,數(shù)據(jù)ZIP壓縮等功能扇调。HTTPS其實(shí)是有兩部分組成:HTTP + SSL / TLS
2. 通信
2.1 SSL/TLS加密: 保證數(shù)據(jù)傳輸?shù)陌踩?br> 方法:客戶端先向服務(wù)器端索要公鑰,然后用公鑰加密信息抢肛,服務(wù)器收到密文后狼钮,用自己的私鑰解密。雙方會(huì)通過(guò)通信中的幾個(gè)隨機(jī)隨機(jī)數(shù)生成對(duì)稱機(jī)密的“對(duì)話密鑰”捡絮。對(duì)話密鑰用戶加密傳輸?shù)臄?shù)據(jù)熬芜,RSA公鑰和私鑰是為了驗(yàn)證各自的身份。通過(guò)兩輪共四次握手確定了各自身份和加密方法福稳。參考
SSL(Secure Socket Layer涎拉,安全套接字層):位于可靠的面向連接的網(wǎng)絡(luò)層協(xié)議和應(yīng)用層協(xié)議之間的一種協(xié)議層。
TLS(Transport Layer Security的圆,傳輸層安全協(xié)議):用于兩個(gè)應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性鼓拧。
區(qū)別:TLS建立在SSL 3.0協(xié)議規(guī)范之上,是SSL 3.0的后續(xù)版本略板。在TLS與SSL3.0之間的差別主要是它們所支持的加密算法不同毁枯。參考
公鑰慈缔、私鑰 的解釋
公鑰 :用于向外發(fā)布叮称,任何人都能獲取,
私鑰 :要自己保存藐鹤,切勿給別人
一下兩種情況經(jīng)常有人弄混瓤檐,一定要理解。
情況1:公鑰用于【加密】娱节, 私鑰用于【解密】
如果加密密鑰是公開(kāi)的挠蛉,這用于客戶給私鑰所有者上傳加密的數(shù)據(jù),這被稱作為公開(kāi)密鑰加密(狹義)肄满。
例如谴古,網(wǎng)絡(luò)銀行的客戶發(fā)給銀行網(wǎng)站的賬戶操作的加密數(shù)據(jù)质涛。HTTPS 等。
情況2:公鑰用于【解密】掰担,私鑰用于【加密】
如果解密密鑰是公開(kāi)的汇陆,用私鑰加密的信息,可以用公鑰對(duì)其解密带饱,用于客戶驗(yàn)證持有私鑰一方發(fā)布的數(shù)據(jù)或文件是完整準(zhǔn)確的毡代,接收者由此可知這條信息確實(shí)來(lái)自于擁有私鑰的某人,這被稱作數(shù)字簽名勺疼,公鑰的形式就是數(shù)字證書教寂。例如,從網(wǎng)上下載的安裝程序执庐,一般都帶有程序制作者的數(shù)字簽名酪耕,可以證明該程序的確是該作者(公司)發(fā)布的而不是第三方偽造的且未被篡改過(guò)(身份認(rèn)證/驗(yàn)證)。
2.2 SOCKET通信
傳輸層的TCP是基于網(wǎng)絡(luò)層的IP協(xié)議的轨淌,而應(yīng)用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的因妇,而Socket本身不算是協(xié)議,它只是提供了一個(gè)針對(duì)TCP或者UDP編程的通信API猿诸。Socket除非主動(dòng)斷開(kāi)否則可保持長(zhǎng)連接婚被,HTTP1.0短連接,HTTP1.0的長(zhǎng)連接有時(shí)限。HTTP通信服務(wù)可使用sockets實(shí)現(xiàn)梳虽。參考
3. I/O : Okio庫(kù)
- Okio作為OkHttp使用的I/O接口址芯,實(shí)現(xiàn)對(duì)文件/字符流/字節(jié)流等的讀寫的良好封裝,使得通過(guò)
sink()
及souce()
即可進(jìn)行數(shù)據(jù)讀寫窜觉。 - i/o流向
sink -> socket/File
Source <- socket/File
4. HTTP Interceptor圖
5. 通信Platform
OkHttp的最底層是Socket
okhttp//實(shí)現(xiàn)HTTP協(xié)議
framwork//JRE谷炸,實(shí)現(xiàn)JDK中Socket封裝
jvm//JDK的實(shí)現(xiàn),本質(zhì)對(duì)libc標(biāo)準(zhǔn)庫(kù)的native封裝
bionic//android下的libc標(biāo)準(zhǔn)庫(kù)
ystemcall//用戶態(tài)切換入內(nèi)核
kernel//實(shí)現(xiàn)下協(xié)議棧(L4,L3)與網(wǎng)絡(luò)驅(qū)動(dòng)(一般是L2,L1)
6. 連接池的自動(dòng)清理CleanUp
okhttp使用了類似于引用計(jì)數(shù)法與標(biāo)記擦除法的混合使用禀挫,當(dāng)連接空閑或者釋放時(shí)旬陡,StreamAllocation的數(shù)量會(huì)漸漸變成0,從而被線程池監(jiān)測(cè)到并回收语婴,這樣就可以保持多個(gè)健康的keep-alive連接
7. HTTP緩存策略
okHttp緩存策略可通過(guò)Header中設(shè)置Expires/Cache-Control/ETag/Last-Modified等設(shè)置描孟。Expires/Cache-Conrol確定是否進(jìn)行網(wǎng)絡(luò)資源獲取,ETag(if-not-match)/Last-Modified(if-modified-since)確定網(wǎng)絡(luò)請(qǐng)求是否從代理CDN緩存中獲取砰左。
8. HTTP緩存的存儲(chǔ)策略
緩存使用DiskLruCache結(jié)構(gòu)管理緩存文件FileSystem匿醒,DiskLruCache內(nèi)部使用LinkHashMap進(jìn)行LRU算法實(shí)現(xiàn)。在緩存文件清理策略上使用LRU算法缠导,以線程池進(jìn)行緩存的自動(dòng)清理廉羔。
擴(kuò)展
LinkHashMap可以保持有序(插入順序/LRU訪問(wèn)順序)是因?yàn)閮?nèi)部維護(hù)了一個(gè)雙向鏈表。
9. OKHTTP線程隊(duì)列
OkHttp線程池可通過(guò)緩存和閾值控制CPU工作量僻造。
采用Dispatcher分發(fā)技術(shù)與線程池配合憋他,實(shí)現(xiàn)單生產(chǎn)者多消費(fèi)者模式下的高并發(fā)低阻塞孩饼。
使try/finally減少使用采用wait/notify減少了編碼復(fù)雜性和出錯(cuò)率。