面试复习题--Okhttp
1、http的流程
2、Https的流程
發(fā)起請求、驗(yàn)證身份、協(xié)商秘鑰、加密會(huì)話,具體流程如下(此例子只有客戶端對服務(wù)端的單向驗(yàn)證):
1、客戶端向服務(wù)端發(fā)起建立HTTPS請求。
2、服務(wù)器向客戶端發(fā)送數(shù)字證書。
3、客戶端驗(yàn)證數(shù)字證書,證書驗(yàn)證通過后客戶端生成會(huì)話密鑰(雙向驗(yàn)證則此處客戶端也會(huì)向服務(wù)器發(fā)送證書)。
4、服務(wù)器生成會(huì)話密鑰(雙向驗(yàn)證此處服務(wù)端也會(huì)對客戶端的證書驗(yàn)證)。
5、客戶端與服務(wù)端開始進(jìn)行加密會(huì)話。
具體的步驟如下:
第一步:客戶端向服務(wù)端發(fā)起請求
? ? ? ? 1、客戶端生成隨機(jī)數(shù)R1 發(fā)送給服務(wù)端;
? ? ? ? 2、告訴服務(wù)端自己支持哪些加密算法;
第二步:服務(wù)器向客戶端發(fā)送數(shù)字證書
? ? ? ? 1、服務(wù)端生成隨機(jī)數(shù)R2;
? ? ? ? 2、客戶端支持的加密算法中選擇一種雙方都支持的加密算法(此算法用于后面的會(huì)話密鑰生成)
? ? ? ? 3、服務(wù)端生成把證書、隨機(jī)數(shù)R2、會(huì)話密鑰生成算法,一同發(fā)給客戶端;
第三步:客戶端驗(yàn)證數(shù)字證書。
? ? ? ? 1、驗(yàn)證證書的可靠性,先用CA的公鑰解密被加密過后的證書,能解密則說明證書沒有問題,然后通過證書里提供的摘要算法進(jìn)行對數(shù)據(jù)進(jìn)行摘要,然后通過自己生成的摘要與服務(wù)端發(fā)送的摘要比對。
? ? ? ? 2、驗(yàn)證證書合法性,包括證書是否吊銷、是否到期、域名是否匹配,通過后則進(jìn)行后面的流程
? ? ? ? 3、獲得證書的公鑰、會(huì)話密鑰生成算法、隨機(jī)數(shù)R2
? ? ? ? 4、生成一個(gè)隨機(jī)數(shù)R3。
? ? ? ? 5、根據(jù)會(huì)話秘鑰算法使用R1、R2、R3生成會(huì)話秘鑰。
? ? ? ? 6、用服務(wù)端證書的公鑰加密隨機(jī)數(shù)R3并發(fā)送給服務(wù)端。
第四步:服務(wù)器得到會(huì)話密鑰
? ? ? ? 1、服務(wù)器用私鑰解密客戶端發(fā)過來的隨機(jī)數(shù)R3
? ? ? ? 2、根據(jù)會(huì)話秘鑰算法使用R1、R2、R3生成會(huì)話秘鑰
第五步:客戶端與服務(wù)端進(jìn)行加密會(huì)話
? ? ? ? 1、客戶端發(fā)送加密數(shù)據(jù)給服務(wù)端
? ? ? ? ? ? ? 發(fā)送加密數(shù)據(jù):客戶端加密數(shù)據(jù)后發(fā)送給服務(wù)端。
? ? ? ? 2、服務(wù)端響應(yīng)客戶端 ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? 解密接收數(shù)據(jù):服務(wù)端用會(huì)話密鑰解密客戶端發(fā)送的數(shù)據(jù); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?加密響應(yīng)數(shù)據(jù):用會(huì)話密鑰把響應(yīng)的數(shù)據(jù)加密發(fā)送給客戶端。
? ? ? ? 3、客戶端解密服務(wù)端響應(yīng)的數(shù)據(jù) ??
? ? ? ? ? ? ? 解密數(shù)據(jù):客戶端用會(huì)話密鑰解密響應(yīng)數(shù)據(jù);
3、Okhttp的流程
(1)、當(dāng)我們通過OkhttpClient創(chuàng)立一個(gè)okHttpClient 、Request 、Call,并發(fā)起同步或者異步請求時(shí);
(2)、okhttp會(huì)通過Dispatcher對我們所有的Call(RealCall實(shí)現(xiàn)類)進(jìn)行統(tǒng)一管理,并通過execute()及enqueue()方法對同步或者異步請求進(jìn)行執(zhí)行;
(3)、execute()及enqueue()這兩個(gè)方法會(huì)最終調(diào)用RealCall中的getResponseWithInterceptorChain()方法,從阻攔器鏈中獲取返回結(jié)果;
(4)、攔截器鏈中,依次通過ApplicationInterceptor(應(yīng)用攔截器)、RetryAndFollowUpInterceptor(重定向阻攔器)、BridgeInterceptor(橋接阻攔器)、CacheInterceptor(緩存阻攔器)、ConnectInterceptor(連接阻攔器)、NetwrokInterceptor(網(wǎng)絡(luò)攔截器)、CallServerInterceptor(請求阻攔器)對請求依次處理,與服務(wù)的建立連接后,獲取返回?cái)?shù)據(jù),再經(jīng)過上述阻攔器依次解決后,最后將結(jié)果返回給調(diào)用方。
4、Okhttp防抓包
? 1、 使用Proxy.NO_PROXY進(jìn)行防止抓包。
我們在使用OkHttp進(jìn)行網(wǎng)絡(luò)請求的時(shí)候防止Fiddler抓包可以簡單的使用OkHttpClient.Builder中的builder.proxy(Proxy.NO_PROXY);方法就可以避免Fiddler基本抓包。
2、使用builder.proxySelector進(jìn)行防止抓包。
因?yàn)榈谝环N方法只能避免Fiddler基本抓包方式在OkHttp中還有一種方法可以防止抓包。
這種方式要在app嵌入證書,以okhttp為例:當(dāng)okhttp使用X509TrustManager對服務(wù)器證書進(jìn)行校驗(yàn)時(shí),如果服務(wù)器證書的 subjectDN 和嵌入證書的 subjectDN 一致,我們再進(jìn)行簽名內(nèi)容 signature 的比對,如果不一致,拋出異常。示例代碼如下:
- 首先從本地讀出證書,獲取一個(gè)X509Certificate
- 檢查服務(wù)器證書時(shí)對比嵌入的證書
- 將自定義的 SSLSocketFactory 和 X509TrustManager 將入到 okhttp 客戶端
5、攔截器
RetryAndFollowUpInterceptor(重試和重定向攔截器)
第一個(gè)接觸到請求,最后接觸到響應(yīng);負(fù)責(zé)判斷是否需要重新發(fā)起整個(gè)請求;主要就是完成兩件事情:重試與重定向。
BridgeInterceptor(橋接攔截器)
補(bǔ)全請求,并對響應(yīng)進(jìn)行額外處理
CacheInterceptor(緩存攔截器)
請求前查詢緩存,獲得響應(yīng)并判斷是否需要緩存
ConnectInterceptor(鏈接攔截器)
與服務(wù)器完成TCP連接 (Socket)
CallServerInterceptor(請求服務(wù)攔截器)
與服務(wù)器通信;封裝請求數(shù)據(jù)與解析響應(yīng)數(shù)據(jù)(如:HTTP報(bào)文)
關(guān)聯(lián):https://blog.csdn.net/qq_45866344/article/details/125052085
6、優(yōu)點(diǎn)
?(1)內(nèi)置連接池,支持連接復(fù)用;
(2)支持gzip壓縮響應(yīng)體;
(3)通過緩存避免重復(fù)的請求;
(4)支持http2,對一臺(tái)機(jī)器的所有請求共享同一個(gè)socket
7、連接池
OkHttp里面使用ConnectionPool實(shí)現(xiàn)連接池,而且默認(rèn)支持5個(gè)并發(fā)KeepAlive,默認(rèn)鏈路生命為5分鐘。?雙端隊(duì)列Deque,雙端都能進(jìn)出,用來存儲(chǔ)連接的。OkHttp框架采用的是Socket連接,底層涉及到Http協(xié)議的封裝和解封,TLS/SSL安全協(xié)議的封裝等;連接池主要涉及到幾大類:ConnectionPool,RealConnection,StreamAllocation,ConnectionInterceptor;
1.ConnectionPool類:
該類是OkHttp的連接池,連接池可以有效地提高連接的使用效率;
主要涉及到添加,獲取,刪除連接等功能;
2.RealConection類:
RealConnection是Connection的是實(shí)現(xiàn)類,代表著一個(gè)真正的socket連接,RealConnection代表著客戶端和服務(wù)器端已經(jīng)有了一個(gè)通信鏈路;
3.StreamAllocation類:
StreamAllocation是外界使用Okhttp的連接的橋梁,通過newStream方法返回一個(gè)可使用的流,即HttpCodec實(shí)例,通過HttpCodec可以將輸入數(shù)據(jù)封裝成相應(yīng)的Http協(xié)議的數(shù)據(jù),然后通過socket的輸出流發(fā)送出去,同時(shí)也可以通過socket的輸入流讀取數(shù)據(jù)并解析數(shù)據(jù);
8、線程池
在OKHttp中,創(chuàng)建了一個(gè)閥值是Integer.MAX_VALUE的線程池,它不保留任何最小線程,隨時(shí)創(chuàng)建更多的線程數(shù),而且如果線程空閑后,只能多活60秒。所以也就說如果收到20個(gè)并發(fā)請求,線程池會(huì)創(chuàng)建20個(gè)線程,當(dāng)完成后的60秒后會(huì)自動(dòng)關(guān)閉所有20個(gè)線程。他這樣設(shè)計(jì)成不設(shè)上限的線程,以保證I/O任務(wù)中高阻塞低占用的過程,不會(huì)長時(shí)間卡在阻塞上。
總結(jié)
以上是生活随笔為你收集整理的面试复习题--Okhttp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019年东南大学网络空间安全学院夏令营
- 下一篇: 基于腾讯地图的输入自动提示与补全功能