第一篇:HTTP協(xié)議學(xué)習(xí)心得體會(huì)
HTTP協(xié)議學(xué)習(xí)心得體會(huì)
HTTP(HyperText Transfer Protocol)
====================================
是TCP/IP協(xié)議集中的一個(gè)應(yīng)用層協(xié)議,用于定義瀏覽器和Web服務(wù)器之間交換數(shù)據(jù)的過程以及數(shù)據(jù)本身的格式?,F(xiàn)在被廣泛使用的是HTTP1.1,相對(duì)于1.0,1.1的最大特點(diǎn)是支持持續(xù)連接。
基于HTTP1.0協(xié)議的客戶機(jī)與服務(wù)器的信息交換過程包括四個(gè)步驟:建立連接;發(fā)送請(qǐng)求信息;回送響應(yīng)信息;關(guān)閉連接。
通信過程總是通過瀏覽器發(fā)送請(qǐng)求來啟動(dòng)的,Web服務(wù)器則是被動(dòng)地對(duì)這些請(qǐng)求作出響應(yīng)。HTTP協(xié)議是無狀態(tài)的。
HTTP1.1與HTTP1.0的比較
------
HTTP1.0規(guī)定瀏覽器與服務(wù)器只保持短暫的連接,瀏覽器的每次請(qǐng)求都需要與服務(wù)器建立一個(gè)TCP連接,服務(wù)器完成請(qǐng)求處理后立即斷開TCP連接。服務(wù)器不跟蹤每個(gè)客戶機(jī),也不記錄過去的請(qǐng)求。為了克服HTTP1.0的這個(gè)缺陷,HTTP1.1支持持久連接,在一個(gè)TCP連接上可以傳送多個(gè)HTTP請(qǐng)求和響應(yīng),減少了建立和關(guān)閉連接的消耗和延遲。HTTP1.1還允許客戶端不用等待上一次請(qǐng)求結(jié)果返回,就可以發(fā)送下一次請(qǐng)求,但服務(wù)器端必須按照接受到客戶端請(qǐng)求的先后順序依次回送響應(yīng)結(jié)果,以保證客戶端能夠區(qū)分出每次請(qǐng)求的響應(yīng)內(nèi)容。
HTTP1.1還增加了host請(qǐng)求頭字段,用于明確表示訪問服務(wù)器上的哪個(gè)web站點(diǎn),可以在一個(gè)IP地址和端口號(hào)上使用不同的主機(jī)名來創(chuàng)建多個(gè)虛擬web站點(diǎn)。HTTP1.1還有keep-alive請(qǐng)求頭來支持持續(xù)連接。
HTTP消息的格式
-----------------------
一個(gè)完整的請(qǐng)求消息包括:一個(gè)請(qǐng)求行,若干消息頭,以及實(shí)體內(nèi)容,其中消息頭和實(shí)體內(nèi)容都是可選的。消息頭和實(shí)體內(nèi)容之間要用空行隔開。瀏覽器使用GET方式的請(qǐng)求消息可以放松不含實(shí)體內(nèi)容的請(qǐng)求消息。只有使用POST, PUT, DELETE方式的請(qǐng)求消息中才可以包含實(shí)體內(nèi)容。
Hypertext Transfer Protocol
GET / HTTP/1.1rn
Request Method: GET
Request URI: /
Request Version: HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap,application/x-shockwave-flash, application/vnd.ms-excel, application/vn
Accept-Language: zh-cnrn
UA-CPU: x86rn
Accept-Encoding: gzip, deflatern
User-Agent: Mozilla/4.0(compatible;MSIE 7.0;Windows NT 6.0;SLCC1;.NET CLR
2.0.50727;.NET CLR 3.0.04506)rn
Connection: Keep-Alivern
rn
一個(gè)完整的響應(yīng)消息包括:一個(gè)狀態(tài)行,若干消息頭,以及實(shí)體內(nèi)容。同樣,消息頭和實(shí)體內(nèi)容都是可選的。消息頭和實(shí)體內(nèi)容之間要用空行隔開。消息響應(yīng)的實(shí)體內(nèi)容就是網(wǎng)頁文檔的內(nèi)容。
Hypertext Transfer Protocol
HTTP/1.1 200 OKrn
Request Version: HTTP/1.1
Response Code: 200
Cache-Control: privatern
Content-Type: text/html;charset=UTF-8rn
Set-Cookie:
PREF=ID=7f53f6f0b1511417:NW=1:TM=1205568884:LM=1205568884:S=zHreYqNC-Z3rmOc6;expires=Mon, 15-Mar-2010 08:14:44 GMT;path=/;domain=.google.cnrn
Content-Encoding: gziprn
Server: gwsrn
Transfer-Encoding: chunkedrn
Date: Sat, 15 Mar 2008 08:14:44 GMTrn
rn
HTTP chunked response
Data chunk(1025 octets)
Chunk size: 1025 octets
Data(1025 bytes)
HTTP消息頭
----------------
HTTP請(qǐng)求和響應(yīng)都使用消息頭來描述HTTP消息本身的信息,可以實(shí)現(xiàn)HTTP客戶機(jī)與服務(wù)器之間的條件請(qǐng)求和應(yīng)答。
消息頭可以分為:通用消息頭,請(qǐng)求頭,響應(yīng)頭,實(shí)體頭四類。
請(qǐng)求行與狀態(tài)行
-----------------------
請(qǐng)求消息的請(qǐng)求行包括三個(gè)部分:請(qǐng)求方式,資源路徑,以及使用的HTTP版本。如:GET /
HTTP/1.1rn。
響應(yīng)消息的狀態(tài)行包括三個(gè)部分:HTTP協(xié)議的版本號(hào),一個(gè)表示成功或者失敗的整數(shù)代碼(狀態(tài)碼)和對(duì)狀態(tài)碼進(jìn)行描述的文本信息。如:HTTP/1.1 200 OKrn。
使用GET和POST方式傳遞參數(shù)
-------------
在URL地址后面可以附加一些參數(shù),每個(gè)參數(shù)由參數(shù)名和參數(shù)值組成,例如:當(dāng)使用GET方式提交表單內(nèi)容時(shí),瀏覽器將各個(gè)表單字段元素及其數(shù)據(jù)按照URL參數(shù)的格式附加在請(qǐng)求行中的資源路徑后面。使用GET方式傳送的數(shù)據(jù)量有限制,一般在1KB以下。
當(dāng)使用POST方式提交表單內(nèi)容時(shí),瀏覽器將個(gè)表單字段元素及其數(shù)據(jù)作為HTTP消息的實(shí)體內(nèi)容發(fā)送給服務(wù)器。因此數(shù)據(jù)量可以比GET方式大的多。使用POST方式時(shí),還必須將Content-Type消息頭設(shè)置為“application/x-www-form-urlencoded”,將Content-length消息頭設(shè)置為實(shí)體內(nèi)容的長(zhǎng)度。
響應(yīng)狀態(tài)碼
---------------
1.100~199: 成功接受請(qǐng)求,要求客戶端繼續(xù)提交下一次請(qǐng)求才能完成整個(gè)處理過程。
2.200~299: 成功接受請(qǐng)求并已完成整個(gè)處理過程。
3.300~399: 為完成請(qǐng)求,客戶端需要進(jìn)一步細(xì)化請(qǐng)求。
4.400~499: 客戶端的請(qǐng)求有錯(cuò)誤。
5.500~599: 服務(wù)器段出現(xiàn)錯(cuò)誤。
通用信息頭
==============
即能用于請(qǐng)求消息,也能用于響應(yīng)消息,包括一些與被傳輸?shù)膶?shí)體內(nèi)容沒有關(guān)系的常用消息頭字段。
1.Cache-Control
2.Connection
3.Date
4.Pragma
5.Trailer
6.Transfer-Encoding
7.Upgrade
8.Via
9.Warning
Cache-Control
--------------------
如果位于請(qǐng)求消息頭,用于通知位于客戶機(jī)和服務(wù)之間的代理服務(wù)器如何使用已緩存的頁面,可以取值為:no-cache, no-store, max-age, max-stale, min-fresh, no-transform, only-if-cached等。
如果位于響應(yīng)消息頭,用于通知客戶機(jī)和代理服務(wù)器如何緩存該頁面,可以取值為:public, private, no-cache, no-store, no-transform, must-revalidate, proxy-revalidate, max-age, s-maxage等。
Connection
---------------
用于指定處理完本次請(qǐng)求/響應(yīng)后,客戶端與服務(wù)器是否還要繼續(xù)保持連接。如果為Keep-Alive,則保持連接,如果為close,則關(guān)閉。HTTP1.1默認(rèn)采用持久連接。
Date
---------
表示HTTP消息產(chǎn)生的當(dāng)前時(shí)間。服務(wù)器回送的正常響應(yīng)消息中,應(yīng)該總是設(shè)置Date頭字段。如果客戶機(jī)發(fā)送的請(qǐng)求消息中包含有實(shí)體內(nèi)容,也要設(shè)置Date。
Pragma
------------
只能固定為no-cache.Trailer
-----------
一些頭字段可以放置在整個(gè)HTTP消息的尾部。
Transfer-Encoding
---------------------
指定傳輸編碼方式,目前標(biāo)準(zhǔn)的設(shè)置值只有chunked,用于把整個(gè)消息分成一連串的分段后進(jìn)行傳輸。
Upgrade
------------
允許客戶機(jī)指定它所支持并希望將當(dāng)前協(xié)議切換到的通信協(xié)議。
Via
-----
用于指定HTTP消息所途徑的中介代理服務(wù)器名稱和所使用的協(xié)議。
請(qǐng)求頭
=========
客戶端可以接受的數(shù)據(jù)類型,壓縮方法,語言,以及發(fā)出請(qǐng)求的超鏈接所屬頁面的URL地址等信息。Accept:指出客戶端程序能夠處理的MIME類型。
Accept-Charset:用于指出客戶端程序可以使用的字符集。
Accept-Encoding:客戶機(jī)能夠進(jìn)行解碼的數(shù)據(jù)編碼方式。
Accept-Language:指定客戶機(jī)期望服務(wù)器返回哪個(gè)國(guó)家語言的文檔。
Authorization:兩種認(rèn)證方式BASIC,和DIGEST.Except:
From:
Host: 指定資源所在的主機(jī)號(hào)和端口號(hào)。HTTP1.1中每個(gè)請(qǐng)求消息中都必須包含Host請(qǐng)求字段。If-Match:
If-Modified-Since:
If-None-Match:
If-Range
If-Unmodified-Since
Max-Forwards:
Proxy-Authorization:
Range:
Referer: 當(dāng)單擊另一個(gè)網(wǎng)頁上的超鏈接時(shí)發(fā)出的請(qǐng)求在Referer字段中指定URL。
TE:
User-Agent:
響應(yīng)頭
==========
Accept-Range, Age, Etag,Location: 用于通知客戶機(jī)應(yīng)當(dāng)?shù)侥膫€(gè)新的地址去獲取文檔。狀態(tài)碼為300~399的響應(yīng)消息都應(yīng)該使用Location字段將新的文檔地址告訴客戶機(jī),以便客戶機(jī)自動(dòng)重新連接到新地址并檢索新文檔。使用Location頭的HTTP消息不應(yīng)該有實(shí)體內(nèi)容。所以,HTTP消息頭中不能同時(shí)出現(xiàn)Location和Content-Type這兩個(gè)頭字段。
Proxy-Authenticate,Retry-After, Server, Vary, WWW-Authenticate。
實(shí)體頭
========
是實(shí)體內(nèi)容的元信息,描述了實(shí)體內(nèi)容的屬性,包括實(shí)體信息類型、長(zhǎng)度、壓縮方法、最后一次修改時(shí)間、數(shù)據(jù)有效期等。
Allow: 指定客戶端請(qǐng)求的資源所支持的請(qǐng)求方法(如GET,POST等)。
Content-Encoding: 指定實(shí)體內(nèi)容的壓縮編碼方式。
Content-Language:
Content-Length: 用于表示實(shí)體內(nèi)容的長(zhǎng)度(字節(jié)數(shù)),瀏覽器與Web服務(wù)器之間使用持久連接時(shí),這個(gè)字段在非Chunked傳輸編碼的響應(yīng)消息中是必不可少的。
Content-Location: 指定響應(yīng)消息中所封裝的實(shí)體內(nèi)容的實(shí)際位置路徑。
Content-MD5, Content-Range, Content-Type
Expires: 指定當(dāng)前文檔應(yīng)該在什么時(shí)候被認(rèn)為過期,瀏覽器到哪個(gè)時(shí)候以后不能再繼續(xù)使用本地緩存,而是在有需要時(shí)應(yīng)該像服務(wù)器發(fā)出新的請(qǐng)求訪問。
Last-Modified:文檔的最后更改時(shí)間。
擴(kuò)展頭
========
現(xiàn)在流行的瀏覽器實(shí)際上都支持Cookie,Set-Cookie,Refresh和Content-Disposition等幾個(gè)常用的擴(kuò)展頭字段。
Refresh: 告訴瀏覽器多少秒后自動(dòng)刷新頁面。
第二篇:http協(xié)議介紹(模版)
(二)召開會(huì)議
民主生活會(huì)上,班子成員要緊緊圍繞主題和征求到的意見建議,認(rèn)真開展黨性分析,深入查找問題,實(shí)事求是開展批評(píng)與自我批評(píng)。順序?yàn)橄劝嘧?、后個(gè)人,先主要負(fù)責(zé)人、后其他班子成員。黨組織書記要對(duì)班子成員的發(fā)言逐個(gè)進(jìn)行評(píng)議,班子成員之間也要互相進(jìn)行評(píng)議,幫助查找存在的問題,提出改進(jìn)的意見建議。
(三)會(huì)后工作。
領(lǐng)導(dǎo)班子要針對(duì)群眾普遍關(guān)心、反映強(qiáng)烈和民主生活會(huì)上查找出來的問題,提出切實(shí)有效的整改措施,明確具體責(zé)任人和整改時(shí)限。班子成員也要制定和落實(shí)個(gè)人整改措施。本次民主生活會(huì)形成的整改措施和干部群眾對(duì)上次民主生活會(huì)形成的整改落實(shí)情況的滿意度,會(huì)后要在一定范圍向干部群眾通報(bào),確保整改措施落到實(shí)處。會(huì)后6天內(nèi)上報(bào)民主生活會(huì)情況報(bào)告,報(bào)告要附有會(huì)前征求到的干部群眾意見材料、會(huì)后制定的整改措施。
六、會(huì)議要求
(一)召開民主生活會(huì),提前10天向街道黨工委報(bào)告,主動(dòng)接受指導(dǎo)和監(jiān)督。
(二)制定落實(shí)整改措施。民主生活會(huì)后,辦公室、黨員領(lǐng)導(dǎo)領(lǐng)導(dǎo)干部要根據(jù)民主生活會(huì)情況,進(jìn)一步查找問題,逐項(xiàng)研究,深入分析,制定出切實(shí)可行的整改措施和方案。同時(shí)要把學(xué)習(xí)貫徹黨的十七大精神同同履行崗位職責(zé)結(jié)合起來,切實(shí)轉(zhuǎn)變作風(fēng),做好本職工作,提高工作效率和和工作水平,發(fā)揮好黨員領(lǐng)導(dǎo)干部表率帶動(dòng)作用。
(三)上報(bào)民主生活會(huì)情況。召開民主生活會(huì)的情況、原始記錄、會(huì)前征求意見、整改措施和方案及上次民主生活會(huì)整改措施落實(shí)情況,要及時(shí)上報(bào)街道黨工委備案。
第三篇:常用的HTTP協(xié)議狀態(tài)碼
常用的HTTP協(xié)議狀態(tài)碼
200Standard response for successful HTTP requests.301This and all future requests should be directed to the given.403forbidden request(matches a deny filter)=> HTTP 403
Not Found,服務(wù)器找不到請(qǐng)求的頁面。
Internal Server Error(內(nèi)部服務(wù)器錯(cuò)誤)
A generic error message, given when no more specific message is suitable.502the server returned an invalid or incomplete response => HTTP 502
Service Unavailable(服務(wù)當(dāng)前不可用),可能因?yàn)槌d或停機(jī)維護(hù)。
The server is currently unavailable(because it is overloaded or down for maintenance).504the server failed to reply in time => HTTP 504
-The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.更多:
一些常見HTTP狀態(tài)碼為: 200 – 服務(wù)器成功返回網(wǎng)頁 404 – 請(qǐng)求的網(wǎng)頁不存在 503 – 服務(wù)不可用 常見HTTP狀態(tài)碼大全
1xx(臨時(shí)響應(yīng))
表示臨時(shí)響應(yīng)并需要請(qǐng)求者繼續(xù)執(zhí)行操作的狀態(tài)代碼。
代碼 說明
http狀態(tài)碼 100(繼續(xù))請(qǐng)求者應(yīng)當(dāng)繼續(xù)提出請(qǐng)求。服務(wù)器返回此代碼表示已收到請(qǐng)求的第一部分,正在等待其余部分。
http狀態(tài)碼 101(切換協(xié)議)請(qǐng)求者已要求服務(wù)器切換協(xié)議,服務(wù)器已確認(rèn)并準(zhǔn)備切換。
2xx(成功)
表示成功處理了請(qǐng)求的狀態(tài)代碼。代碼 說明
http狀態(tài)碼 200(成功)服務(wù)器已成功處理了請(qǐng)求。通常,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁。
http狀態(tài)碼 201(已創(chuàng)建)請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源。http狀態(tài)碼 202(已接受)服務(wù)器已接受請(qǐng)求,但尚未處理。
http狀態(tài)碼 203(非授權(quán)信息)服務(wù)器已成功處理了請(qǐng)求,但返回的信息可能來自另一來源。
http狀態(tài)碼 204(無內(nèi)容)服務(wù)器成功處理了請(qǐng)求,但沒有返回任何內(nèi)容。http狀態(tài)碼 205(重置內(nèi)容)服務(wù)器成功處理了請(qǐng)求,但沒有返回任何內(nèi)容。http狀態(tài)碼 206(部分內(nèi)容)服務(wù)器成功處理了部分 GET 請(qǐng)求。3xx(重定向)
表示要完成請(qǐng)求,需要進(jìn)一步操作。通常,這些狀態(tài)代碼用來重定向。代碼 說明
http狀態(tài)碼 300(多種選擇)針對(duì)請(qǐng)求,服務(wù)器可執(zhí)行多種操作。服務(wù)器可根據(jù)請(qǐng)求者(user agent)選擇一項(xiàng)操作,或提供操作列表供請(qǐng)求者選擇。http狀態(tài)碼 301(永久移動(dòng))請(qǐng)求的網(wǎng)頁已永久移動(dòng)到新位置。服務(wù)器返回此響應(yīng)(對(duì) GET 或 HEAD 請(qǐng)求的響應(yīng))時(shí),會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。http狀態(tài)碼 302(臨時(shí)移動(dòng))服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求。
http狀態(tài)碼 303(查看其他位置)請(qǐng)求者應(yīng)當(dāng)對(duì)不同的位置使用單獨(dú)的 GET 請(qǐng)求來檢索響應(yīng)時(shí),服務(wù)器返回此代碼。
http狀態(tài)碼 304(未修改)自從上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁未修改過。服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁內(nèi)容。http狀態(tài)碼 305(使用代理)請(qǐng)求者只能使用代理訪問請(qǐng)求的網(wǎng)頁。如果服務(wù)器返回此響應(yīng),還表示請(qǐng)求者應(yīng)使用代理。
http狀態(tài)碼 307(臨時(shí)重定向)服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求。4xx(請(qǐng)求錯(cuò)誤)
這些狀態(tài)代碼表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。
代碼 說明
http狀態(tài)碼 400(錯(cuò)誤請(qǐng)求)服務(wù)器不理解請(qǐng)求的語法。
http狀態(tài)碼 401(未授權(quán))請(qǐng)求要求身份驗(yàn)證。對(duì)于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)。
http狀態(tài)碼 403(禁止)服務(wù)器拒絕請(qǐng)求。
http狀態(tài)碼 404(未找到)服務(wù)器找不到請(qǐng)求的網(wǎng)頁。http狀態(tài)碼 405(方法禁用)禁用請(qǐng)求中指定的方法。
http狀態(tài)碼 406(不接受)無法使用請(qǐng)求的內(nèi)容特性響應(yīng)請(qǐng)求的網(wǎng)頁。http狀態(tài)碼 407(需要代理授權(quán))此狀態(tài)代碼與 401(未授權(quán))類似,但指定請(qǐng)求者應(yīng)當(dāng)授權(quán)使用代理。
http狀態(tài)碼 408(請(qǐng)求超時(shí))服務(wù)器等候請(qǐng)求時(shí)發(fā)生超時(shí)。
http狀態(tài)碼 409(沖突)服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突。服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息。
http狀態(tài)碼 410(已刪除)如果請(qǐng)求的資源已永久刪除,服務(wù)器就會(huì)返回此響應(yīng)。
http狀態(tài)碼 411(需要有效長(zhǎng)度)服務(wù)器不接受不含有效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求。
http狀態(tài)碼 412(未滿足前提條件)服務(wù)器未滿足請(qǐng)求者在請(qǐng)求中設(shè)置的其中一個(gè)前提條件。
http狀態(tài)碼 413(請(qǐng)求實(shí)體過大)服務(wù)器無法處理請(qǐng)求,因?yàn)檎?qǐng)求實(shí)體過大,超出服務(wù)器的處理能力。
http狀態(tài)碼 414(請(qǐng)求的 URI 過長(zhǎng))請(qǐng)求的 URI(通常為網(wǎng)址)過長(zhǎng),服務(wù)器無法處理。
http狀態(tài)碼 415(不支持的媒體類型)請(qǐng)求的格式不受請(qǐng)求頁面的支持。http狀態(tài)碼 416(請(qǐng)求范圍不符合要求)如果頁面無法提供請(qǐng)求的范圍,則服務(wù)器會(huì)返回此狀態(tài)代碼。
http狀態(tài)碼 417(未滿足期望值)服務(wù)器未滿足”期望”請(qǐng)求標(biāo)頭字段的要求。
5xx(服務(wù)器錯(cuò)誤)
這些狀態(tài)代碼表示服務(wù)器在嘗試處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤,而不是請(qǐng)求出錯(cuò)。
代碼 說明
http狀態(tài)碼 500(服務(wù)器內(nèi)部錯(cuò)誤)服務(wù)器遇到錯(cuò)誤,無法完成請(qǐng)求。http狀態(tài)碼 501(尚未實(shí)施)服務(wù)器不具備完成請(qǐng)求的功能。例如,服務(wù)器無法識(shí)別請(qǐng)求方法時(shí)可能會(huì)返回此代碼。http狀態(tài)碼 502(錯(cuò)誤網(wǎng)關(guān))服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無效響應(yīng)。
http狀態(tài)碼 503(服務(wù)不可用)服務(wù)器目前無法使用(由于超載或停機(jī)維護(hù))。通常,這只是暫時(shí)狀態(tài)。
http狀態(tài)碼 504(網(wǎng)關(guān)超時(shí))服務(wù)器作為網(wǎng)關(guān)或代理,但是沒有及時(shí)從上游服務(wù)器收到請(qǐng)求。
http狀態(tài)碼 505(HTTP 版本不受支持)服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本
第四篇:HTTP協(xié)議以及Python開發(fā)技巧
TTPYTHONhttp協(xié)議的相關(guān)知識(shí)應(yīng)該都很清楚,這里簡(jiǎn)單回顧下其流程。首先HTTP底層是利用TCP進(jìn)行通訊的;其次,HTTP本身協(xié)議是面向無連接的:限制每次連接只處理一個(gè)請(qǐng)求,服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
Python采用httplib庫進(jìn)行HTTP通訊,用法很簡(jiǎn)單:
import httplib #導(dǎo)入httplib庫
conn = httplib.HTTPConnection(“10.197.32.136”,8080)#建立http鏈接,只需要IP地址和端口
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str,{})#發(fā)送url請(qǐng)求
response = conn.getresponse()#獲取返回信息
conn.close()#關(guān)閉鏈接
request函數(shù)是非阻塞函數(shù),也就是說,它向服務(wù)器發(fā)送了url請(qǐng)求之后,可以正常運(yùn)行之后的任務(wù)。
getresponse函數(shù)是阻塞函數(shù),如果沒有收到服務(wù)器的返回信息,程序?qū)o法繼續(xù)。
close函數(shù)在任何地方都可以調(diào)用,因此,如果無需服務(wù)器返回信息,則可以在發(fā)送請(qǐng)求之后就關(guān)閉鏈接。
Httplib無法連續(xù)發(fā)送兩個(gè)request,例如:
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str1,{})conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str2,{})
程序?qū)?huì)拋異常,并且關(guān)閉。因?yàn)閔ttp協(xié)議本身一次鏈接只支持一個(gè)request,在收到response或者關(guān)閉才能開啟下一次鏈接。所以,正常的程序應(yīng)該是:
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str1,{})
conn.close()
或者:
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str1,{})
response = conn.getresponse()
conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str2,{})conn.request(“POST”,“/RealTimeServer/WebSocketDemo”,str2,{})
第五篇:http頭文件分析心得體會(huì)
http頭文件分析心得體會(huì)
一、http簡(jiǎn)介
HTTP即超文本傳輸協(xié)議(Hypertext transfer protocol)。是一種詳細(xì)規(guī)定了瀏覽器和萬維網(wǎng)(“,結(jié)果稱為 HA2。
3、對(duì)HA1、服務(wù)器密碼隨機(jī)數(shù)(nonce)、請(qǐng)求計(jì)數(shù)(nc)、客戶端密碼隨機(jī)數(shù)(cnonce)、保護(hù)質(zhì)量(qop)以及 HA2 的合并值計(jì)算 MD5 哈希值。結(jié)果即為客戶端提供的
response 值。
因?yàn)榉?wù)器擁有與客戶端同樣的信息,因此服務(wù)器可以進(jìn)行同樣的計(jì)算,以驗(yàn)證客戶端提交的 response 值的正確性。在上面給出的例子中,結(jié)果是如下計(jì)算的。
(MD5()表示用于計(jì)算MD5哈希值的函數(shù);“”表示接下一行;引號(hào)并不參與計(jì)算)
HA1 = MD5(”Mufasa:testrealm@host.com:Circle Of Life“)
= 939e7578ed9e3c518a452acee763bce9 HA2 = MD5(”GET:/dir/index.html“)
= 39aff3a2bab6126f332b942af96d3366 Response = MD5(”939e7578ed9e3c518a452acee763bce9:
dcd98b7102dd2f0e8b11d0f600bfb0c093: 00000001:0a4f113b:auth: 39aff3a2bab6126f332b942af96d3366“)= 6629fae49393a05397450978507c4ef1 此時(shí)客戶端可以提交一個(gè)新的請(qǐng)求,重復(fù)使用服務(wù)器密碼隨機(jī)數(shù)(nonce)(服務(wù) 器僅在每次“401”響應(yīng)后發(fā)行新的nonce),但是提供新的客戶端密碼隨機(jī)數(shù)(cnonce)。在后續(xù)的請(qǐng)求中,十六進(jìn)制請(qǐng)求計(jì)數(shù)器(nc)必須比前 一次使用的時(shí)候要大,否則攻擊者可以簡(jiǎn)單的使用同樣的認(rèn)證信息重放老的請(qǐng)求。由服務(wù)器來確保在每個(gè)發(fā)出的密碼隨機(jī)數(shù)nonce時(shí),計(jì)數(shù)器是在增加的,并拒 絕掉任何錯(cuò)誤的請(qǐng)求。顯然,改變HTTP方法和/或計(jì)數(shù)器數(shù)值都會(huì)導(dǎo)致不同的 response值。
服務(wù)器應(yīng)當(dāng)記住最近所生成的服務(wù)器密碼隨機(jī)數(shù)nonce的值。也可以在發(fā)行每一個(gè)密碼隨機(jī)數(shù)nonce后,記住過一段時(shí)間讓它們過期。如果客戶端使用了一個(gè)過期的值,服務(wù)器應(yīng)該響應(yīng)“401”狀態(tài)號(hào),并且在認(rèn)證頭中添加stale=TRUE,表明客戶端應(yīng)當(dāng)使用新提供的服務(wù)器密碼隨機(jī)數(shù)nonce重發(fā)請(qǐng)求,而不必提示用戶其它用戶名和口令。
服務(wù)器不需要保存任何過期的密碼隨機(jī)數(shù),它可以簡(jiǎn)單的認(rèn)為所有不認(rèn)識(shí)的數(shù)值都是過期的。服務(wù)器也可以只允許每一個(gè)服務(wù)器密碼隨機(jī)數(shù)nonce使用一次,當(dāng)然,這樣就會(huì)迫使客戶端在發(fā)送每個(gè)請(qǐng)求的時(shí)候重復(fù)認(rèn)證過程。需要注意的是,在生成后立刻過期服務(wù)器密碼隨機(jī)數(shù)nonce是不行的,因?yàn)榭蛻舳藢]有任何機(jī)會(huì)來使用這個(gè)nonce。
語法:
challenge
= ”Digest“ digest-challenge
digest-challenge = 1#(realm | [ domain ] | nonce |
[ opaque ] |[ stale ] | [ algorithm ] |
[ qop-options ] | [auth-param])
domain
= ”domain“ ”=“ <”> URI(1*SP URI)<“>
URI
= absoluteURI | abs_path
nonce
= ”nonce“ ”=“ nonce-value
nonce-value
= quoted-string
opaque
= ”opaque“ ”=“ quoted-string
stale
= ”stale“ ”=“(”true“ | ”false“)
algorithm
= ”algorithm“ ”=“(”MD5“ | ”MD5-sess“ |
token)
qop-options
= ”qop“ ”=“ <”> 1#qop-value <“>
qop-value
= ”auth“ | ”auth-int“ | token
realm:讓客戶知道使用哪個(gè)用戶名和密碼的字符串。不同的領(lǐng)域可能密碼不一樣。至少告訴用戶是什么主機(jī)做認(rèn)證,他可能會(huì)提示用哪個(gè)用戶名登錄,類似一個(gè)Email。
domain:一個(gè)URI列表,指示要保護(hù)的域??赡苁且粋€(gè)列表。提示用戶這些URI采用一樣的認(rèn)證。如果為空或忽略則為整個(gè)服務(wù)器。nonce:隨機(jī)字符串,每次401都不一樣。跟算法有關(guān)。算法類似Base64加密:time-stamp H(time-stamp ”:“ ETag ”:“ private-key)。time-stamp為服務(wù)器時(shí)鐘,ETag為請(qǐng)求的Etag頭。private-key為服務(wù)器知道的一個(gè)值。
opaque:服務(wù)器產(chǎn)生的由客戶下去請(qǐng)求時(shí)原樣返回。最好是Base64串或十六進(jìn)制字符串。
auth-param:為擴(kuò)展用的,現(xiàn)階段忽略。
其他域請(qǐng)參考RFC2617。
授權(quán)頭語法:
credentials
= ”Digest“ digest-response
digest-response = 1#(username | realm | nonce | digest-uri
| response | [ algorithm ] | [cnonce] |
[opaque] | [message-qop] |
[nonce-count] | [auth-param])
username
= ”username“ ”=“ username-value
username-value = quoted-string
digest-uri
= ”uri“ ”=“ digest-uri-value
digest-uri-value = request-uri;As specified by HTTP/1.1
message-qop
= ”qop“ ”=“ qop-value
cnonce
= ”cnonce“ ”=“ cnonce-value
cnonce-value
= nonce-value
nonce-count
= ”nc“ ”=“ nc-value
nc-value
= 8LHEX
response
= ”response“ ”=“ request-digest
request-digest = <”> 32LHEX <“>
LHEX
= ”0“ | ”1“ | ”2“ | ”3“ |
”4“ | ”5“ | ”6“ | ”7“ |
”8“ | ”9“ | ”a“ | ”b“ |
”c“ | ”d“ | ”e“ | ”f“
response:加密后的密碼
digest-uri:拷貝Request-Line,用于Proxy cnonce:如果qop設(shè)置,才設(shè)置,用于雙向認(rèn)證,防止攻擊。
nonce-count:如果服務(wù)器看到同樣的計(jì)數(shù),就是一次重放。
示例:
401響應(yīng):
HTTP/1.1 401 Unauthorized
004km.cnonce=”0a4f113b“,response=”6629fae49393a05397450978507c4ef1“,opaque=”5ccc069c403ebaf9f0171e9517f40e41"
一,用摘要保護(hù)密碼
摘要認(rèn)證的一個(gè)改進(jìn)之處是用摘要代替密碼的傳輸,遵循的基本原則是“絕對(duì)不通過網(wǎng)絡(luò)發(fā)送明文密碼”,而是發(fā)送一個(gè)密碼的摘要信息,并且這摘要信息是不可逆 的,即無法通
過摘要信息反推出密碼信息。而服務(wù)器本身是存儲(chǔ)這個(gè)密碼的(實(shí)際上,服務(wù)器只需知道密碼的摘要即可),而客戶端和服務(wù)器本身都知道這個(gè)密碼。這樣的話,服 務(wù)器可以讀取客戶端的摘要和本身知道的密碼進(jìn)行同樣計(jì)算得出的摘要進(jìn)行比較,若匹配,則驗(yàn)證通過。
摘要是對(duì)信息主體的濃縮,摘要是一種單向函數(shù),主要用于將無限的輸入值轉(zhuǎn)為有限的濃縮輸出值,如MD5,則是將任意長(zhǎng)度的字節(jié)系列轉(zhuǎn)換為一個(gè)128位的摘要。MD5輸出的128位的摘要通常會(huì)寫出32個(gè)十六進(jìn)制的字符,每個(gè)字符表示4個(gè)bit。
二,用隨機(jī)數(shù)防止重放攻擊
使用單向摘要就無需以明文形式發(fā)送密碼了,可以只發(fā)送密碼的摘要,并且可以確信,沒有哪個(gè)惡意用戶能輕易的從摘要中解碼出原始密碼。
但是,摘要被截獲也可能跟密碼一起好用,為了防止重放攻擊的發(fā)送,服務(wù)器可以向客戶端發(fā)送一個(gè)稱為隨機(jī)數(shù)nonce的特殊令牌,這個(gè)數(shù)會(huì)經(jīng)常發(fā)生變化(可 能是每毫秒,或者每次認(rèn)證都發(fā)生變化,具體由服務(wù)器控制),客戶端在計(jì)算摘要之前要先將這個(gè)隨機(jī)數(shù)附加到密碼上去。這樣,在密碼中加入隨機(jī)數(shù)就會(huì)使得摘要 隨著隨機(jī)數(shù)的每次變化而變化,記錄下的密碼摘要只對(duì)特定的隨機(jī)數(shù)有效,而沒有密碼的話,攻擊者就無法計(jì)算出正確的摘要,這樣就可以防止重放攻擊的發(fā)生。
摘要認(rèn)證要求使用隨機(jī)數(shù),隨機(jī)數(shù)是在004km.cnonce。如下例子:
GET/cgi-bin/checkout?a=b HTTP/1.1 Authorization: Digest username=”tenfyguo”
realm=”test realm”
nonce=” 66C4EF58DA7CB956BD04233FBB64E0A4” //服務(wù)器端的隨機(jī)數(shù)一起帶回
uri=”/cgi-bin/checkout?a=b” //必須跟請(qǐng)求行一致
qop=”auth” //保護(hù)質(zhì)量參數(shù)
nc=0000001
cnonce=”xxxxx234132543strwerr65sgdrftdfytryts” //客戶端隨機(jī)數(shù),用于對(duì)稱校驗(yàn)
response=” ABC4EF58DA7CB956BD04345FBB64E0A4”//最終摘要
3,服務(wù)接受摘要,選擇算法以及掌握的數(shù)據(jù),重新計(jì)算新的摘要跟客戶端傳輸?shù)恼M(jìn)行比較,驗(yàn)證是否匹配,若客戶端反過來用客戶端隨機(jī)數(shù)對(duì)服務(wù)器進(jìn)行質(zhì)詢,就 會(huì)創(chuàng)建客戶端摘要,服務(wù)可以預(yù)先將下一個(gè)隨機(jī)數(shù)計(jì)算出來,提前傳遞給客戶端,通過Authentication-Info發(fā)送下一個(gè)隨機(jī)數(shù)。如下例子:
HTTP/1.1 200 OK Authorization-Info:nextnonce=” 88C4EF58DA7CB956BD04233FBB64E0A4”
qop=”auth”
rspauth=”23543534DfasetwerwgDTerGDTERERRE”
cnonce=” xxxxx234132543strwerr65sgdrftdfytryts”
四,摘要的計(jì)算
在說明如何計(jì)算摘要之前,先說明參加摘要計(jì)算的信息塊。信息塊主要有兩種:
1,表示與安全相關(guān)的數(shù)據(jù)的A1。
A1中的數(shù)據(jù)時(shí)密碼和受保護(hù)信息的產(chǎn)物,它包括用戶名,密碼,保護(hù)域和隨機(jī)數(shù)等內(nèi)容,A1只涉及安全信息,與底層報(bào)文自身無關(guān)。
若算法是:MD5 則A1= 若算法是:MD5-sess 則A1=MD5( ): 2,表示與報(bào)文相關(guān)的數(shù)據(jù)的A2.A2表示是與報(bào)文自身相關(guān)的信息,比如URL,請(qǐng)求反復(fù)和報(bào)文實(shí)體的主體部分,A2加入摘要計(jì)算主要目的是有助于防止反復(fù),資源或者報(bào)文被篡改。 若qop未定義或者auth: A2= 下面定義摘要的計(jì)算規(guī)則: 若qop沒有定義: 摘要response=MD5(MD5(A1): 若qop為auth: 摘要response=MD5(MD5(A1): 若qop為auth-int: 摘要response= MD5(MD5(A1): 五,隨機(jī)數(shù)的生成 RFC2617建議采用這個(gè)假想的隨機(jī)數(shù)公式: nonce = BASE64(time-stamp MD5(time-stamp “:” ETag “:” private-key))其中: time-stamp是服務(wù)器產(chǎn)生的時(shí)間戳或者其他不會(huì)重復(fù)的序列號(hào),ETag是與所請(qǐng)求實(shí)體有關(guān)的HTTP ETag首部的值,priviate-key是只有服務(wù)器知道的數(shù)據(jù)。 這樣,服務(wù)器就可以收到客戶端的認(rèn)證首部之后重新計(jì)算散列部分,如果結(jié)果與那個(gè)首部的隨機(jī)數(shù)不符,或者是時(shí)間戳的值不夠新,就可以拒絕請(qǐng)求,服務(wù)器可以通過這種方式來限制隨機(jī)數(shù)的有效持續(xù)時(shí)間。 包括了ETag可以防止對(duì)已經(jīng)更新資源版本的重放請(qǐng)求。注意:在隨機(jī)數(shù)中包含客戶端IP,服務(wù)器好像就可以限制原來獲取此隨機(jī)數(shù)的客戶端重用這個(gè)隨 機(jī)數(shù)了,但這會(huì)破壞代理集群的工作,使用代理集群時(shí)候,來自單個(gè)用戶的多條請(qǐng)求通常會(huì)經(jīng)過不同的代理進(jìn)行傳輸,而且IP地址欺騙實(shí)現(xiàn)起來也不復(fù)雜。