何為http:
? ? ? 無狀態(tài)的超文本傳輸協(xié)議(HTTP盖灸,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。
其主要的特點(diǎn):
http是屬于應(yīng)用層面向?qū)ο蟮膮f(xié)議偎球,由于其簡(jiǎn)捷、快速的方式辑甜,適用于分布式超媒體信息系統(tǒng)衰絮;
a) 支持客戶端/服務(wù)器模式;
b) 簡(jiǎn)單快捷磷醋,客戶在向服務(wù)器發(fā)送請(qǐng)求是只需要傳送請(qǐng)求方法和路徑猫牡,請(qǐng)求方法通常有GET,POST邓线,OPTIONS淌友,PUT,DELETE骇陈,CONNECT震庭,HEAD。由于http協(xié)議簡(jiǎn)單所以在服務(wù)器程序占用少你雌,因而通信速度很快器联。
c) 靈活二汛,http可以傳輸任意類型的數(shù)據(jù),正在傳輸?shù)臄?shù)據(jù)由content-type標(biāo)示拨拓。
d) 無連接肴颊,其意義在于其每次鏈接只處理一次請(qǐng)求,服務(wù)器處理完請(qǐng)求并接到應(yīng)答后便會(huì)斷開鏈接渣磷。這樣使其更加靈活快捷婿着。
e) 無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力醋界。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息竟宋,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大物独。另一方面袜硫,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
url(統(tǒng)一資源定位符):
? ? ? http請(qǐng)求是通過url傳遞的挡篓,以此來定位請(qǐng)求到達(dá)的地址婉陷,其格式是:如http://www.brophp.com/book/index.html;
? ? ? http://:代表通過http超文本傳輸協(xié)議;
? ? ? ?www.brophp.com : 萬維域名(對(duì)應(yīng)一個(gè)完整的ip)是一個(gè)ip地址官研;
? ? ?book:服務(wù)器下的目錄秽澳;
? ? ?index.html:服務(wù)器book目錄下index.html文件(通常index.html為窗口文件);
? ? ?port:默認(rèn)端口為80戏羽,通常不需要手動(dòng)輸入担神,瀏覽器自動(dòng)解析;
http工作機(jī)制:
? ? ? http為一個(gè)無狀態(tài)的協(xié)議始花,一次請(qǐng)求為一次事務(wù)妄讯,客戶機(jī)和瀏覽器通過請(qǐng)求響應(yīng)即為一次會(huì)話,其工作過程粗分為四步:
? ? ? ?1)客戶機(jī)通過url建立鏈接酷宵。
? ? ? ?2)發(fā)送請(qǐng)求給服務(wù)器服務(wù)器亥贸。
? ? ? ?3)接收請(qǐng)求后給予響應(yīng)的數(shù)據(jù)。
? ? ? ?4)關(guān)閉連接浇垦。
而對(duì)于用戶來說炕置,只要點(diǎn)一下鼠標(biāo)就可以等待網(wǎng)頁的顯示(或者錯(cuò)誤提示);
如果使用Wireshark抓TCP男韧、http包朴摊,就可以清楚的看到其交互過程;
http工作機(jī)制-請(qǐng)求篇:
? ? ? HTTP通信機(jī)制是在一次完整的HTTP通信過程中此虑,嚴(yán)格來說Web瀏覽器與Web服務(wù)器之間將完成下列7個(gè)步驟:
(1)建立TCP連接
在HTTP
工作開始之前甚纲,Web瀏覽器首先要通過網(wǎng)絡(luò)與Web服務(wù)器建立連接,該連接是通過TCP來完成的朦前,該協(xié)議與IP協(xié)議共同構(gòu)建Internet贩疙,即著名的
TCP/IP協(xié)議族讹弯,因此Internet又被稱作是TCP/IP網(wǎng)絡(luò)。HTTP是比TCP更高層次的應(yīng)用層協(xié)議这溅,根據(jù)規(guī)則,只有低層協(xié)議建立之后才能棒仍,
才能進(jìn)行更層協(xié)議的連接悲靴,因此,首先要建立TCP連接莫其,一般TCP連接的端口號(hào)是80
(2)Web瀏覽器向Web服務(wù)器發(fā)送請(qǐng)求命令
一旦建立了TCP連接癞尚,Web瀏覽器就會(huì)向Web服務(wù)器發(fā)送請(qǐng)求命令
例如:GET/sample/hello.jsp HTTP/1.1
(3)Web瀏覽器發(fā)送請(qǐng)求頭信息
瀏覽器發(fā)送其請(qǐng)求命令之后,還要以頭信息的形式向Web服務(wù)器發(fā)送一些別的信息乱陡,之后瀏覽器發(fā)送了一空白行來通知服務(wù)器浇揩,它已經(jīng)結(jié)束了該頭信息的發(fā)送。
(4)Web服務(wù)器應(yīng)答
客戶機(jī)向服務(wù)器發(fā)出請(qǐng)求后憨颠,服務(wù)器會(huì)客戶機(jī)回送應(yīng)答胳徽,
HTTP/1.1 200 OK
應(yīng)答的第一部分是協(xié)議的版本號(hào)和應(yīng)答狀態(tài)碼
(5)Web服務(wù)器發(fā)送應(yīng)答頭信息
正如客戶端會(huì)隨同請(qǐng)求發(fā)送關(guān)于自身的信息一樣,服務(wù)器也會(huì)隨同應(yīng)答向用戶發(fā)送關(guān)于它自己的數(shù)據(jù)及被請(qǐng)求的文檔爽彤。
(6)Web服務(wù)器向?yàn)g覽器發(fā)送數(shù)據(jù)
Web服務(wù)器向?yàn)g覽器發(fā)送頭信息后养盗,它會(huì)發(fā)送一個(gè)空白行來表示頭信息的發(fā)送到此為結(jié)束,接著适篙,它就以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所請(qǐng)求的實(shí)際數(shù)據(jù)
(7)Web服務(wù)器關(guān)閉TCP連接
一般情況下往核,一旦Web服務(wù)器向?yàn)g覽器發(fā)送了請(qǐng)求數(shù)據(jù),它就要關(guān)閉TCP連接嚷节,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發(fā)送后將仍然保持打開狀態(tài)聂儒,于是,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請(qǐng)求硫痰。保持連接節(jié)省了為每個(gè)請(qǐng)求建立新連接所需的時(shí)間衩婚,還節(jié)約了網(wǎng)絡(luò)帶寬。
其完整格式為:
GET/sam.jspHTTP/1.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234(請(qǐng)求體)碍论;
(1)請(qǐng)求方法URI協(xié)議/版本
請(qǐng)求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1
以上代碼中“GET”代表請(qǐng)求方法谅猾,“/sample.jsp”表示URI,“HTTP/1.1代表協(xié)議和協(xié)議的版本鳍悠。
根據(jù)HTTP標(biāo)準(zhǔn)税娜,HTTP請(qǐng)求可以使用多種請(qǐng)求方法。例如:HTTP1.1支持7種請(qǐng)求方法:GET藏研、POST敬矩、HEAD、OPTIONS蠢挡、PUT弧岳、DELETE和TARCE凳忙。在Internet應(yīng)用中,最常用的方法是GET和POST禽炬。
URL完整地指定了要訪問的網(wǎng)絡(luò)資源涧卵,通常只要給出相對(duì)于服務(wù)器的根目錄的相對(duì)目錄即可,因此總是以“/”開頭腹尖,最后柳恐,協(xié)議版本聲明了通信過程中使用HTTP的版本。
(2) 請(qǐng)求頭(Request Header)
請(qǐng)求頭包含許多有關(guān)的客戶端環(huán)境和請(qǐng)求正文的有用信息热幔。例如乐设,請(qǐng)求頭可以聲明瀏覽器所用的語言,請(qǐng)求正文的長(zhǎng)度等绎巨。
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
(3) 請(qǐng)求正文
請(qǐng)求頭和請(qǐng)求正文之間是一個(gè)空行近尚,這個(gè)行非常重要,它表示請(qǐng)求頭已經(jīng)結(jié)束场勤,接下來的是請(qǐng)求正文戈锻。請(qǐng)求正文中可以包含客戶提交的查詢字符串信息:
username=jinqiao&password=1234
在以上的例子的HTTP請(qǐng)求中,請(qǐng)求的正文只有一行內(nèi)容却嗡。當(dāng)然舶沛,在實(shí)際應(yīng)用中,HTTP請(qǐng)求正文可以包含更多的內(nèi)容窗价。
HTTP請(qǐng)求方法我這里只討論GET方法與POST方法
lGET方法
GET方法是默認(rèn)的HTTP請(qǐng)求方法如庭,我們?nèi)粘S肎ET方法來提交表單數(shù)據(jù),然而用GET方法提交的表單數(shù)據(jù)只經(jīng)過了簡(jiǎn)單的編碼撼港,同時(shí)它將作為URL的一部分向Web服務(wù)器發(fā)送坪它,因此,如果使用GET方法來提交表單數(shù)據(jù)就存在著安全隱患上帝牡。例如
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
從上面的URL請(qǐng)求中往毡,很容易就可以辯認(rèn)出表單提交的內(nèi)容。(靶溜?之后的內(nèi)容)另外由于GET方法提交的數(shù)據(jù)是作為URL請(qǐng)求的一部分所以提交的數(shù)據(jù)量不能太大(權(quán)威說法IE默認(rèn)2083开瞭,經(jīng)過實(shí)際測(cè)試在IE8 下的URL地址總長(zhǎng)度為:4076,在firefox 25下的URL地址總長(zhǎng)度可以達(dá)到:7530罩息,在chrome 29.0.1547.62 的最大總長(zhǎng)度達(dá)到:7675)
lPOST方法
POST
方法是GET方法的一個(gè)替代方法嗤详,它主要是向Web服務(wù)器提交表單數(shù)據(jù),尤其是大批量的數(shù)據(jù)瓷炮。POST方法克服了GET方法的一些缺點(diǎn)葱色。通過POST方法
提交表單數(shù)據(jù)時(shí),數(shù)據(jù)不是作為URL請(qǐng)求的一部分而是作為標(biāo)準(zhǔn)數(shù)據(jù)傳送給Web服務(wù)器娘香,這就克服了GET方法中的信息無法保密和數(shù)據(jù)量太小的缺點(diǎn)苍狰。因此办龄,
出于安全的考慮以及對(duì)用戶隱私的尊重,通常表單提交時(shí)采用POST方法淋昭。
從編程的角度來講俐填,如果用戶通過GET方法提交數(shù)據(jù),則數(shù)據(jù)存放在QUERY_STRING環(huán)境變量中响牛,而POST方法提交的數(shù)據(jù)則可以從標(biāo)準(zhǔn)輸入流中獲取玷禽。
HTTP應(yīng)答與HTTP請(qǐng)求相似,HTTP響應(yīng)也由3個(gè)部分構(gòu)成呀打,分別是:
l 協(xié)議狀態(tài)版本代碼描述
l 響應(yīng)頭(Response Header)
l 響應(yīng)正文
下面是一個(gè)HTTP響應(yīng)的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
HTTP響應(yīng)示例<title>
Hello HTTP!
協(xié)議狀態(tài)代碼描述HTTP響應(yīng)的第一行類似于HTTP請(qǐng)求的第一行,它表示通信所用的協(xié)議是HTTP1.1服務(wù)器已經(jīng)成功的處理了客戶端發(fā)出的請(qǐng)求(200表示成功):
HTTP/1.1 200 OK
響應(yīng)頭(Response Header)響應(yīng)頭也和請(qǐng)求頭一樣包含許多有用的信息糯笙,例如服務(wù)器類型贬丛、日期時(shí)間、內(nèi)容類型和長(zhǎng)度等:
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:13:33 GMT
Content-Type:text/html
Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:112
響應(yīng)正文響應(yīng)正文就是服務(wù)器返回的HTML頁面:
HTTP響應(yīng)示例<title>
Hello HTTP!
響應(yīng)頭和正文之間也必須用空行分隔给涕。
lHTTP應(yīng)答碼
HTTP應(yīng)答碼也稱為狀態(tài)碼豺憔,它反映了Web服務(wù)器處理HTTP請(qǐng)求狀態(tài)。HTTP應(yīng)答碼由3位數(shù)字構(gòu)成够庙,其中首位數(shù)字定義了應(yīng)答碼的類型:
1XX-信息類(Information),表示收到Web瀏覽器請(qǐng)求恭应,正在進(jìn)一步的處理中
2XX-成功類(Successful),表示用戶請(qǐng)求被正確接收,理解和處理例如:200 OK
3XX-重定向類(Redirection),表示請(qǐng)求沒有成功耘眨,客戶必須采取進(jìn)一步的動(dòng)作昼榛。
4XX-客戶端錯(cuò)誤(Client Error),表示客戶端提交的請(qǐng)求有錯(cuò)誤 例如:404 NOT
Found剔难,意味著請(qǐng)求中所引用的文檔不存在胆屿。
5XX-服務(wù)器錯(cuò)誤(Server Error)表示服務(wù)器不能完成對(duì)請(qǐng)求的處理:如 500
對(duì)于我們Web開發(fā)人員來說掌握HTTP應(yīng)答碼有助于提高Web應(yīng)用程序調(diào)試的效率和準(zhǔn)確性。
好了偶宫,http就到這里把非迹,如果真是搞網(wǎng)絡(luò)的應(yīng)該繼續(xù)深挖下去!這方面真的很深纯趋,還是那句話憎兽,人的精力是有限的,如果不是真正搞網(wǎng)絡(luò)的吵冒,了解一下知道怎么回事就可以了纯命,把主要的精力用在自己的專業(yè)上把!