1.HTTP主要特點(diǎn)
- 簡(jiǎn)單快速
- 靈活
- 無(wú)連接
- 無(wú)狀態(tài)
簡(jiǎn)單:每個(gè)資源(比如圖片、頁(yè)面)都通過(guò) url 來(lái)定位。這都是固定的拥坛,在http協(xié)議中狭园,處理起來(lái)也比較簡(jiǎn)單读处,想訪問(wèn)什么資源,直接輸入url即可妙啃。
靈活:http協(xié)議的頭部有一個(gè)數(shù)據(jù)類(lèi)型档泽,通過(guò)http協(xié)議,就可以完成不同數(shù)據(jù)類(lèi)型的傳輸揖赴。
無(wú)連接:連接一次馆匿,就會(huì)斷開(kāi),不會(huì)繼續(xù)保持連接燥滑。
無(wú)狀態(tài):客戶端和服務(wù)器端是兩種身份渐北。第一次請(qǐng)求結(jié)束后,就斷開(kāi)了铭拧,第二次請(qǐng)求時(shí)赃蛛,服務(wù)器端并沒(méi)有記住之前的狀態(tài),也就是說(shuō)搀菩,服務(wù)器端無(wú)法區(qū)分客戶端是否為同一個(gè)人呕臂、同一個(gè)身份。有的時(shí)候肪跋,我們?cè)L問(wèn)網(wǎng)站時(shí)歧蒋,網(wǎng)站能記住我們的賬號(hào),這個(gè)是通過(guò)其他的手段(比如 session)做到的,并不是http協(xié)議能做到的谜洽。
2.HTTP工作過(guò)程
一次HTTP操作稱為一個(gè)事務(wù)萝映,其工作過(guò)程大概如下:
- 用戶在瀏覽器中鍵入需要訪問(wèn)網(wǎng)頁(yè)的URL或者點(diǎn)擊某個(gè)網(wǎng)頁(yè)中鏈接;
瀏覽器根據(jù)URL中的域名阐虚,通過(guò)DNS解析出目標(biāo)網(wǎng)頁(yè)的IP地址序臂; - 瀏覽器請(qǐng)求這個(gè)頁(yè)面:http://hackr.ip/index.html。在這一步实束,需要域名系統(tǒng)DNS解析域名hackr.ip,得主機(jī)的IP地址 20X.189.105.112奥秆。然后將上面結(jié)合本機(jī)自己的信息,封裝成一個(gè)http請(qǐng)求數(shù)據(jù)包復(fù)制代碼磕洪。
- 在HTTP開(kāi)始工作前吭练,客戶端首先會(huì)通過(guò)TCP/IP協(xié)議來(lái)和服務(wù)端建立鏈接(TCP三次握手)
- 建立連接后,客戶機(jī)發(fā)送一個(gè)請(qǐng)求給服務(wù)器析显,請(qǐng)求方式的格式為:統(tǒng)一資源標(biāo)識(shí)符(URL)鲫咽、協(xié)議版本號(hào),后邊是MIME信息包括請(qǐng)求修飾符谷异、客戶機(jī)信息和可內(nèi)容分尸。
- 服務(wù)器接到請(qǐng)求后,給予相應(yīng)的響應(yīng)信息歹嘹,其格式為一個(gè)狀態(tài)行箩绍,包括信息的協(xié)議版本號(hào)、一個(gè)成功或錯(cuò)誤的代碼尺上,后邊是MIME信息包括服務(wù)器信息材蛛、實(shí)體信息和可能的內(nèi)容。
- 一旦Web服務(wù)器向?yàn)g覽器發(fā)送了請(qǐng)求數(shù)據(jù)怎抛,它就要關(guān)閉TCP連接卑吭,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼:Connection:keep-alive,TCP連接在發(fā)送后將仍然保持打開(kāi)狀態(tài)马绝,于是豆赏,瀏覽器可以繼續(xù)通過(guò)相同的連接發(fā)送請(qǐng)求。保持連接節(jié)省了為每個(gè)請(qǐng)求建立新連接所需的時(shí)間富稻,還節(jié)約了網(wǎng)絡(luò)帶寬掷邦。
3.HTTP報(bào)文
http報(bào)文包括:請(qǐng)求報(bào)文和響應(yīng)報(bào)文。
請(qǐng)求報(bào)文
- 請(qǐng)求行:包括請(qǐng)求方法椭赋、請(qǐng)求的url抚岗、http協(xié)議及版本。
- 請(qǐng)求頭:一大堆的鍵值對(duì)哪怔。
- 空行指的是:當(dāng)服務(wù)器在解析請(qǐng)求頭的時(shí)候宣蔚,如果遇到了空行廷痘,則表明,后面的內(nèi)容是請(qǐng)求體件已。
-
請(qǐng)求體:數(shù)據(jù)部分。
image.png
響應(yīng)報(bào)文
- 狀態(tài)行:http協(xié)議及版本元暴、狀態(tài)碼及狀態(tài)描述篷扩。
- 響應(yīng)頭
- 空行
-
響應(yīng)體
image.png
常見(jiàn)的請(qǐng)求頭/響應(yīng)頭:
https://itbilu.com/other/relate/EJ3fKUwUx.html
4.HTTP方法
- GET:獲取資源
- POST:傳輸資源
- PUT:更新資源
- DELETE:刪除資源
- HEAD:獲得報(bào)文首部
get與post區(qū)別:
1、瀏覽器在回退時(shí)茉盏,get不會(huì)重新請(qǐng)求鉴未,但是post會(huì)重新請(qǐng)求○蹋【重要】
2铜秆、get請(qǐng)求會(huì)被瀏覽器主動(dòng)緩存,而post不會(huì)讶迁×耄【重要】
3、get請(qǐng)求的參數(shù)巍糯,會(huì)報(bào)保留在瀏覽器的歷史記錄里啸驯,而post不會(huì)。做業(yè)務(wù)時(shí)要注意祟峦。為了防止CSRF攻擊罚斗,很多公司把get統(tǒng)一改成了post。
4宅楞、get請(qǐng)求在url中傳遞的參數(shù)有大小限制针姿,基本是2kb,不同的瀏覽器略有不同厌衙。而post沒(méi)有注意距淫。
5、get的參數(shù)是直接暴露在url上的迅箩,相對(duì)不安全溉愁。而post是放在請(qǐng)求體中的。
5.HTTP狀態(tài)碼
1開(kāi)頭
1xx(臨時(shí)響應(yīng))表示臨時(shí)響應(yīng)并需要請(qǐng)求者繼續(xù)執(zhí)行操作的狀態(tài)代碼饲趋。
- 100 (繼續(xù)) 請(qǐng)求者應(yīng)當(dāng)繼續(xù)提出請(qǐng)求拐揭。 服務(wù)器返回此代碼表示已收到請(qǐng)求的第一部分,正在等待其余部分奕塑。
- 101 (切換協(xié)議) 請(qǐng)求者已要求服務(wù)器切換協(xié)議堂污,服務(wù)器已確認(rèn)并準(zhǔn)備切換。
2開(kāi)頭
2xx (成功)表示成功處理了請(qǐng)求的狀態(tài)代碼龄砰。
- 200 (成功) 服務(wù)器已成功處理了請(qǐng)求盟猖。 通常讨衣,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁(yè)。
- 201 (已創(chuàng)建) 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源式镐。
- 202 (已接受) 服務(wù)器已接受請(qǐng)求反镇,但尚未處理。
- 203 (非授權(quán)信息) 服務(wù)器已成功處理了請(qǐng)求娘汞,但返回的信息可能來(lái)自另一來(lái)源歹茶。
- 204 (無(wú)內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容你弦。
- 205 (重置內(nèi)容) 服務(wù)器成功處理了請(qǐng)求惊豺,但沒(méi)有返回任何內(nèi)容。
- 206 (部分內(nèi)容) 服務(wù)器成功處理了部分 GET 請(qǐng)求禽作。
3開(kāi)頭
3xx (重定向) 表示要完成請(qǐng)求尸昧,需要進(jìn)一步操作。 通常旷偿,這些狀態(tài)代碼用來(lái)重定向烹俗。
- 300 (多種選擇) 針對(duì)請(qǐng)求,服務(wù)器可執(zhí)行多種操作狸捅。 服務(wù)器可根據(jù)請(qǐng)求者 (user agent) 選擇一項(xiàng)操作衷蜓,或提供操作列表供請(qǐng)求者選擇。
- 301 (永久移動(dòng)) 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置尘喝。 服務(wù)器返回此響應(yīng)(對(duì) GET 或 HEAD 請(qǐng)求的響應(yīng))時(shí)磁浇,會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。
- 302 (臨時(shí)移動(dòng)) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求朽褪,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求置吓。
- 303 (查看其他位置) 請(qǐng)求者應(yīng)當(dāng)對(duì)不同的位置使用單獨(dú)的 GET 請(qǐng)求來(lái)檢索響應(yīng)時(shí),服務(wù)器返回此代碼缔赠。
- 304 (未修改) 自從上次請(qǐng)求后衍锚,請(qǐng)求的網(wǎng)頁(yè)未修改過(guò)。 服務(wù)器返回此響應(yīng)時(shí)嗤堰,不會(huì)返回網(wǎng)頁(yè)內(nèi)容戴质。
- 305 (使用代理) 請(qǐng)求者只能使用代理訪問(wèn)請(qǐng)求的網(wǎng)頁(yè)。 如果服務(wù)器返回此響應(yīng)踢匣,還表示請(qǐng)求者應(yīng)使用代理告匠。
- 307 (臨時(shí)重定向) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求离唬。
4開(kāi)頭
4xx(請(qǐng)求錯(cuò)誤) 這些狀態(tài)代碼表示請(qǐng)求可能出錯(cuò)后专,妨礙了服務(wù)器的處理。
- 400 (錯(cuò)誤請(qǐng)求) 服務(wù)器不理解請(qǐng)求的語(yǔ)法输莺。
- 401 (未授權(quán)) 請(qǐng)求要求身份驗(yàn)證戚哎。 對(duì)于需要登錄的網(wǎng)頁(yè)裸诽,服務(wù)器可能返回此響應(yīng)。
- 403 (禁止) 服務(wù)器拒絕請(qǐng)求型凳。
- 404 (未找到) 服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)丈冬。
- 405 (方法禁用) 禁用請(qǐng)求中指定的方法。
- 406 (不接受) 無(wú)法使用請(qǐng)求的內(nèi)容特性響應(yīng)請(qǐng)求的網(wǎng)頁(yè)甘畅。
- 407 (需要代理授權(quán)) 此狀態(tài)代碼與 401(未授權(quán))類(lèi)似殷蛇,但指定請(qǐng)求者應(yīng)當(dāng)授權(quán)使用代理。
- 408 (請(qǐng)求超時(shí)) 服務(wù)器等候請(qǐng)求時(shí)發(fā)生超時(shí)橄浓。
- 409 (沖突) 服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突。 服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息亮航。
- 410 (已刪除) 如果請(qǐng)求的資源已永久刪除荸实,服務(wù)器就會(huì)返回此響應(yīng)。
- 411 (需要有效長(zhǎng)度) 服務(wù)器不接受不含有效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求缴淋。
- 412 (未滿足前提條件) 服務(wù)器未滿足請(qǐng)求者在請(qǐng)求中設(shè)置的其中一個(gè)前提條件准给。
- 413 (請(qǐng)求實(shí)體過(guò)大) 服務(wù)器無(wú)法處理請(qǐng)求,因?yàn)檎?qǐng)求實(shí)體過(guò)大重抖,超出服務(wù)器的處理能力露氮。
- 414 (請(qǐng)求的 URI 過(guò)長(zhǎng)) 請(qǐng)求的 URI(通常為網(wǎng)址)過(guò)長(zhǎng),服務(wù)器無(wú)法處理钟沛。
- 415 (不支持的媒體類(lèi)型) 請(qǐng)求的格式不受請(qǐng)求頁(yè)面的支持畔规。
- 416 (請(qǐng)求范圍不符合要求) 如果頁(yè)面無(wú)法提供請(qǐng)求的范圍,則服務(wù)器會(huì)返回此狀態(tài)代碼恨统。
- 417 (未滿足期望值) 服務(wù)器未滿足"期望"請(qǐng)求標(biāo)頭字段的要求叁扫。
5開(kāi)頭
5xx(服務(wù)器錯(cuò)誤)這些狀態(tài)代碼表示服務(wù)器在嘗試處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。 這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤畜埋,而不是請(qǐng)求出錯(cuò)莫绣。
- 500 (服務(wù)器內(nèi)部錯(cuò)誤) 服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求悠鞍。
- 501 (尚未實(shí)施) 服務(wù)器不具備完成請(qǐng)求的功能对室。 例如,服務(wù)器無(wú)法識(shí)別請(qǐng)求方法時(shí)可能會(huì)返回此代碼咖祭。
- 502 (錯(cuò)誤網(wǎng)關(guān)) 服務(wù)器作為網(wǎng)關(guān)或代理掩宜,從上游服務(wù)器收到無(wú)效響應(yīng)。
- 503 (服務(wù)不可用) 服務(wù)器目前無(wú)法使用(由于超載或停機(jī)維護(hù))心肪。 通常锭亏,這只是暫時(shí)狀態(tài)。
- 504 (網(wǎng)關(guān)超時(shí)) 服務(wù)器作為網(wǎng)關(guān)或代理硬鞍,但是沒(méi)有及時(shí)從上游服務(wù)器收到請(qǐng)求慧瘤。
- 505 (HTTP 版本不受支持) 服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本戴已。
6.http2.0
HTTP協(xié)議的第四個(gè)版本是HTTP/2.0,相對(duì)于HTTP/1.1新增了以下內(nèi)容:
1.二進(jìn)制分幀
HTTP 2.0 的所有幀都采用二進(jìn)制編碼
- 幀:客戶端與服務(wù)器通過(guò)交換幀來(lái)通信锅减,幀是基于這個(gè)新協(xié)議通信的最小單位糖儡。
- 消息:是指邏輯上的 HTTP 消息,比如請(qǐng)求怔匣、響應(yīng)等握联,由一或多個(gè)幀組成。
- 流:流是連接中的一個(gè)虛擬信道每瞒,可以承載雙向的消息金闽;每個(gè)流都有一個(gè)唯一的整數(shù)標(biāo)識(shí)符(1、2 … N)剿骨;
2.多路復(fù)用
多路復(fù)用允許同時(shí)通過(guò)單一的HTTP/2.0 連接發(fā)起多重的請(qǐng)求-響應(yīng)消息代芜。有了新的分幀機(jī)制后,HTTP/2.0不再依賴多個(gè)TCP 連接去處理更多并發(fā)的請(qǐng)求浓利。每個(gè)數(shù)據(jù)流都拆分成很多互不依賴的幀挤庇,而這些幀可以交錯(cuò)(亂序發(fā)送),還可以分優(yōu)先級(jí)贷掖。最后再在另一端根據(jù)每個(gè)幀首部的流標(biāo)識(shí)符把它們重新組合起來(lái)嫡秕。HTTP 2.0 連接都是持久化的,而且客戶端與服務(wù)器之間也只需要一個(gè)連接(每個(gè)域名一個(gè)連接)即可苹威。
3.頭部壓縮
HTTP/1.1 的首部帶有大量信息昆咽,而且每次都要重復(fù)發(fā)送。HTTP/2.0 要求通訊雙方各自緩存一份首部字段表牙甫,從而避免了重復(fù)傳輸潮改。
4.請(qǐng)求優(yōu)先級(jí)
瀏覽器可以在發(fā)現(xiàn)資源時(shí)立即分派請(qǐng)求,指定每個(gè)流的優(yōu)先級(jí)腹暖,讓服務(wù)器決定最優(yōu)的響應(yīng)次序汇在。這樣請(qǐng)求就不必排隊(duì)了,既節(jié)省了時(shí)間脏答,也最大限度地利用了每個(gè)連接糕殉。
5.服務(wù)端推送
服務(wù)端推送能把客戶端所需要的資源伴隨著index.html一起發(fā)送到客戶端,省去了客戶端重復(fù)請(qǐng)求的步驟殖告。正因?yàn)闆](méi)有發(fā)起請(qǐng)求阿蝶,建立連接等操作,所以靜態(tài)資源通過(guò)服務(wù)端推送的方式可以極大地提升速度黄绩。