1呢袱、客戶端和服務(wù)器之間的通信
HTTP協(xié)議規(guī)定瓢姻,請(qǐng)求從客戶端發(fā)出暴氏,最后服務(wù)器端響應(yīng)該請(qǐng)求并返回延塑。
下面是一個(gè)具體示例:
1> 客戶端發(fā)送請(qǐng)求(請(qǐng)求報(bào)文):
GET /index.htm HTTP/1.1
Host: harkr.jp
2> 服務(wù)器發(fā)送響應(yīng)(響應(yīng)報(bào)文):
HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length 362
Content-Type: text/html
<html>
...
- 請(qǐng)求報(bào)文包括請(qǐng)求方法(如GET/POST等等)、請(qǐng)求URI(如/index.htm)答渔、協(xié)議版本(如HTTP/1.1)关带、可選的請(qǐng)求首部字段和內(nèi)容實(shí)體。一個(gè)更具體的請(qǐng)求報(bào)文的構(gòu)成如下:
POST /form/entry HTTP/1.1
Host: hackr.jp
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 16
name=ueno&age=37
其中沼撕,POST
是方法宋雏,/form/entry
是請(qǐng)求URI,HTTP/1.1
是協(xié)議版本號(hào)端朵,Host:.......Content-Length:16
包含的內(nèi)容是各種請(qǐng)求首部字段,接著以空行分隔燃箭,之后的內(nèi)容name=....
是內(nèi)容實(shí)體冲呢。
- 響應(yīng)報(bào)文基本由協(xié)議版本、狀態(tài)碼招狸、用以解釋狀態(tài)碼的原因短語(yǔ)敬拓、可選的響應(yīng)首部字段以及實(shí)體主體構(gòu)成。下面是一個(gè)具體的響應(yīng)報(bào)文構(gòu)成示例:
HTTP/1.1 200 OK
Date: Tue, 10,Jul 2012 06:50:15 GMT
Content-Length: 362
Content-Type: text/html
<html>
...
其中裙戏,HTTP/1.1
是協(xié)議版本乘凸,200
是狀態(tài)碼,OK
是解釋狀態(tài)碼的原因短語(yǔ)累榜,Date:.....Content-Type: text/html
是響應(yīng)首部字段营勤,接著以一空行分隔灵嫌,之后的內(nèi)容為資源實(shí)體的主體。
2葛作、HTTP是無(wú)狀態(tài)協(xié)議
HTTP協(xié)議自身不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存寿羞。也就是說(shuō)在HTTP這個(gè)級(jí)別,協(xié)議對(duì)于發(fā)送過(guò)的請(qǐng)求或響應(yīng)都不做持久化處理赂蠢。
協(xié)議本身并不保留之前一切的請(qǐng)求或響應(yīng)報(bào)文的信息绪穆,這是為了更快速地處理大量事務(wù),確保協(xié)議的可伸縮性虱岂。
但是有時(shí)期望保持狀態(tài)功能(比如玖院,用戶登錄到一家購(gòu)物網(wǎng)站,即使他跳轉(zhuǎn)到該站的其他頁(yè)面同樣希望繼續(xù)保持其登錄狀態(tài))第岖,于是引入了Cookie技術(shù)难菌。
3、HTTP方法
- GET:獲取資源
GET
方法用來(lái)請(qǐng)求訪問(wèn)已被URI識(shí)別的資源绍傲。指定的資源經(jīng)服務(wù)器端解析后返回響應(yīng)內(nèi)容扔傅。若請(qǐng)求的資源是文本,則原樣返回烫饼;若是像CGI(通用網(wǎng)關(guān)接口)那樣的程序猎塞,則返回執(zhí)行后的輸出結(jié)果。
- POST:傳輸實(shí)體主體
POST方法用來(lái)傳輸實(shí)體的主體杠纵。
eg.
請(qǐng)求:
POST /submit.cgi HTTP/1.1
Host: www.hackr.jp
Content-Length: 1560(1560字節(jié)的數(shù)據(jù))
響應(yīng):返回submit.cgi接收數(shù)據(jù)的處理結(jié)果
- PUT:傳輸文件
PUT方法用來(lái)傳輸文件荠耽。就像FTP協(xié)議的文件上傳一樣,要求在請(qǐng)求報(bào)文的主體中包含文件內(nèi)容比藻,然后保存到請(qǐng)求URI指定的位置铝量。
但是,鑒于HTTP/1.1的PUT方法自身不帶驗(yàn)證機(jī)制银亲,任何人都可以上傳文件慢叨,存在安全性問(wèn)題,因此一般的Web網(wǎng)站不使用該方法务蝠。
eg.
請(qǐng)求:
PUT /example.html HTTP/1.1
Host: www.hackr.jp
Content-Type: text/html
Content-Length: 1560(1560字節(jié)的數(shù)據(jù))
響應(yīng):響應(yīng)返回狀態(tài)碼204 No Content(比如:該html已存在于服務(wù)器上拍谐。請(qǐng)求執(zhí)行成功,只是無(wú)數(shù)據(jù)返回)
- HEAD:獲得報(bào)文首部
HEAD方法和GET方法一樣馏段,只是不返回報(bào)文主體部分轩拨。用于確認(rèn)URI的有效性及資源更新的日期時(shí)間等。
eg.
請(qǐng)求:
HEAD /index.html HTTP/1.1
Host: www.hackr.jp
響應(yīng):
返回index.html有關(guān)的響應(yīng)首部
- DELETE: 刪除文件
DELETE方法按請(qǐng)求URI刪除指定的資源院喜。是與PUT相反的方法亡蓉。
但是,同樣不帶驗(yàn)證機(jī)制喷舀,所以一般也不使用該方法砍濒。當(dāng)配合Web應(yīng)用程序的驗(yàn)證機(jī)制淋肾,或遵守REST標(biāo)準(zhǔn)時(shí)還是有可能會(huì)開(kāi)放使用的。
eg.
請(qǐng)求:
DELETE /example.html HTTP/1.1
Host: www.hackr.jp
響應(yīng):響應(yīng)返回狀態(tài)碼204 No Content(比如:該html已經(jīng)從該服務(wù)器上刪除)
- OPTIONS: 詢問(wèn)服務(wù)器支持的方法
OPTIONS方法用來(lái)查詢針對(duì)請(qǐng)求URI指定的資源支持的方法
eg.
請(qǐng)求:
OPTIONS * HTTP/1.1 // ->如果不是訪問(wèn)特定資源而是對(duì)服務(wù)器本身發(fā)起請(qǐng)求梯影,可以用一個(gè)*來(lái)代替請(qǐng)求URI
Host: www.hackr.jp
響應(yīng):
HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS(返回服務(wù)器支持的方法)
- TRACE追蹤路徑
TRACE方法是讓W(xué)eb服務(wù)器將之前的請(qǐng)求通信環(huán)回給客戶端的方法巫员。發(fā)送請(qǐng)求時(shí),在Max-Forwards首部字段中填入數(shù)值甲棍,每經(jīng)過(guò)一個(gè)服務(wù)器端將該數(shù)字減1简识,當(dāng)數(shù)值剛好減到0時(shí),就停止繼續(xù)傳輸感猛,最后接收到請(qǐng)求的服務(wù)器端則返回狀態(tài)碼200 OK 的響應(yīng)七扰。
客戶端通過(guò)TRACE方法可以查詢發(fā)送出去的請(qǐng)求是怎樣被加工修改/篡改的。這是因?yàn)榕惆祝?qǐng)求想要連接到源目標(biāo)服務(wù)器可能會(huì)通過(guò)代理服務(wù)器中轉(zhuǎn)颈走,TRACE方法就是用來(lái)確認(rèn)連接過(guò)程中發(fā)生的一系列操作。
但是咱士,TRACE方法本來(lái)就不怎么常用立由,再加上它容易引發(fā)XST(跨站追蹤)攻擊,通常就更不會(huì)用到了序厉。
- CONNECT: 要求用隧道協(xié)議連接代理
CONNECT方法要求在與代理服務(wù)器通信時(shí)建立隧道锐膜,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行TCP通信。主要使用SSL(安全套接層)和TLS(傳輸層安全)協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸弛房。
CONNECT方法的格式如下:
CONNECT 代理服務(wù)器名:端口號(hào) HTTP版本
eg.
請(qǐng)求:
CONNECT proxy.hackr.jp:8080 HTTP/1.1
Host; proxy.hackr.jp
響應(yīng):HTTP/1.1 200 OK(之后進(jìn)入網(wǎng)絡(luò)隧道)
4道盏、持久連接
HTTP協(xié)議的初始版本中,每進(jìn)行一次HTTP通信就要斷開(kāi)一次TCP連接文捶。因此荷逞,每次的請(qǐng)求都會(huì)造成無(wú)謂的TCP連接建立和斷開(kāi),增加通信量的開(kāi)銷粹排。
所以种远,為了解決該問(wèn)題,HTTP/1.1和一部分的HTTP/1.0想出了持久連接(HTTP Persistent Connections顽耳,也稱為HTTP keep-alive或HTTP connection reuse)的方法坠敷。
特點(diǎn)是,只要任意一端沒(méi)有明確提出斷開(kāi)連接斧抱,則保持TCP連接狀態(tài)常拓。旨在建立一次TCP連接后進(jìn)行多次請(qǐng)求和響應(yīng)的交互渐溶。
好處在于:減少了TCP連接的重復(fù)建立和斷開(kāi)所造成的額外開(kāi)銷辉浦,減輕了服務(wù)器端的負(fù)載。另外茎辐,減少開(kāi)銷的那部分時(shí)間宪郊,使HTTP請(qǐng)求和響應(yīng)能夠更早地結(jié)束掂恕,這樣Web頁(yè)面的顯示速度就相應(yīng)提高了。
在HTTP/1.1中弛槐,所有的連接都是默認(rèn)持久連接懊亡。
- 管線化:持久連接是的多數(shù)請(qǐng)求以管線化方式發(fā)送。即同時(shí)并行發(fā)送多個(gè)請(qǐng)求乎串,而不需要一個(gè)接一個(gè)地等待響應(yīng)了店枣。
5、Cookie技術(shù)
Cookie技術(shù)通過(guò)在請(qǐng)求和響應(yīng)報(bào)文中寫入Cookie信息來(lái)控制客戶端的狀態(tài)叹誉。
Cookie會(huì)根據(jù)從服務(wù)器端發(fā)送的響應(yīng)報(bào)文內(nèi)的一個(gè)叫做Set-Cookie的首部字段信息鸯两,通知客戶端保存Cookie。當(dāng)下次客戶端再往該服務(wù)器發(fā)送請(qǐng)求時(shí)长豁,客戶端會(huì)自動(dòng)在請(qǐng)求報(bào)文中加入Cookie值后發(fā)送出去钧唐。服務(wù)器端發(fā)現(xiàn)客戶端發(fā)送過(guò)來(lái)的Cookie后,會(huì)檢查是從哪一個(gè)客戶端發(fā)來(lái)是連接請(qǐng)求匠襟,然后對(duì)比服務(wù)器上的記錄钝侠,最后得到之前的狀態(tài)信息。
Cookie交互示例:
1> 請(qǐng)求報(bào)文(沒(méi)有Cookie信息的狀態(tài))
GET /reader/ HTTP/1.1
Host: hackr.jp //首部字段內(nèi)沒(méi)有Cookie的相關(guān)信息
2> 響應(yīng)報(bào)文(服務(wù)器端生成Cookie信息)
HTTP/1.1 200 OK
Date: Tue, 10,Jul 2012 06:50:15 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed,=>10-Oct-12 06:50:15 GMT>
Content-Type: text/plain; charset=UTF-8;
3> 請(qǐng)求報(bào)文(自動(dòng)發(fā)送保存著的Cookie信息)
GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=1342077140226724
##6酸舍、多部分對(duì)象集合及范圍請(qǐng)求
- 多部分對(duì)象集合
發(fā)送的一份報(bào)文主體內(nèi)可能含有多種類型實(shí)體帅韧,比如:文本、圖片父腕、視頻等弱匪。
多部分對(duì)象集合包含的對(duì)象有:`multipart/form-data`(在Web表單文件上傳時(shí)使用)和`multipart/byterangees`(狀態(tài)碼206(Partial Content,部分內(nèi)容)響應(yīng)報(bào)文包含了多個(gè)范圍的內(nèi)容時(shí)使用)
- 范圍請(qǐng)求
從之前下載中斷處恢復(fù)下載需要指定下載的實(shí)體范圍璧亮,像這樣指定范圍發(fā)送請(qǐng)求叫做范圍請(qǐng)求萧诫。例如,對(duì)一份10000字節(jié)大小的資源枝嘶,如果使用范圍請(qǐng)求帘饶,可以只請(qǐng)求5001-10000字節(jié)內(nèi)的資源。只想范圍請(qǐng)求時(shí)群扶,會(huì)用到首部字段Range來(lái)指定資源的byte范圍及刻。指定形式如下:
Range: bytes=5001-10000 //5001-10000字節(jié)
Range: bytes=5001- //從5001字節(jié)之后全部的
Range: bytes=-3000, 5000-7000 //從一開(kāi)始到3000字節(jié)和5000-7000字節(jié)的多重范圍
##7、內(nèi)容協(xié)商
內(nèi)容協(xié)商機(jī)制是指客戶端和服務(wù)器就響應(yīng)的資源內(nèi)容進(jìn)行交涉竞阐,然后提供給客戶端最為適合的資源缴饭。內(nèi)容協(xié)商會(huì)以響應(yīng)資源的語(yǔ)言、字符集骆莹、編碼方式等作為判斷的基準(zhǔn)颗搂。
有3中類型:
- 服務(wù)器驅(qū)動(dòng)協(xié)商
- 客戶端驅(qū)動(dòng)協(xié)商
- 透明協(xié)商
##8、HTTP狀態(tài)碼
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/5121212-465389c7aa411045.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
經(jīng)常使用的狀態(tài)碼有14種:
- 200 OK
表示從客戶端發(fā)來(lái)的請(qǐng)求在服務(wù)器端被正常處理了幕垦。
- 204 No Content
代表服務(wù)器接收的請(qǐng)求已經(jīng)處理成功丢氢,但在返回的響應(yīng)報(bào)文中不含實(shí)體的主體部分傅联。另外,也不允許返回任何實(shí)體的主體疚察。
- 206 Partial Content
表示客戶端進(jìn)行了范圍請(qǐng)求蒸走,而服務(wù)器成功執(zhí)行了這部分的GET請(qǐng)求。響應(yīng)報(bào)文中包含由Content-Range指定范圍的實(shí)體內(nèi)容貌嫡。
- 301 Moved Permanently
永久性重定向比驻。表示請(qǐng)求的資源已被分配了新的URI,以后使用資源現(xiàn)在所指的URI岛抄。
- 302 Found
臨時(shí)性重定向嫁艇。表示請(qǐng)求的資源已被分配了新的URI(臨時(shí)性質(zhì)的),希望用戶(本次)使用新的URI訪問(wèn)弦撩。
- 303 See Other
表示請(qǐng)求對(duì)應(yīng)的資源存在著另一個(gè)URI步咪,(明確表示)應(yīng)使用GET方法定向獲取請(qǐng)求的資源。
- 304 Not Modified
表示客戶端發(fā)送*附帶條件的請(qǐng)求*(附帶條件的請(qǐng)求是指GET方法的請(qǐng)求報(bào)文中包含If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since中任一首部)時(shí)益楼,服務(wù)器端允許請(qǐng)求訪問(wèn)資源猾漫,但因發(fā)生請(qǐng)求未滿足條件的情況后,直接返回304 Not Modified(服務(wù)器資源未改變感凤,可直接使用客戶端未過(guò)期的緩存)悯周。304狀態(tài)碼返回時(shí),不包含任何響應(yīng)的主體部分陪竿。304和重定向沒(méi)有關(guān)系禽翼。
- 307 Temporary Redirect
臨時(shí)重定向。與302 Found有著相同的含義族跛。
- 400 Bad Request
該狀態(tài)碼表示請(qǐng)求報(bào)文中存在語(yǔ)法錯(cuò)誤闰挡。當(dāng)錯(cuò)誤發(fā)生時(shí),需修改請(qǐng)求的內(nèi)容后再次發(fā)送請(qǐng)求礁哄。另外长酗,瀏覽器會(huì)像200 OK一樣對(duì)待該狀態(tài)碼。
- 401 Unauthorized
表示發(fā)送的請(qǐng)求需要有通過(guò)HTTP認(rèn)證(BASIC 認(rèn)證桐绒、DIGEST 認(rèn)證)的認(rèn)證信息夺脾。另外若之前已進(jìn)行過(guò)1次請(qǐng)求,則表示用戶認(rèn)證失敗茉继。
當(dāng)瀏覽器初次接收到401響應(yīng)咧叭,會(huì)彈出認(rèn)證用的對(duì)話窗口。
- 403 Forbidden
表明對(duì)請(qǐng)求資源的訪問(wèn)被服務(wù)器拒絕了烁竭。比如未獲得文件系統(tǒng)的訪問(wèn)授權(quán)菲茬,訪問(wèn)權(quán)限出現(xiàn)某些問(wèn)題(從未授權(quán)的發(fā)送源IP地址試圖訪問(wèn))等情況都可能發(fā)生403。
- 404 Not Found
表明服務(wù)器上無(wú)法找到請(qǐng)求的資源。除此之外生均,也可以在服務(wù)器端拒絕請(qǐng)求且不想說(shuō)明理由時(shí)使用。
- 500 Internal Server Error
表明服務(wù)器端在執(zhí)行請(qǐng)求時(shí)發(fā)生了錯(cuò)誤腥刹。也有可能是Web應(yīng)用存在的BUG或某些臨時(shí)的故障马胧。
- 503 Service Unavailable
表明服務(wù)器暫時(shí)處于超負(fù)載或正在進(jìn)行停機(jī)維護(hù),現(xiàn)在無(wú)法處理請(qǐng)求衔峰。
**狀態(tài)碼和狀況的不一致**:不少返回的狀態(tài)碼響應(yīng)是錯(cuò)誤的佩脊。但是用戶可能察覺(jué)不到。比如Web應(yīng)用程序內(nèi)部發(fā)生錯(cuò)誤垫卤,狀態(tài)碼依然返回200 OK威彰,這種情況也經(jīng)常遇到。