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