概述
本章是對(duì)http進(jìn)行簡(jiǎn)單介紹守屉。特別要關(guān)注以下方面的內(nèi)容:
- web客戶端與服務(wù)器是如何通信的隅忿;
- web的資源來(lái)自何方;
- web的事務(wù)是怎樣工作的入客;
- http通信所使用的報(bào)文格式;
- 底層tcp網(wǎng)絡(luò)傳輸腿椎;
- 不同的http協(xié)議變體桌硫;
- 因特網(wǎng)上安裝的大量http架構(gòu)組件的一部分;
1.1 http-因特網(wǎng)多媒體的信使
http采用的是可靠的數(shù)據(jù)傳輸協(xié)議啃炸,因此用戶在訪問(wèn)信息時(shí)就不用擔(dān)心其完整性铆隘,而開(kāi)發(fā)人員可以專(zhuān)注于應(yīng)用程序特有細(xì)節(jié)的編寫(xiě)。
1.2 web客戶端與服務(wù)器
web的內(nèi)容存儲(chǔ)在web服務(wù)器上南用,web服務(wù)器使用的是http協(xié)議膀钠,因此也被稱(chēng)為http服務(wù)器」妫可能你每天都在使用http客戶端肿嘲,最常見(jiàn)的是web瀏覽器,比如ie筑公,firefox,chrom....它們向服務(wù)器請(qǐng)求http對(duì)象雳窟,并將這些對(duì)象顯示在你的屏幕上。
1.3資源
web服務(wù)器是web資源(web resource)的宿主匣屡。這些資源包括web文件系統(tǒng)中的靜態(tài)文件和根據(jù)不同請(qǐng)求內(nèi)容封救,身份拇涤,時(shí)間產(chǎn)生的資源。典型靜態(tài)文件:文本文件誉结,html文件鹅士,圖片,avi電影...惩坑。典型動(dòng)態(tài)資源:搜索引擎的結(jié)果如绸,股票交易的信息,在線購(gòu)買(mǎi)禮物...旭贬。
1.3.1媒體類(lèi)型
因特網(wǎng)有不同類(lèi)型的資源怔接,http要給每種通過(guò)web傳輸?shù)膶?duì)象打上名為mime(multipupose internet mail extension,多用途因特網(wǎng)郵件擴(kuò)展)類(lèi)型。這樣當(dāng)web瀏覽器獲得http鄉(xiāng)音后就可以正確處理這些對(duì)象稀轨。
1.3.2uri
每一個(gè)web服務(wù)器資源都有名字扼脐,這樣客戶端就可以說(shuō)明他們感興趣的資源是什么。服務(wù)器字原名被稱(chēng)為統(tǒng)一資源標(biāo)識(shí)符(uniform resource identifier ,uri).uri有兩種形式url和urn奋刽。
1.3.3url
統(tǒng)一資源定位符(uniform resource locator瓦侮,url)是資源變支付最常見(jiàn)的形式。大部分url遵循一種標(biāo)準(zhǔn)格式佣谐,該格式包含三個(gè)部分肚吏。
- url的第一部分稱(chēng)為方案(scheme)說(shuō)明了資源所使用的協(xié)議,例如http協(xié)議狭魂。
- 第二部分是服務(wù)器的因特網(wǎng)地址罚攀,例如www.baidu.com。
- 其余部分指定了web服務(wù)器上的某個(gè)資源雌澄。例如/index.html
1.3.4urn
統(tǒng)一資源名稱(chēng) (Uniform Resource Name, URN)斋泄。urn作為指定特定內(nèi)容的唯一名稱(chēng)使用的,與目前資源所在地?zé)o關(guān)镐牺。通過(guò)urn可以使用同一個(gè)名字通過(guò)多種網(wǎng)絡(luò)訪問(wèn)協(xié)議來(lái)訪問(wèn)資源炫掐。
比較重要的使用是p2p中的磁力鏈接是urn的一種實(shí)現(xiàn)。在本書(shū)的其他未知不會(huì)區(qū)分url和uri睬涧。
1.4事務(wù)
一個(gè)http事務(wù)是有一條請(qǐng)求指令和一個(gè)響應(yīng)結(jié)果組成的這種通信是通過(guò)名為http報(bào)文的格式化數(shù)據(jù)塊進(jìn)行的募胃。
1.4.1方法
http支持的不同請(qǐng)求指令,這些指令被稱(chēng)為http方法畦浓。每條http請(qǐng)求報(bào)文都包含一個(gè)方法痹束。這個(gè)方法告訴服務(wù)器要執(zhí)行什么動(dòng)作。例如get宅粥,post参袱,delete這些方法將在第三章進(jìn)行詳細(xì)介紹。
1.4.2狀態(tài)碼
每條http響應(yīng)返回時(shí)都會(huì)攜帶一個(gè)狀態(tài)碼。狀態(tài)碼是一個(gè)三位數(shù)字的代碼抹蚀,告知客戶端請(qǐng)求是否成功剿牺,或者采取其它動(dòng)作。
http狀態(tài)碼 | 描述 |
---|---|
200 | ok环壤,文檔正確返回 |
302 | redirect(重定向)到其他地方獲取資源 |
404 | not found(沒(méi)找到)無(wú)法找到這個(gè)資源 |
1.4.3web頁(yè)面中可以包含多個(gè)對(duì)象
應(yīng)用程序完成一項(xiàng)任務(wù)需要發(fā)布多個(gè)http事務(wù)晒来。比如:獲取一個(gè)包含了豐富圖片的web頁(yè)面。瀏覽器會(huì)執(zhí)行一個(gè)事務(wù)來(lái)獲取頁(yè)面布局的html“框架”然后發(fā)布另外的http事務(wù)來(lái)獲得其它的圖片郑现,java程序等湃崩。這些資源甚至可能位于不同的服務(wù)器。
1.5報(bào)文
http報(bào)文是由一行行簡(jiǎn)單的字符串組成的接箫。http報(bào)文都是純文本攒读,而不是二進(jìn)制代碼,人們可以很方便的進(jìn)行讀寫(xiě)辛友。
從web客戶端發(fā)送的報(bào)文稱(chēng)為請(qǐng)求報(bào)文(request message)薄扁。從服務(wù)器發(fā)送的報(bào)文稱(chēng)為響應(yīng)報(bào)文(response message)此外沒(méi)有其它類(lèi)型的http報(bào)文。
http報(bào)文包括三個(gè)部分:
起始行
報(bào)文的第一行就是起始行废累,在請(qǐng)求報(bào)文中用來(lái)說(shuō)明要做些什么邓梅,在響應(yīng)報(bào)文中說(shuō)明出現(xiàn)了什么情況。首部字段
起始行后有零個(gè)或多個(gè)首部字段邑滨。每個(gè)首部字段包含一個(gè)名字和一個(gè)值日缨,為了便于解析,兩者之間用冒號(hào)來(lái)分割掖看。首部以一個(gè)空行結(jié)束主體
空行之后就是可選的報(bào)文主體匣距,其中包含了所有類(lèi)型的數(shù)據(jù)。請(qǐng)求主題包括了要發(fā)送給web服務(wù)器的數(shù)據(jù)乙各,響應(yīng)主體中裝載了要返回給客戶端的數(shù)據(jù)墨礁,起始行和首部都是文本形式而且都是結(jié)構(gòu)化的,而主體則不同耳峦,主體中可以包含任意的二進(jìn)制數(shù)據(jù)。當(dāng)然也可以是文本焕毫。
1.6連接
1.6.1tcp
http是應(yīng)用層協(xié)議蹲坷,http無(wú)需操心網(wǎng)絡(luò)通信的具體細(xì)節(jié),它把聯(lián)網(wǎng)的具體的細(xì)節(jié)交給了網(wǎng)絡(luò)傳輸協(xié)議tcp邑飒。
tcp協(xié)議提供了:
- 無(wú)差錯(cuò)的數(shù)據(jù)傳輸循签;
- 按序傳輸(數(shù)據(jù)總會(huì)按照發(fā)送的順序到達(dá));
- 未分段的數(shù)據(jù)流(可以在任何時(shí)刻以任意尺寸將數(shù)據(jù)發(fā)送出去)疙咸。
1.6.2連接县匠、ip地址、端口號(hào)
http客戶端向服務(wù)器發(fā)送報(bào)文前需要用網(wǎng)際協(xié)議(internet protocol ip)地址和端口號(hào)在客戶端和服務(wù)器之間建立一條tcp連接。
在tcp中乞旦,你需要知道服務(wù)器的ip地址以及服務(wù)器上運(yùn)行的特定軟件的tcp端口號(hào)贼穆。
url可以使用主機(jī)名(域名)或ip地址,使用主機(jī)名會(huì)被域名解析服務(wù)(domain name service ,dns)轉(zhuǎn)換為ip地址兰粉。如果不明確指定端口號(hào)故痊,會(huì)使用默認(rèn)的80端口。
基本瀏覽器的連接處理步驟如下:
- 瀏覽器從url中解析初服務(wù)器的主機(jī)名玖姑;
- 瀏覽器將服務(wù)器的主機(jī)名轉(zhuǎn)換為服務(wù)器的ip地址愕秫;
- 瀏覽器將端口號(hào)從url中解析出來(lái);焰络、
- 瀏覽器簡(jiǎn)歷一條與web服務(wù)器的tcp連接戴甩;
- 瀏覽器向服務(wù)器發(fā)送一條http請(qǐng)求報(bào)文;
- 服務(wù)器向?yàn)g覽器回送一條http響應(yīng)報(bào)文闪彼;
- 關(guān)閉連接甜孤,瀏覽器顯示文檔;
1.6.3使用tclnet實(shí)例
由于http使用了tcp傳輸協(xié)議备蚓,而且它是基于文本的沒(méi)有那種難以理解的二進(jìn)制课蔬,因此很容易直接與web服務(wù)器進(jìn)行對(duì)話。
telnet程序?qū)㈡I盤(pán)連接到某個(gè)目標(biāo)tcp端口郊尝,并將tcp端口的輸出回送到顯示屏上二跋,telnet常用于遠(yuǎn)程會(huì)話,但它幾乎可以連接所有的頭層皮服務(wù)器流昏,包括http服務(wù)器扎即。
雖然如此,但telnet做腳本自動(dòng)化十分復(fù)雜况凉,如果你想要使用更靈活的工具可以看看nc(netcat)通過(guò)nc可以方便地操作能夠udp和tcp的流量谚鄙。
1.7協(xié)議版本
不想寫(xiě),都是歷史
1.8web的結(jié)構(gòu)組件
- 代理
位于客戶端與服務(wù)器之間的http中間實(shí)體刁绒。 - 緩存
http的倉(cāng)庫(kù)闷营,使用常用頁(yè)面的副本可以保存在離客戶端更近的地方。 - 網(wǎng)關(guān)
連接其它應(yīng)用程序的特殊web服務(wù)器知市。 - 隧道
對(duì)http通信報(bào)文進(jìn)行盲轉(zhuǎn)發(fā)的特殊代理傻盟。 - agent代理
發(fā)起自動(dòng)http請(qǐng)求的半智能web客戶端。
1.8.1代理
http代理服務(wù)器是web安全嫂丙,應(yīng)用集成以及性能優(yōu)化的重要組成模塊娘赴。代理位于客戶端與服務(wù)器之間接受所欲客戶端的http請(qǐng)求。對(duì)用戶來(lái)說(shuō)跟啤,這些應(yīng)用程序就是一個(gè)代理诽表,代表用戶訪問(wèn)服務(wù)器唉锌。
出于安全考慮,通常會(huì)將代理作為轉(zhuǎn)發(fā)所有web流量的中間結(jié)點(diǎn)使用竿奏,代理還可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行過(guò)濾袄简。
1.8.2緩存
web緩存(web cache)或代理緩存(proxy cache)是一種特殊的http代理服務(wù)器,可以將經(jīng)過(guò)代理傳送的常用文檔復(fù)制保存起來(lái)议双。下一個(gè)請(qǐng)求同意文檔的客戶端就可以享受緩存的私有副本所提供的服務(wù)了痘番。
1.8.3網(wǎng)關(guān)
網(wǎng)關(guān)(gateway)是一種特殊的服務(wù)器,作為其它服務(wù)器的中間實(shí)體使用平痰。通常將http流量轉(zhuǎn)換成其它協(xié)議汞舱。網(wǎng)管接受請(qǐng)求就好像自己是資源服務(wù)器一樣∽诠停客戶端可能并不知道自己在與一個(gè)網(wǎng)管進(jìn)行通信昂芜。
1.8.4隧道
隧道(tunnel)是建立起來(lái)之后,就回在兩條連接之間對(duì)原始數(shù)據(jù)進(jìn)行盲轉(zhuǎn)發(fā)的http應(yīng)用程序赔蒲。http隧道通常用來(lái)在一條或多條http連接上轉(zhuǎn)發(fā)非http數(shù)據(jù)泌神,轉(zhuǎn)發(fā)時(shí)不會(huì)窺探數(shù)據(jù)。
http隧道的一種常見(jiàn)用途是通過(guò)http連接承載加密的安全套接字(secure sockets layer舞虱,ssl)流量
這樣ssl流量就可以穿過(guò)只允許web流量通過(guò)的防火墻了
1.8.5agent代理
用戶agent代理是代表用戶發(fā)起http請(qǐng)求的客戶端程序欢际。所有發(fā)布web請(qǐng)求的應(yīng)用程序都是http agent代理到目前為止,我們肢體到web瀏覽器矾兜,但用戶agent代理還有很多形式损趋,例如:網(wǎng)絡(luò)爬蟲(chóng)(spiders)
1.9起始部分結(jié)束語(yǔ)
這就是我們對(duì)http的簡(jiǎn)要介紹。本章中椅寺,我們重點(diǎn)介紹了作為多媒體傳輸協(xié)議使用的http浑槽。簡(jiǎn)要說(shuō)明了http是怎樣使用uri來(lái)命名遠(yuǎn)程服務(wù)器上的多媒體資源的,粗略的介紹了如何利用http請(qǐng)求和響應(yīng)報(bào)文操縱遠(yuǎn)程服務(wù)器的多媒體資源返帕,最后考察了幾種使用http的web應(yīng)用程序桐玻。