Http請(qǐng)求報(bào)文結(jié)構(gòu)
常用字段描述
請(qǐng)求行
請(qǐng)求行由方法字段漩氨、URL 字段 和HTTP 協(xié)議版本字段 3 個(gè)部分組成,他們之間使用空格隔開(kāi)偶垮。常用的 HTTP 請(qǐng)求方法有 GET张咳、POST帝洪、HEAD、PUT脚猾、DELETE葱峡、OPTIONS、TRACE婚陪、CONNECT;
請(qǐng)求頭部
請(qǐng)求頭部由關(guān)鍵字/值對(duì)組成族沃,每行一對(duì)频祝,關(guān)鍵字和值用英文冒號(hào)“:”分隔泌参。請(qǐng)求頭部通知服務(wù)器有關(guān)于客戶端請(qǐng)求的信息
典型的請(qǐng)求頭有:
Accept:用于告訴服務(wù)器,客戶機(jī)支持的數(shù)據(jù)類型
Accept-Charset:用于告訴服務(wù)器常空,客戶機(jī)所采用的編碼
Accept-Encoding:用于告訴服務(wù)器沽一,客戶機(jī)支持的數(shù)據(jù)壓縮格式
Accept-Language:客戶機(jī)的語(yǔ)言環(huán)境
Host:客戶機(jī)通過(guò)這個(gè)頭告訴服務(wù)器,想訪問(wèn)的主機(jī)名
If-Modified-Since:客戶機(jī)通過(guò)這個(gè)頭告訴服務(wù)器漓糙,資源的緩存時(shí)間
Referer:客戶機(jī)通過(guò)這個(gè)頭告訴服務(wù)器铣缠,它是從哪個(gè)資源來(lái)訪問(wèn)服務(wù)器的(防盜鏈)
User-Agent:客戶機(jī)通過(guò)這個(gè)頭告訴服務(wù)器,客戶機(jī)的軟件環(huán)境
Cookie:客戶機(jī)通過(guò)這個(gè)頭可以向服務(wù)器帶數(shù)據(jù)
空行
最后一個(gè)請(qǐng)求頭之后是一個(gè)空行昆禽,發(fā)送回車符和換行符蝗蛙,通知服務(wù)器以下不再有請(qǐng)求頭;
請(qǐng)求包體
請(qǐng)求包體不在 GET 方法中使用,而是在POST 方法中使用醉鳖。POST 方法適用于需要客戶填寫表單的場(chǎng)合捡硅。與請(qǐng)求包體相關(guān)的最常使用的是包體類型 Content-Type 和包體長(zhǎng)度 Content-Length;
Http響應(yīng)報(bào)文結(jié)構(gòu)
常用字段描述
狀態(tài)行
狀態(tài)行由 HTTP 協(xié)議版本字段、狀態(tài)碼和狀態(tài)碼的描述文本 3 個(gè)部分組成盗棵,他們之間使用空格隔開(kāi);
狀態(tài)碼
由三位數(shù)字組成壮韭,第一位數(shù)字表示響應(yīng)的類型,常用的狀態(tài)碼有五大類如下所示:
1xx:表示服務(wù)器已接收了客戶端請(qǐng)求纹因,客戶端可繼續(xù)發(fā)送請(qǐng)求;
2xx:表示服務(wù)器已成功接收到請(qǐng)求并進(jìn)行處理;
3xx:表示服務(wù)器要求客戶端重定向;
4xx:表示客戶端的請(qǐng)求有非法內(nèi)容;
5xx:表示服務(wù)器未能正常處理客戶端的請(qǐng)求而出現(xiàn)意外錯(cuò)誤;
響應(yīng)頭部:
典型的響應(yīng)頭部有:
Location:這個(gè)頭配合302狀態(tài)碼使用喷屋,用于告訴客戶找誰(shuí)
Server:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器服務(wù)器的類型
Content-Encoding:服務(wù)器通過(guò)這個(gè)頭瞭恰,數(shù)據(jù)的壓縮格式
Content-Length:服務(wù)器通過(guò)這個(gè)頭屯曹,告訴瀏覽器回送數(shù)據(jù)的長(zhǎng)度
Content-Type:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器回送數(shù)據(jù)的類型
Last-Modified:服務(wù)器通過(guò)這個(gè)頭惊畏,告訴瀏覽器當(dāng)前資源緩存時(shí)間
Refresh:服務(wù)器通過(guò)這個(gè)頭恶耽,告訴瀏覽器隔多長(zhǎng)時(shí)間刷新一次
Content-Disposition:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器以下載方式打開(kāi)數(shù)據(jù)
Transfer-Encoding:服務(wù)器通過(guò)這個(gè)頭陕截,告訴瀏覽器數(shù)據(jù)的傳送格式
ETag:…
Expires:服務(wù)器通過(guò)這個(gè)頭驳棱,告訴瀏覽器把回送的資源緩存多長(zhǎng)時(shí)間,-1或0农曲,則是不緩存
Cache-Control:no-cache
Pragma:no-cache 服務(wù)器通過(guò)以上兩個(gè)頭社搅,也是控制瀏覽器不要緩存數(shù)據(jù)
響應(yīng)包體
服務(wù)器返回給客戶端的文本信息;
簡(jiǎn)述Http工作原理
HTTP 協(xié)議采用請(qǐng)求/響應(yīng)模型驻债。客戶端向服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文形葬,服務(wù)器以一個(gè)狀態(tài)作為響應(yīng)合呐。
HTTP 請(qǐng)求/響應(yīng)的步驟:
1.客戶端連接到web服務(wù)器:HTTP 客戶端與web服務(wù)器建立一個(gè) TCP 連接;
2.客戶端向服務(wù)器發(fā)起 HTTP 請(qǐng)求:通過(guò)已建立的TCP 連接,客戶端向服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文;
3.服務(wù)器接收 HTTP 請(qǐng)求并返回 HTTP 響應(yīng):服務(wù)器解析請(qǐng)求笙以,定位請(qǐng)求資源淌实,服務(wù)器將資源副本寫到 TCP 連接,由客戶端讀取;
4.釋放 TCP 連接:若connection 模式為close猖腕,則服務(wù)器主動(dòng)關(guān)閉TCP 連接拆祈,客戶端被動(dòng)關(guān)閉連接,釋放TCP 連接;若connection 模式為keepalive倘感,則該連接會(huì)保持一段時(shí)間放坏,在該時(shí)間內(nèi)可以繼續(xù)接收請(qǐng)求;
例如:在瀏覽器地址欄鍵入U(xiǎn)RL,按下回車之后會(huì)經(jīng)歷以下流程:
1老玛、瀏覽器向DNS 服務(wù)器請(qǐng)求解析該 URL 中的域名所對(duì)應(yīng)的 IP 地址;
2淤年、解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80蜡豹,和服務(wù)器建立 TCP 連接;
3麸粮、瀏覽器發(fā)出讀取文件(URL 中域名后面部分對(duì)應(yīng)的文件)的HTTP 請(qǐng)求,該請(qǐng)求報(bào)文作為 TCP 三次握手的第三個(gè)報(bào)文的數(shù)據(jù)發(fā)送給服務(wù)器;
4镜廉、服務(wù)器對(duì)瀏覽器請(qǐng)求作出響應(yīng)弄诲,并把對(duì)應(yīng)的 html 文本發(fā)送給瀏覽器;
5、釋放 TCP 連接;
6桨吊、瀏覽器將該 html 文本并顯示內(nèi)容;
HTTP,HTTP2.0,SPDY,HTTPS區(qū)別
詳情可以參考這篇文章
HTTP1.0和HTTP1.1的一些區(qū)別
1. 緩存處理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires來(lái)做為緩存判斷的標(biāo)準(zhǔn)威根,HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來(lái)控制緩存策略视乐。
2. 帶寬優(yōu)化及網(wǎng)絡(luò)連接的使用
HTTP1.0中洛搀,存在一些浪費(fèi)帶寬的現(xiàn)象,例如客戶端只是需要某個(gè)對(duì)象的一部分佑淀,而服務(wù)器卻將整個(gè)對(duì)象送過(guò)來(lái)了留美,并且不支持?jǐn)帱c(diǎn)續(xù)傳功能,HTTP1.1則在請(qǐng)求頭引入了range頭域伸刃,它允許只請(qǐng)求資源的某個(gè)部分谎砾,即返回碼是206(Partial Content),這樣就方便了開(kāi)發(fā)者自由的選擇以便于充分利用帶寬和連接捧颅。
3. 錯(cuò)誤通知的管理
在HTTP1.1中新增了24個(gè)錯(cuò)誤狀態(tài)響應(yīng)碼景图,如409(Conflict)表示請(qǐng)求的資源與資源的當(dāng)前狀態(tài)發(fā)生沖突;410(Gone)表示服務(wù)器上的某個(gè)資源被永久性的刪除碉哑。
4. Host頭處理
在HTTP1.0中認(rèn)為每臺(tái)服務(wù)器都綁定一個(gè)唯一的IP地址挚币,因此亮蒋,請(qǐng)求消息中的URL并沒(méi)有傳遞主機(jī)名(hostname)。但隨著虛擬主機(jī)技術(shù)的發(fā)展妆毕,在一臺(tái)物理服務(wù)器上可以存在多個(gè)虛擬主機(jī)(Multi-homed Web Servers)慎玖,并且它們共享一個(gè)IP地址。HTTP1.1的請(qǐng)求消息和響應(yīng)消息都應(yīng)支持Host頭域笛粘,且請(qǐng)求消息中如果沒(méi)有Host頭域會(huì)報(bào)告一個(gè)錯(cuò)誤(400 Bad Request)趁怔。
5. 長(zhǎng)連接
HTTP 1.1支持長(zhǎng)連接(PersistentConnection)和請(qǐng)求的流水線(Pipelining)處理,在一個(gè)TCP連接上可以傳送多個(gè)HTTP請(qǐng)求和響應(yīng)薪前,減少了建立和關(guān)閉連接的消耗和延遲润努,在HTTP1.1中默認(rèn)開(kāi)啟Connection: keep-alive,一定程度上彌補(bǔ)了HTTP1.0每次請(qǐng)求都要?jiǎng)?chuàng)建連接的缺點(diǎn)序六。
HTTPS與HTTP的一些區(qū)別
- HTTPS協(xié)議需要到ca申請(qǐng)證書
- HTTP是超文本傳輸協(xié)議任连,信息是明文傳輸,HTTPS 則是具有安全性的ssl加密傳輸協(xié)議例诀。
- HTTP和HTTPS使用的是完全不同的連接方式,用的端口也不一樣裁着,前者是80繁涂,后者是443。
- HTTPS的連接很簡(jiǎn)單二驰,HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸扔罪、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全桶雀。
SPDY和HTTP2.0
SPDY
- 降低延遲矿酵,針對(duì)HTTP高延遲的問(wèn)題,SPDY優(yōu)雅的采取了多路復(fù)用(multiplexing)矗积。多路復(fù)用通過(guò)多個(gè)請(qǐng)求stream共享一個(gè)tcp連接的方式
- 請(qǐng)求優(yōu)先級(jí)(request prioritization)全肮。多路復(fù)用帶來(lái)一個(gè)新的問(wèn)題是,在連接共享的基礎(chǔ)之上有可能會(huì)導(dǎo)致關(guān)鍵請(qǐng)求被阻塞棘捣。SPDY允許給每個(gè)request設(shè)置優(yōu)先級(jí)辜腺,這樣重要的請(qǐng)求就會(huì)優(yōu)先得到響應(yīng)。比如瀏覽器加載首頁(yè)乍恐,首頁(yè)的html內(nèi)容應(yīng)該優(yōu)先展示评疗,之后才是各種靜態(tài)資源文件,腳本文件等加載茵烈,這樣可以保證用戶能第一時(shí)間看到網(wǎng)頁(yè)內(nèi)容百匆。
- header壓縮。前面提到HTTP1.x的header很多時(shí)候都是重復(fù)多余的呜投。選擇合適的壓縮算法可以減小包的大小和數(shù)量加匈。
- 基于HTTPS的加密協(xié)議傳輸寄症,提高了傳輸數(shù)據(jù)的可靠性。
- 服務(wù)端(server push)矩动,采用了SPDY的網(wǎng)頁(yè)有巧,例如我的網(wǎng)頁(yè)有一個(gè)sytle.css的請(qǐng)求,在客戶端收到sytle.css數(shù)據(jù)的同時(shí)悲没,服務(wù)端會(huì)將sytle.js的文件**給客戶端篮迎,當(dāng)客戶端再次嘗試獲取sytle.js時(shí)就可以直接從緩存中獲取到,不用再發(fā)請(qǐng)求了.
HTTP2.0
HTTP2.0可以說(shuō)是SPDY的升級(jí)版(其實(shí)原本也是基于SPDY設(shè)計(jì)的)示姿,但是甜橱,HTTP2.0 跟 SPDY 仍有不同的地方,主要是以下兩點(diǎn):
? HTTP2.0 支持明文 HTTP 傳輸栈戳,而 SPDY 強(qiáng)制使用 HTTPS
? HTTP2.0 消息頭的壓縮算法采用 HPACK岂傲,而非 SPDY 采用的 DEFLATE
關(guān)于http1.1 和http2.0的詳細(xì)區(qū)別分析,可以參考這篇文章