一 . HTTP 簡(jiǎn)介
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。
設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法。通過HTTP或者HTTPS協(xié)議請(qǐng)求的資源由統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifiers,URI)來(lái)標(biāo)識(shí)。
HTTP是一個(gè)客戶端終端(用戶)和服務(wù)器端(網(wǎng)站)請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP)。
通過使用網(wǎng)頁(yè)瀏覽器、網(wǎng)絡(luò)爬蟲或者其它的工具,客戶端發(fā)起一個(gè)HTTP請(qǐng)求到服務(wù)器上指定端口(默認(rèn)端口為80)。
我們稱這個(gè)客戶端為用戶代理程序(user agent)。
應(yīng)答的服務(wù)器上存儲(chǔ)著一些資源,比如HTML文件和圖像。我們稱這個(gè)應(yīng)答服務(wù)器為源服務(wù)器(origin server)。
在用戶代理和源服務(wù)器中間可能存在多個(gè)“中間層”,比如代理服務(wù)器、網(wǎng)關(guān)或者隧道(tunnel)。
盡管TCP/IP協(xié)議是互聯(lián)網(wǎng)上最流行的應(yīng)用,HTTP協(xié)議中,并沒有規(guī)定必須使用它或它支持的層。
事實(shí)上,HTTP可以在任何互聯(lián)網(wǎng)協(xié)議上,或其他網(wǎng)絡(luò)上實(shí)現(xiàn)。HTTP假定其下層協(xié)議提供可靠的傳輸。
因此,任何能夠提供這種保證的協(xié)議都可以被其使用。因此也就是其在TCP/IP協(xié)議族使用TCP作為其傳輸層。
二.HTTP協(xié)議特點(diǎn)
HTTP 協(xié)議一共有五大特點(diǎn):1、支持客戶/服務(wù)器模式;2、簡(jiǎn)單快速;3、靈活;4、無(wú)連接(1.0)/持久連接(1.1);5、無(wú)狀態(tài)。
無(wú)連接:是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
無(wú)狀態(tài):是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力,服務(wù)器不知道客戶端是什么狀態(tài)。即我們給服務(wù)器發(fā)送 HTTP 請(qǐng)求之后,服務(wù)器根據(jù)請(qǐng)求,會(huì)給我們發(fā)送數(shù)據(jù)過來(lái),但是,發(fā)送完,不會(huì)記錄任何信息。
三.HTTP報(bào)文
HTTP請(qǐng)求報(bào)文由3部分組成( 請(qǐng)求行+請(qǐng)求頭+請(qǐng)求體 ):
這是這篇文章的請(qǐng)求報(bào)文
第一行為請(qǐng)求行 <請(qǐng)求方法><URL><HTTP協(xié)議和版本>
請(qǐng)求頭之后是空行
然后是請(qǐng)求數(shù)據(jù)
HTTP 響應(yīng)報(bào)文也由三部分組成 狀態(tài)行、消息報(bào)頭、響應(yīng)正文。
第一行為狀態(tài)行,包含各種狀態(tài)碼? ?1XX 代表消息 ?2XX 代表成功 3XX 代表重定向 4XX 代表客戶的錯(cuò)誤 5XX服務(wù)器錯(cuò)誤
第二行開始是消息報(bào)頭
消息報(bào)頭之后空一行,然后是響應(yīng)正文
常見的請(qǐng)求方式有 GET 和 POST
1.GET提交,請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭<request-line>中),以?分割URL和傳輸數(shù)據(jù),多個(gè)參數(shù)用&連接;例如:login.do?name=xxx&password=xxx。如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號(hào)以16進(jìn)制表示的ASCII。
POST提交:把提交的數(shù)據(jù)放置在是HTTP包的包體<request-body>中
因此,GET提交的數(shù)據(jù)會(huì)在地址欄中顯示出來(lái),而POST提交,地址欄不會(huì)改變
2.傳輸數(shù)據(jù)的大?。?/p>
首先聲明,HTTP協(xié)議沒有對(duì)傳輸?shù)臄?shù)據(jù)大小進(jìn)行限制,HTTP協(xié)議規(guī)范也沒有對(duì)URL長(zhǎng)度進(jìn)行限制。 而在實(shí)際開發(fā)中存在的限制主要有:
GET:特定瀏覽器和服務(wù)器對(duì)URL長(zhǎng)度有限制,例如IE對(duì)URL長(zhǎng)度的限制是2083字節(jié)(2K+35)。對(duì)于其他瀏覽器,如Netscape、FireFox等,理論上沒有長(zhǎng)度限制,其限制取決于操作系統(tǒng)的支持。
因此對(duì)于GET提交時(shí),傳輸數(shù)據(jù)就會(huì)受到URL長(zhǎng)度的限制。
POST:由于不是通過URL傳值,理論上數(shù)據(jù)不受限。但實(shí)際各個(gè)WEB服務(wù)器會(huì)規(guī)定對(duì)post提交數(shù)據(jù)大小進(jìn)行限制,Apache、IIS6都有各自的配置。
3.安全性:
POST的安全性要比GET的安全性高。注意:這里所說的安全性和上面GET提到的“安全”不是同個(gè)概念。上面“安全”的含義僅僅是不作數(shù)據(jù)修改,而這里安全的含義是真正的Security的含義,比如:通過GET提交數(shù)據(jù),用戶名和密碼將明文出現(xiàn)在URL上,因?yàn)?1)登錄頁(yè)面有可能被瀏覽器緩存, (2)其他人查看瀏覽器的歷史紀(jì)錄,那么別人就可以拿到你的賬號(hào)和密碼了,