主要從兩個(gè)角度來(lái)理解缀拭,計(jì)算機(jī)網(wǎng)絡(luò)和前端的角度犬耻。
一、HTTP簡(jiǎn)介
在計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議的發(fā)展史中勋乾,目前主流的HTTP1.1依舊霸占著市場(chǎng)宋下,新出的HTTP2.0正以興起之勢(shì)慢慢浮出水面,它在各大瀏覽器中的兼容性問(wèn)題還得進(jìn)一步解決辑莫。
HTTP協(xié)議又名超文本傳輸協(xié)議杨凑,只要用于從萬(wàn)維網(wǎng)服務(wù)器傳輸文本到本地瀏覽器的傳送協(xié)議。它是一個(gè)基于TCP/IP的應(yīng)用層協(xié)議摆昧,
主要特點(diǎn):
1.支持B/S和C/S模式撩满;
2.限制每次連接只能處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶端的請(qǐng)求,并收到客戶端的應(yīng)答后伺帘,就斷開(kāi)連接昭躺;
3.HTTP允許傳輸任意類(lèi)型的數(shù)據(jù)對(duì)象。傳輸?shù)念?lèi)型由content-type標(biāo)記伪嫁;
4.客戶端向服務(wù)器請(qǐng)求服務(wù)時(shí)领炫,只用發(fā)送請(qǐng)求方法和請(qǐng)求路徑。也就是常說(shuō)的輸入一個(gè)url张咳,并且告訴他我需要用get或者post方法傳輸帝洪。
5.HTTP是無(wú)記憶能力的協(xié)議,如果后面的處理需要前面的信息脚猾,則它必須重傳葱峡。
二、計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議角度
HTTP/1.1
HTTP/1.1從1997年發(fā)布到現(xiàn)在龙助,過(guò)了二十年砰奕,它仍舊是目前最流行的版本。
1.它最大的變化時(shí)引入了長(zhǎng)連接提鸟,即TCP連接默認(rèn)不關(guān)閉军援,不用再像HTTP/1.0那樣需要申明connection:keep-alive,只有當(dāng)客戶端和服務(wù)器發(fā)現(xiàn)對(duì)方一段時(shí)間沒(méi)有活動(dòng)称勋,才會(huì)關(guān)閉連接胸哥。
2.HTTP1.1還引入了管道機(jī)制,保證客戶端可以同時(shí)發(fā)送多個(gè)請(qǐng)求赡鲜,解決了客戶端只能發(fā)送一個(gè)請(qǐng)求的窘境空厌,大大提高HTTP協(xié)議的效率。
3.加入了content-length字段蝗蛙。既然現(xiàn)在TCP可以傳送多個(gè)響應(yīng)蝇庭,勢(shì)必要有一種機(jī)制醉鳖,區(qū)分?jǐn)?shù)據(jù)是屬于哪一個(gè)響應(yīng)的捡硅。content-length指定本次響應(yīng)的數(shù)據(jù)長(zhǎng)度。后面的字段就屬于下一個(gè)響應(yīng)了盗棵。
HTTP/2
2015年發(fā)布HTTP/2壮韭,它是一個(gè)徹底的二進(jìn)制協(xié)議,頭信息和數(shù)據(jù)體都是二進(jìn)制纹因,并且統(tǒng)稱(chēng)為幀喷屋。
1.多工工作方式。HTTP1.1只是解決了客戶端一個(gè)只能發(fā)送一個(gè)請(qǐng)求的問(wèn)題瞭恰,而HTTP2則讓服務(wù)器一個(gè)也能同時(shí)發(fā)送多個(gè)響應(yīng)屯曹,即到了版本2,客戶端和服務(wù)器都可以同時(shí)發(fā)送多個(gè)請(qǐng)求和響應(yīng),而且不用排隊(duì),避免了“”隊(duì)列堵塞“”恶耽。
2.二進(jìn)制協(xié)議密任。HTTP1.1的頭部信息是文本,數(shù)據(jù)部分可以是文本偷俭,也可以是二進(jìn)制編碼浪讳,而HTTP2是徹底的二進(jìn)制。
3.頭信息壓縮涌萤。HTTP2對(duì)每次的請(qǐng)求頭采用gzip壓縮淹遵,這樣避免了每次請(qǐng)求頭中重復(fù)出現(xiàn)相同的信息。
4.服務(wù)器主動(dòng)推送负溪⊥复В客戶端向服務(wù)器請(qǐng)求資源A,服務(wù)器預(yù)測(cè)客戶端可能需要B笙以,順便把B也推送給了客戶端淌实,避免了客戶端多次請(qǐng)求。
HTTPS
HTTP協(xié)議因?yàn)槭敲魑膫鬏敳螅醇用懿鹌恚瑯O其不安全,于是網(wǎng)景公司設(shè)計(jì)了SSL協(xié)議倘感,用于對(duì)HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行進(jìn)行加密放坏,從而誕生了HTTPS。后來(lái)SSL安全協(xié)議升級(jí)為了TSL協(xié)議老玛,所以現(xiàn)在的HTTPS協(xié)議用的是TSL.
三淤年、前端中的HTTP
狀態(tài)碼
請(qǐng)求方法Get和Post
GET請(qǐng)求實(shí)例:
1.0 GET http://weibo.com/signup/signup.php?inviteCode=2388493434
2.0 Host: weibo.com
3.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
POST請(qǐng)求實(shí)例:
Host: www.joes-hardware.com
Content-Type: text/plain
Content-length: 18
item=bandsaw 2647
區(qū)別
1.最直觀的區(qū)別
就是GET把參數(shù)包含在URL中,POST通過(guò)request body傳遞參數(shù)蜡豹。
2.GET請(qǐng)求會(huì)被瀏覽器主動(dòng)緩存麸粮,POST不會(huì)。
3.GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里镜廉,而POST中的參數(shù)不會(huì)被保留弄诲。
4.GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的,會(huì)受到URL長(zhǎng)度的限制娇唯,一般URL最長(zhǎng)為2KB齐遵,而POST沒(méi)有限制。
5.GET安全性明顯低于POST塔插,因?yàn)閰?shù)在URL中的暴露梗摇。
6.GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。對(duì)于GET方式的請(qǐng)求想许,瀏覽器會(huì)把http header和data一并發(fā)送出去伶授,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù));
而對(duì)于POST断序,瀏覽器先發(fā)送header,服務(wù)器響應(yīng)100 continue糜烹,瀏覽器再發(fā)送data逢倍,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))。
相同點(diǎn):
它們都是HTTP協(xié)議中發(fā)送請(qǐng)求的方法景图,HTTP的底層是TCP/IP協(xié)議较雕,因此GET和POST也是TCP/IP。
HTTP Hearder詳解
HTTP協(xié)議采用了請(qǐng)求/響應(yīng)模型挚币,就整個(gè)網(wǎng)絡(luò)資源傳輸而言亮蒋,包括message-header和message-body兩部分。先傳遞message-header妆毕,即httpheader消息慎玖。http header 消息通常被分為4個(gè)部分:general header, request header, response header, entity header。但是這種分法就理解而言笛粘,感覺(jué)界限不太明確趁怔。根據(jù)維基百科對(duì)http header內(nèi)容的組織形式,大體分為Request和Response兩部分薪前。
以新浪首頁(yè)為例
General
Request URL :Client請(qǐng)求地址
Request Method:請(qǐng)求類(lèi)型 get润努、post、put示括、delete等
Status Code:響應(yīng)狀態(tài)碼 200铺浇、404、503等
Remote Address:域名對(duì)應(yīng)的真實(shí)ip:port
Request header
Accept:客戶端/發(fā)送端能夠接收的數(shù)據(jù)類(lèi)型 text/html,application/xhtml+xml,application/xml垛膝; Accept-Encoding:瀏覽器可以支持的- web服務(wù)器返回內(nèi)容壓縮編碼類(lèi)型 gzip, deflate
Accept-Language:瀏覽器可接收的語(yǔ)言 zh-CN,zh;q=0.8
Cache-Control:請(qǐng)求和響應(yīng)遵循的緩存機(jī)制鳍侣,當(dāng)前請(qǐng)求的Cache-Control不會(huì)影響另一個(gè)請(qǐng)求的緩存處理。private(默認(rèn))吼拥、no-cache倚聚、must-revalidate、max-age凿可。這個(gè)參數(shù)有幾種不同的使用場(chǎng)景:
打開(kāi)一個(gè)新的窗口惑折。private、no-cache矿酵、must-revalidate會(huì)重新請(qǐng)求服務(wù)器; max-age在超過(guò)時(shí)間年齡值時(shí)才會(huì)重新請(qǐng)求唬复。
地址欄回車(chē)矗积。private全肮、must-revalidate只有第一次時(shí)會(huì)請(qǐng)求服務(wù)器; no-cache每次都會(huì)請(qǐng)求;max-age在超過(guò)時(shí)間年齡值時(shí)才會(huì)重新請(qǐng)求棘捣。
后退按鈕辜腺。只有no-cache每次都重新請(qǐng)求服務(wù)器。
刷新。全部重新請(qǐng)求服務(wù)器
Connection: 是否保持與服務(wù)器的tcp長(zhǎng)連接评疗。keep-alive(默認(rèn))测砂、close。Keep-alive代表服務(wù)會(huì)保留當(dāng)前連接一段時(shí)間被其他請(qǐng)求重復(fù)使用百匆;close代表請(qǐng)求之后關(guān)閉連接砌些。
Content-Length: 請(qǐng)求體的長(zhǎng)度
Content-Type: 請(qǐng)求內(nèi)容的格式/類(lèi)型 application/x-www-form-urlencoded application/json
Cookie: 客戶端緩存的Cookie,在請(qǐng)求發(fā)送時(shí)會(huì)發(fā)送到服務(wù)端
Host: 請(qǐng)求的服務(wù)器域名
Referer: 當(dāng)前請(qǐng)求的來(lái)源
User-Agent: 發(fā)出請(qǐng)求的客戶端信息 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
請(qǐng)求頭
Response header
Cache-Control:請(qǐng)求和響應(yīng)遵循的緩存機(jī)制
Connection:是否保持與服務(wù)器的tcp長(zhǎng)連接加匈。keep-alive(默認(rèn))存璃、close。Keep-alive代表服務(wù)會(huì)保留當(dāng)前連接一段時(shí)間被其他請(qǐng)求重復(fù)使用雕拼;close代表請(qǐng)求之后關(guān)閉連接纵东。
Content-Type:響應(yīng)內(nèi)容的格式/類(lèi)型text/html;charset=UTF-8標(biāo)識(shí)返回的內(nèi)容是文本類(lèi)型,html格式啥寇。
Content-Encoding:web服務(wù)器支持的返回內(nèi)容壓縮編碼類(lèi)型 gzip
Content-Language:響應(yīng)體的語(yǔ)言
Content-Length:響應(yīng)體的長(zhǎng)度
Date: 消息發(fā)出時(shí)間(GMT) Sat, 23 Apr 2016 07:47:54 GMT GMT+8=北京時(shí)間
Expires: 響應(yīng)過(guò)期時(shí)間
Transfer-Encoding:文件傳輸編碼chunked標(biāo)識(shí)傳輸內(nèi)容長(zhǎng)度不確定偎球,如果以gzip方式輸出時(shí),就不必申請(qǐng)一個(gè)很大的字節(jié)數(shù)組了辑甜,可以一塊一塊的輸出衰絮,更科學(xué),占用資源更少磷醋。
Vary: 提示使用緩存響應(yīng)還是從原始服務(wù)器請(qǐng)求岂傲,即當(dāng)緩存中存在一個(gè)未過(guò)期的響應(yīng)是否能被后續(xù)的請(qǐng)求服用,Accept-Encoding子檀、User-Agent镊掖。如果vary的值中返回了User-Agent,那么通過(guò)不同的瀏覽器打開(kāi)相同的頁(yè)面都會(huì)重新請(qǐng)求服務(wù)器褂痰;如果Vary中沒(méi)返回User-Agent亩进,那么客戶端緩存把它看成是相同的頁(yè)面,相同的請(qǐng)求缩歪,直接給用戶返回緩存的內(nèi)容归薛;如果返回的值是Accept-Encoding,將請(qǐng)求頭信息中的Accept-encoding字段的值(gzip等)作為緩存的key;如果vary的值為*表示緩存不會(huì)去做判斷匪蝙;
額外:
Form data(post)
這個(gè)版塊是在Request Method為post請(qǐng)求類(lèi)型時(shí)顯示的post表單數(shù)據(jù)主籍。
Query String Parameter(get)
這個(gè)版塊是在Request Method為get請(qǐng)求類(lèi)型時(shí)向服務(wù)端傳遞的請(qǐng)求參數(shù)。
具體reasponse和Requese的參數(shù)解釋參看:
https://kb.cnblogs.com/page/92320/
HTTP狀態(tài)碼參看
http://tool.oschina.net/commons?type=5