了解 Web 及網(wǎng)絡(luò)基礎(chǔ)
對(duì)端傳輸
發(fā)送端在層與層間傳輸數(shù)據(jù)時(shí),沒經(jīng)過(guò)一層都會(huì)被加上首部信息,接收端每經(jīng)過(guò)一層都會(huì)刪除一條首部
多種協(xié)議作用
IP 協(xié)議,TCP 協(xié)議和 DNS 服務(wù)在使用 HTTP 協(xié)議過(guò)程中發(fā)揮的作用
簡(jiǎn)單的 HTTP 協(xié)議
請(qǐng)求報(bào)文和響應(yīng)報(bào)文
客戶端像服務(wù)器發(fā)起請(qǐng)求時(shí)會(huì)生成一段請(qǐng)求報(bào)文,請(qǐng)求報(bào)文是由請(qǐng)求方法,URL,協(xié)議版本,可選的請(qǐng)求首部字段和內(nèi)容實(shí)體構(gòu)成。
請(qǐng)求報(bào)文
接收到請(qǐng)求的服務(wù)器,會(huì)將請(qǐng)求內(nèi)容的處理結(jié)構(gòu)以響應(yīng)的形式返回。響應(yīng)報(bào)文基本上由協(xié)議版本,狀態(tài)碼,用以解釋狀態(tài)的原因短語(yǔ),可選的響應(yīng)首部字段以及實(shí)體主體構(gòu)成。
響應(yīng)報(bào)文
HTTP 是不保存狀態(tài)的協(xié)議和 Cookie 的簡(jiǎn)單介紹
HTTP 協(xié)議對(duì)于發(fā)送的請(qǐng)求和響應(yīng)不做持久化處理。這時(shí)候引入了 Cookie 技術(shù)用于狀態(tài)管理。Cookie 對(duì)用與登錄的狀態(tài)管理,沒有 Cookie 這個(gè)技術(shù)的話,因?yàn)?HTTP 不保存狀態(tài),每次打開新網(wǎng)頁(yè)都必須再次登錄。
Cookie 會(huì)根據(jù)響應(yīng)報(bào)文中的 Set-Cookie 字段來(lái)通知客戶端自動(dòng)保存 Cookie。下次請(qǐng)求時(shí)會(huì)自動(dòng)發(fā)送 Cookie,服務(wù)器會(huì)比對(duì)數(shù)據(jù)得到狀態(tài)結(jié)果。
先引入副作用和冪等的概念。
副作用指對(duì)服務(wù)器上的資源做改變,搜索是無(wú)副作用的,注冊(cè)是副作用的。
冪等指發(fā)送 M 和 N 次請(qǐng)求(兩者不相同且都大于1),服務(wù)器上資源的狀態(tài)一致。注冊(cè)10個(gè)和11個(gè)帳號(hào)是不冪等的,對(duì)文章進(jìn)行更改10次和11次是冪等的。
在規(guī)范的應(yīng)用場(chǎng)景上說(shuō),Get 多用于無(wú)副作用,冪等的場(chǎng)景,例如搜索關(guān)鍵字。Post 多用于副作用,不冪等的場(chǎng)景,例如注冊(cè)。
在技術(shù)上說(shuō):
- Get 請(qǐng)求能緩存,Post 不能
- Post 相對(duì) Get 安全一點(diǎn)點(diǎn),因?yàn)镚et 請(qǐng)求都包含在 URL 里,且會(huì)被瀏覽器保存歷史紀(jì)錄,Post 不會(huì),但是在抓包的情況下都是一樣的。
- Post 可以通過(guò) request body來(lái)傳輸比 Get 更多的數(shù)據(jù),Get 沒有這個(gè)技術(shù)
- URL有長(zhǎng)度限制,會(huì)影響 Get 請(qǐng)求,但是這個(gè)長(zhǎng)度限制是瀏覽器規(guī)定的,不是 RFC 規(guī)定的
- Post 支持更多的編碼類型且不對(duì)數(shù)據(jù)類型限制
常見狀態(tài)碼
常見狀態(tài)碼
2XX 成功
- 200 OK,表示從客戶端發(fā)來(lái)的請(qǐng)求在服務(wù)器端被正確處理
- 204 No content,表示請(qǐng)求成功,但響應(yīng)報(bào)文不含實(shí)體的主體部分
- 206 Partial Content,進(jìn)行范圍請(qǐng)求
3XX 重定向
- 301 moved permanently,永久性重定向,表示資源已被分配了新的 URL
- 302 found,臨時(shí)性重定向,表示資源臨時(shí)被分配了新的 URL
- 303 see other,表示資源存在著另一個(gè) URL,應(yīng)使用 GET 方法丁香獲取資源
- 304 not modified,表示服務(wù)器允許訪問資源,但因發(fā)生請(qǐng)求未滿足條件的情況
- 307 temporary redirect,臨時(shí)重定向,和302含義相同
4XX 客戶端錯(cuò)誤
- 400 bad request,請(qǐng)求報(bào)文存在語(yǔ)法錯(cuò)誤
- 401 unauthorized,表示發(fā)送的請(qǐng)求需要有通過(guò) HTTP 認(rèn)證的認(rèn)證信息
- 403 forbidden,表示對(duì)請(qǐng)求資源的訪問被服務(wù)器拒絕
- 404 not found,表示在服務(wù)器上沒有找到請(qǐng)求的資源
5XX 服務(wù)器錯(cuò)誤
- 500 internal sever error,表示服務(wù)器端在執(zhí)行請(qǐng)求時(shí)發(fā)生了錯(cuò)誤
- 503 service unavailable,表明服務(wù)器暫時(shí)處于超負(fù)載或正在停機(jī)維護(hù),無(wú)法處理請(qǐng)求
HTTP 首部
通用首部
指請(qǐng)求報(bào)文和響應(yīng)報(bào)文都可以使用的字段
- Cache-Control no-cache 指客戶端不緩存過(guò)期資源 no-store 指不進(jìn)行緩存 max-age 指緩存資源的緩存時(shí)間比指定的值小,那么客戶端就接受緩存資源,且緩存服務(wù)器不對(duì)資源有效性進(jìn)行再次確認(rèn)
- Connection 指控制不再轉(zhuǎn)發(fā)給代理的首部字段(Hop-by-hop),管理持久連接 close 指服務(wù)器像明確斷開連接 Keep-Alive 指保存持久連接,HTTP/1.1前默認(rèn)連接是非持久性的,如需要保存持久連接,需要增加此字段
- Upgrade 可以用來(lái)指定一個(gè)完全不同的通信協(xié)議,對(duì)于這個(gè)字段,服務(wù)器可以返回101狀態(tài)碼
請(qǐng)求首部字段
- Accept 指用戶代理能夠處理的媒體類型及媒體類型的相對(duì)優(yōu)先級(jí)
- Accept-Encoding 指用來(lái)告知服務(wù)器用戶代理支持的內(nèi)容編碼及內(nèi)容編碼的優(yōu)先級(jí)順序
- Authorization 指用來(lái)告知服務(wù)器,用戶代理的認(rèn)證信息
- Host 當(dāng)一個(gè) IP 下存在多個(gè)域名時(shí),幫助服務(wù)器知道要請(qǐng)求的具體主機(jī)
- User-Agent 會(huì)講創(chuàng)建請(qǐng)求的瀏覽器和用戶代理名稱等信息傳達(dá)給服務(wù)器
HTTPS
HTTPS 是 HTTP 建立在 SSL/TLS 安全協(xié)議上的。
在 IOS 中,客戶端本地會(huì)存放著 CA 證書,在HTTPS 請(qǐng)求時(shí),會(huì)首先像服務(wù)器索要公鑰,獲得公鑰后會(huì)使用本地 CA 證書驗(yàn)證公鑰的正確性,然后通過(guò)正確的公鑰加密信息發(fā)送給服務(wù)器,服務(wù)器會(huì)使用私鑰解密信息。
SSL/TLS握手階段分為五步:以下引自 阮一峰的網(wǎng)絡(luò)日志第一步,愛麗絲給出協(xié)議版本號(hào)、一個(gè)客戶端生成的隨機(jī)數(shù)(Client random),以及客戶端支持的加密方法。第二步,鮑勃確認(rèn)雙方使用的加密方法,并給出數(shù)字證書、以及一個(gè)服務(wù)器生成的隨機(jī)數(shù)(Server random)。第三步,愛麗絲確認(rèn)數(shù)字證書有效,然后生成一個(gè)新的隨機(jī)數(shù)(Premaster secret),并使用數(shù)字證書中的公鑰,加密這個(gè)隨機(jī)數(shù),發(fā)給鮑勃。第四步,鮑勃使用自己的私鑰,獲取愛麗絲發(fā)來(lái)的隨機(jī)數(shù)(即Premaster secret)。第五步,愛麗絲和鮑勃根據(jù)約定的加密方法,使用前面的三個(gè)隨機(jī)數(shù),生成"對(duì)話密鑰"(session key),用來(lái)加密接下來(lái)的整個(gè)對(duì)話過(guò)程。
HTTPS 相對(duì)于 HTTP 性能上差點(diǎn),因?yàn)槎嗔?SSL/TLS 的幾次握手和加密解密的運(yùn)算處理,但是加密解密的運(yùn)算處理已經(jīng)可以通過(guò)特有的硬件來(lái)加速處理。