OKHttp 系列的分析我們打算從 6 個(gè)地方下手,我們先從網(wǎng)絡(luò)的基礎(chǔ)知識(shí)開始,因?yàn)?OKHttp 涉及 Http 協(xié)議,所以對(duì)于 Http 的基礎(chǔ)知識(shí),做一個(gè)簡(jiǎn)單的認(rèn)識(shí),還是非常有必要的。這里推薦三本書《圖解 Http》《Http 權(quán)威指南》《Java 網(wǎng)絡(luò)編程基礎(chǔ)》
1.OSI 的七層模型


2.TCP的三次握手和四次揮手

3.Http 報(bào)文簡(jiǎn)介
HTTP 協(xié)議采用 HTTP 報(bào)文的形式傳遞數(shù)據(jù),客戶端的報(bào)文叫做請(qǐng)求報(bào)文;服務(wù)器端的報(bào)文叫做響應(yīng)報(bào)文。既然是報(bào)文,那么一定就會(huì)有格式:
請(qǐng)求報(bào)文(Request): 請(qǐng)求頭(首部) + 空行 + 請(qǐng)求內(nèi)容
響應(yīng)報(bào)文(Response): 響應(yīng)頭(首部) + 空行 + 響應(yīng)內(nèi)容
請(qǐng)求內(nèi)容和響應(yīng)內(nèi)容這個(gè)應(yīng)該不用過多的介紹,開發(fā)應(yīng)該都知道,那么請(qǐng)求頭到底是啥我們也知道,但是說到具體的一些參數(shù),未必全部知道其作用,所以我們還是詳細(xì)了解一下請(qǐng)求頭和響應(yīng)頭。這里我們需要自己去搭建一個(gè)后臺(tái)做測(cè)試,為什么自己去寫接口?第一我們可以了解一下后臺(tái)接口都是怎么寫的,第二像Cookie、Session 和 Token 這些都必須和后臺(tái)配合起來才能測(cè)試出作用,總不可能去背吧,我們還是需要自己驗(yàn)證一下。具體操作在末尾視頻連接中。接下來我們看下 HTTP 首部都有啥?
4.Http 首部
HTTP 首部字段包含的信息很豐富(特他媽多的意思),我們可以自己打開瀏覽器觀察觀察,這樣就會(huì)有一個(gè)更加直觀的感受,反正這些首部字段非常重要,無論你是自己去寫一個(gè)網(wǎng)絡(luò)框架,還是分析 OkHttp 源碼都需要對(duì)這些字段有了解,這里我就羅列一些比較常用的做一下解釋:
3.1 請(qǐng)求首部字段
Accept:用戶代理可處理的媒體類型
Accept-Charset:優(yōu)先的字符集
Accept-Language:優(yōu)先的語(yǔ)言(自然語(yǔ)言)
Accept-Encoding:優(yōu)先的內(nèi)容編碼
If-Modified-Since:比較資源的更新時(shí)間
If-Range:資源未更新時(shí)發(fā)送實(shí)體 Byte 的范圍請(qǐng)求
Cookie: 設(shè)置Cookie(下面會(huì)單獨(dú)講)
3.2 響應(yīng)首部字段
Cache-Control:控制緩存的行為(下面會(huì)單獨(dú)講)
set-Cookie: 設(shè)置Cookie(下面會(huì)單獨(dú)講)
Location:令客戶端重定向至指定 URI
Expires:實(shí)體主體過期的日期時(shí)間
Last-Modified:資源的最后修改日期時(shí)間
Status Code: 響應(yīng)的狀態(tài)碼(下面會(huì)單獨(dú)講)
4.Cookie、Session 和 Token
4.1 Cookie、Session 和 Token 都是用來做持久化處理的,目的就是讓客戶端和服務(wù)端相互認(rèn)識(shí)。Http 請(qǐng)求默認(rèn)是不持久的沒有狀態(tài)的,誰(shuí)也不認(rèn)識(shí)誰(shuí)。
4.2 Cookie: 是存放在客戶端的信息,服務(wù)器通過響應(yīng)頭 Set-Cookie 字段給客戶端,如果 Cookie 已過期一般是會(huì)被清楚的,如果 Cookie 沒過期下次訪問網(wǎng)站還是會(huì)通過請(qǐng)求頭的 Cookie 字段帶給服務(wù)器。
4.3 Session: 是存放在服務(wù)器上面的客戶端臨時(shí)信息,用戶離開網(wǎng)站是會(huì)被清除的。
4.4 Token(App)"令牌":用戶身份的驗(yàn)證,有點(diǎn)類似于 Cookie ,相對(duì)來說更安全,一般流程:
3.4.1 客戶端向服務(wù)端申請(qǐng) Token
3.4.2 服務(wù)端收到請(qǐng)求,會(huì)去驗(yàn)證用戶信息,簽發(fā)一個(gè) Token 給客戶端,服務(wù)端自己也會(huì)保存 Token
3.4.3 客戶端收到服務(wù)端簽發(fā)的 Token 會(huì)保存起來,每次請(qǐng)求帶上 Token
3.4.4 服務(wù)器收到其他請(qǐng)求,會(huì)去驗(yàn)證客戶端的 Token , 如果成功返回?cái)?shù)據(jù),不成功啥都不給或者做其他處理
5.Http 緩存
關(guān)于緩存看下這篇文章就可以了:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ,與緩存相關(guān)的有兩個(gè)重要的字段:
Cache-Control(緩存策略):Public、private、no-cache、max-age 、no-store(不緩存)
Expires(緩存的過期策略):指名了緩存數(shù)據(jù)有效的絕對(duì)時(shí)間,告訴客戶端到了這個(gè)時(shí)間點(diǎn)(比照客戶端時(shí)間點(diǎn))后本地緩存就作廢了,在這個(gè)時(shí)間點(diǎn)內(nèi)客戶端可以認(rèn)為緩存數(shù)據(jù)有效,可直接從緩存中加載展示。
還有一種特例,如本地有緩存,但是緩存過期了,這個(gè)時(shí)候會(huì)再次像服務(wù)器發(fā)起請(qǐng)求,但是服務(wù)器數(shù)據(jù)如果沒有變動(dòng)那么不一定會(huì)給你數(shù)據(jù),而是返回狀態(tài)碼 304 ,那么什么情況下會(huì)返回 304 呢?這個(gè)就是《論自己寫接口的重要性》我們自己寫一個(gè)測(cè)試接口,測(cè)試一下就可以看到這種結(jié)果了。
6. Http狀態(tài)碼
1xx: Infomational (信息狀態(tài)碼) ,接收的請(qǐng)求正在處理
2xx: Succeed(成功),請(qǐng)求正常處理完畢,如 200,204
3xx: Redirection(重定向),需要進(jìn)行附加操作,一般是沒有響應(yīng)數(shù)據(jù)返回的,如 304(Not,modified)307
4xx: Client Error (客戶端的錯(cuò)誤),服務(wù)器無法處理請(qǐng)求,如 404,405
5xx: Server Error (服務(wù)端的錯(cuò)誤),服務(wù)器處理請(qǐng)求出錯(cuò),如 500,502
7. Http 和 Https 的區(qū)別
Https = Http + 加密 + 驗(yàn)證 + 完整
Http 的缺點(diǎn):
7.1 數(shù)據(jù)是沒有加密傳輸,可能會(huì)遭遇竊聽;
7.2 不驗(yàn)證通信方的身份,可能會(huì)遭遇偽裝;
7.3 無法驗(yàn)證報(bào)文的完整性,可能會(huì)遭遇篡改。
8. Http 1.x 和 Http 2.0 的區(qū)別
