okhttp簡(jiǎn)介-學(xué)習(xí)筆記

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ù)

  1. Okio作為OkHttp使用的I/O接口址芯,實(shí)現(xiàn)對(duì)文件/字符流/字節(jié)流等的讀寫的良好封裝,使得通過(guò)sink()souce()即可進(jìn)行數(shù)據(jù)讀寫窜觉。
  2. i/o流向
    sink -> socket/File
    Source <- socket/File

4. HTTP Interceptor圖

httpInterceptor圖

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緩存中獲取砰左。


HTTP緩存策略

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ò)率。


1

10. 引用

Okio
OkHttp解析
OkHttp解析2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竹挡,一起剝皮案震驚了整個(gè)濱河市捣辆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌此迅,老刑警劉巖汽畴,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耸序,居然都是意外死亡忍些,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門坎怪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)罢坝,“玉大人,你說(shuō)我怎么就攤上這事搅窿∴夷穑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵男应,是天一觀的道長(zhǎng)闹司。 經(jīng)常有香客問(wèn)我,道長(zhǎng)沐飘,這世上最難降的妖魔是什么游桩? 我笑而不...
    開(kāi)封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮耐朴,結(jié)果婚禮上借卧,老公的妹妹穿的比我還像新娘。我一直安慰自己筛峭,他們只是感情好铐刘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著影晓,像睡著了一般镰吵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俯艰,一...
    開(kāi)封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天捡遍,我揣著相機(jī)與錄音锌订,去河邊找鬼竹握。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辆飘,可吹牛的內(nèi)容都是我干的啦辐。 我是一名探鬼主播谓传,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芹关!你這毒婦竟也來(lái)了续挟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侥衬,失蹤者是張志新(化名)和其女友劉穎诗祸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轴总,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡直颅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怀樟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片功偿。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖往堡,靈堂內(nèi)的尸體忽然破棺而出械荷,到底是詐尸還是另有隱情,我是刑警寧澤虑灰,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布吨瞎,位于F島的核電站,受9級(jí)特大地震影響穆咐,放射性物質(zhì)發(fā)生泄漏关拒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一庸娱、第九天 我趴在偏房一處隱蔽的房頂上張望着绊。 院中可真熱鬧,春花似錦熟尉、人聲如沸归露。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剧包。三九已至,卻和暖如春往果,著一層夾襖步出監(jiān)牢的瞬間疆液,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工陕贮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堕油,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像掉缺,于是被迫代替她去往敵國(guó)和親卜录。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容