零炬丸、為什么要學(xué)
回答這個(gè)問(wèn)題很簡(jiǎn)單秆麸,因?yàn)槊嬖嚬贂?huì)問(wèn)初嘹,而且還問(wèn)的不少及汉!相信經(jīng)歷過(guò)面試的同學(xué)基本都被問(wèn)過(guò)http緩存沮趣,并由此展開(kāi)一些列問(wèn)答。當(dāng)然學(xué)習(xí)好http還可以 幫你快速排查一些問(wèn)題坷随,比如安全問(wèn)題房铭。本文將羅列一系列知識(shí)點(diǎn),盡量覆蓋各個(gè)方面温眉,對(duì)每個(gè)點(diǎn)不會(huì)詳細(xì)講解缸匪,但是會(huì)提供一些優(yōu)秀的文章鏈接供大家深入學(xué)習(xí)。此外大家可以查看http技能圖譜來(lái)更直觀的查看相關(guān)知識(shí)點(diǎn)类溢。
一凌蔬、基礎(chǔ)知識(shí)
與http相關(guān)的TCP、IP闯冷、DNS砂心、url、uri
1.IP
IP地址是我們很熟悉的東西蛇耀,最常見(jiàn)的的就是127.0.0.1辩诞。我們都知道連接網(wǎng)絡(luò)后,每臺(tái)機(jī)器都會(huì)有不同的IP地址纺涤,也有自己的mac地址(這個(gè)地址是硬件寫(xiě)死的)译暂,那么我們傳輸信息的時(shí)候只要知道對(duì)方的IP地址,然后再和mac地址配對(duì)就基本可以確定接受信息方撩炊;而傳輸過(guò)程中我們肯定是希望信息高效傳遞過(guò)去外永,那么傳輸方式以及傳輸路徑就要找到最好的方式。IP協(xié)議就是做這些事情的拧咳,IP是指IP協(xié)議而不是我們常常說(shuō)的IP地址伯顶,它位于網(wǎng)絡(luò)層,所要做的事情主要是以下三點(diǎn):
1)尋址和路由;
2)傳遞服務(wù)砾淌;
3)數(shù)據(jù)包的分片和重組啦撮;
2.TCP
首先按照分層,TCP位于傳輸層汪厨,提供字節(jié)流服務(wù)赃春。那么什么是字節(jié)流呢?網(wǎng)絡(luò)傳輸數(shù)據(jù)就像汽車運(yùn)輸貨物一樣劫乱,比如我們運(yùn)輸?shù)氖切盘?hào)塔织中,這么大不可能一下子運(yùn)到目的地,這時(shí)候就需要一部分一部分運(yùn)過(guò)去衷戈,再組裝起來(lái)狭吼。而TCP確保數(shù)據(jù)能到達(dá)目的地。運(yùn)輸貨物我們打個(gè)就可以通知是否送到了殖妇,TCP要用什么方式呢刁笙?看圖說(shuō)話
還有四次揮手
3.DNS
我們要訪問(wèn)一臺(tái)服務(wù)器的東西,需要知道它的地址谦趣,IP地址可以作為一個(gè)標(biāo)識(shí)疲吸,但是四個(gè)數(shù)字是很不好記的,因此誕生了域名這個(gè)東西前鹅,比如www.qq.com摘悴,我們可以訪問(wèn)到騰訊主頁(yè),但這個(gè)是怎么找到對(duì)應(yīng)到騰訊的服務(wù)器呢舰绘?DNS服務(wù)就是干這個(gè)的蹂喻,它處于應(yīng)用層,當(dāng)然它也可以通過(guò)IP來(lái)查找對(duì)應(yīng)的域名捂寿。
4.URL和URI
URL: 統(tǒng)一資源定位符
URI: 統(tǒng)計(jì)資源標(biāo)識(shí)符
URI用來(lái)標(biāo)識(shí)某個(gè)互聯(lián)網(wǎng)資源口四,而URL是資源的位置,所以URL是URI的子集者蠕。這里知道簡(jiǎn)單區(qū)別即可窃祝。
二、http報(bào)文
http報(bào)文分為請(qǐng)求報(bào)文和響應(yīng)報(bào)文踱侣,HTTP請(qǐng)求報(bào)文:一個(gè)HTTP請(qǐng)求報(bào)文由請(qǐng)求行粪小、請(qǐng)求頭部、空行和請(qǐng)求數(shù)據(jù)4部分組成抡句。HTTP響應(yīng)報(bào)文:由三部分組成:狀態(tài)行探膊、消息報(bào)頭、響應(yīng)正文待榔。綜合兩種報(bào)文逞壁,我們把報(bào)文分為一下結(jié)構(gòu)
1.請(qǐng)求行
主要呈現(xiàn)請(qǐng)求的基本信息流济,包括請(qǐng)求的目標(biāo),協(xié)議版本腌闯,以及請(qǐng)求方法绳瘟。目標(biāo)就是一個(gè)url,比如我們要請(qǐng)求的網(wǎng)址或者跟后端協(xié)定好的接口地址姿骏。協(xié)議版本指http1.0糖声、http1.1等。請(qǐng)求方法最常見(jiàn)的GET分瘦、POST蘸泻,在http1.1總共有八種,這里不再一一闡述嘲玫,最常見(jiàn)的GET悦施、POST區(qū)別可以參考這篇文章
2.狀態(tài)行
狀態(tài)行就主要表示請(qǐng)求結(jié)果了,這里主要涉及狀態(tài)碼后面第三部分會(huì)說(shuō)到
3.首部字段
這里首部字段就有通用首部字段去团、請(qǐng)求首部字段以及響應(yīng)首部字段三種抡诞。
常用的首部字段比如Date(日期),Pragma渗勘、cache-control(緩存相關(guān))沐绒,Upgrade(協(xié)議升級(jí)俩莽,比如使用websocket)等旺坠。
請(qǐng)求首部字段比如Accept-*系列(表示優(yōu)先級(jí)的,Charset字符集扮超,Encoding編碼取刃,Language語(yǔ)言等),緩存類的(Etag和modified相關(guān))出刷,referer(請(qǐng)求方)等璧疗。
相應(yīng)首部字段比如緩存相關(guān)(Etag和modified相關(guān)),服務(wù)器信息(Server)馁龟,重定向(Location)等崩侠。
4.其他
http中未定義的一些字段,比如cookie
5.報(bào)文主體
請(qǐng)求報(bào)文主要是請(qǐng)求信息坷檩,query却音、body參數(shù)等。響應(yīng)報(bào)文主要是服務(wù)器返回的信息矢炼。
三系瓢、狀態(tài)碼
1xx:
信息類型,表示在處理了句灌。
2xx:
成功類型夷陋。比如常見(jiàn)的200,服務(wù)器處理成功但是不返回實(shí)體信息的204等。
3xx:
需要附加操作的骗绕,比如重定向(301永久重定向藐窄,302臨時(shí)重定向)和使用緩存(304,這里結(jié)合幾個(gè)首部字段使用酬土,具體可以參考http緩存)
4xx:
客戶端錯(cuò)誤枷邪,比如參數(shù)錯(cuò)誤(400),認(rèn)證失敗(401)诺凡,沒(méi)有訪問(wèn)權(quán)限(403)东揣,資源不存在(404)等
5xx:
服務(wù)器錯(cuò)誤,比如服務(wù)端執(zhí)行錯(cuò)誤或者故障(500)腹泌,服務(wù)器暫時(shí)無(wú)法處理(503)嘶卧,超時(shí)(504),協(xié)議有問(wèn)題(505)等
三凉袱、身份認(rèn)證
身份認(rèn)證主要有以下五種方式
1.承載用戶身份信息的HTTP首部(比如referer)
2.客戶端IP地址跟蹤芥吟,通過(guò)用戶的IP地址對(duì)其進(jìn)行識(shí)別
3.用戶登錄,用認(rèn)證方式來(lái)識(shí)別用戶(這里需要了解token機(jī)制)
4.胖URL专甩,一種在URL中嵌入識(shí)別信息的技術(shù)
5.cookie钟鸵,一種功能強(qiáng)大且高效的持久身份識(shí)別技術(shù)
詳細(xì)了解
四、安全
1.請(qǐng)求頭中的安全機(jī)制
CSP策略
可以采用請(qǐng)求頭設(shè)置方式
Content-Security-Policy: policy
Content-Security-Policy: default-src 'self'(自定義)
當(dāng)然也可以在meta標(biāo)簽中設(shè)置涤躲,比如<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">(來(lái)自mdn)棺耍。
X-Frame-Options
防止點(diǎn)擊劫持
X-XSS-Protection
控制瀏覽器XSS防止的開(kāi)關(guān)
2.cookie安全
比如cookie加密,設(shè)置HttpOnly和secure
五种樱、其他
https:四次握手蒙袍,ssl/tls協(xié)議,加密等嫩挤。
http2:優(yōu)勢(shì)害幅,多路復(fù)用、頭部壓縮岂昭、流的優(yōu)先級(jí)等以现。詳細(xì)
http3: 可以了解下。詳細(xì)
六约啊、總結(jié)
這里只針對(duì)http我們需要掌握的基本信息做一個(gè)大概的總結(jié)邑遏,具體的某方面知識(shí)建議查看書(shū)籍去了解,雖然我們?cè)诰帉?xiě)代碼(寫(xiě)bug中)過(guò)程中幾乎不會(huì)用到http棍苹,但是我們的項(xiàng)目運(yùn)行卻是離不開(kāi)它无宿,因此掌握基本的http對(duì)性能優(yōu)化,安全等都是很有幫助的枢里。有書(shū)寫(xiě)錯(cuò)誤或者解釋錯(cuò)誤的歡迎指出孽鸡!