需要做多線程斷點(diǎn)續(xù)傳模塊,本來(lái)想找RFC文檔,但網(wǎng)上搜索到這篇文章,感覺(jué)很詳解
一、連接至Web服務(wù)器
一個(gè)客戶端應(yīng)用(如Web瀏覽器)打開到Web服務(wù)器的HTTP端口的一個(gè)套接字(缺省為80)。
例如:http://www.myweb.com:8080/index.html
在Java中,這將等同于代碼:
Soceet socket=new Socket(");
InputStream in=socket.getInputStream();
OutputStream out=socket.getOutputStream();
二、發(fā)送HTTP請(qǐng)求
通過(guò)連接,客戶端寫一個(gè)ASCII文本請(qǐng)求行,后跟0或多個(gè)HTTP頭標(biāo),一個(gè)空行和實(shí)現(xiàn)請(qǐng)求的任意數(shù)據(jù)。
一個(gè)請(qǐng)求由四個(gè)部分組成:請(qǐng)求行、請(qǐng)求頭標(biāo)、空行和請(qǐng)求數(shù)據(jù)
1.請(qǐng)求行:請(qǐng)求行由三個(gè)標(biāo)記組成:請(qǐng)求方法、請(qǐng)求URI和HTTP版本,它們用空格分隔。
例如:GET /index.html HTTP/1.1
HTTP規(guī)范定義了8種可能的請(qǐng)求方法:
GET 檢索URI中標(biāo)識(shí)資源的一個(gè)簡(jiǎn)單請(qǐng)求
HEAD 與GET方法相同,服務(wù)器只返回狀態(tài)行和頭標(biāo),并不返回請(qǐng)求文檔
POST 服務(wù)器接受被寫入客戶端輸出流中的數(shù)據(jù)的請(qǐng)求
PUT 服務(wù)器保存請(qǐng)求數(shù)據(jù)作為指定URI新內(nèi)容的請(qǐng)求
DELETE 服務(wù)器刪除URI中命名的資源的請(qǐng)求
OPTIONS 關(guān)于服務(wù)器支持的請(qǐng)求方法信息的請(qǐng)求
TRACE Web服務(wù)器反饋Http請(qǐng)求和其頭標(biāo)的請(qǐng)求
CONNECT 已文檔化但當(dāng)前未實(shí)現(xiàn)的一個(gè)方法,預(yù)留做隧道處理
2.請(qǐng)求頭標(biāo):由關(guān)鍵字/值對(duì)組成,每行一對(duì),關(guān)鍵字和值用冒號(hào)(:)分隔。
請(qǐng)求頭標(biāo)通知服務(wù)器有關(guān)于客戶端的功能和標(biāo)識(shí),典型的請(qǐng)求頭標(biāo)有:
User-Agent 客戶端廠家和版本
Accept 客戶端可識(shí)別的內(nèi)容類型列表
Content-Length 附加到請(qǐng)求的數(shù)據(jù)字節(jié)數(shù)
3.空行:最后一個(gè)請(qǐng)求頭標(biāo)之后是一個(gè)空行,發(fā)送回車符和退行,通知服務(wù)器以下不再有頭標(biāo)。
4.請(qǐng)求數(shù)據(jù):使用POST傳送數(shù)據(jù),最常使用的是Content-Type和Content-Length頭標(biāo)。
三、服務(wù)端接受請(qǐng)求并返回HTTP響應(yīng)
Web服務(wù)器解析請(qǐng)求,定位指定資源。服務(wù)器將資源副本寫至套接字,在此處由客戶端讀取。
一個(gè)響應(yīng)由四個(gè)部分組成;狀態(tài)行、響應(yīng)頭標(biāo)、空行、響應(yīng)數(shù)據(jù)
1.狀態(tài)行:狀態(tài)行由三個(gè)標(biāo)記組成:HTTP版本、響應(yīng)代碼和響應(yīng)描述。
HTTP版本:向客戶端指明其可理解的最高版本。
響應(yīng)代碼:3位的數(shù)字代碼,指出請(qǐng)求的成功或失敗,如果失敗則指出原因。
響應(yīng)描述:為響應(yīng)代碼的可讀性解釋。
例如:HTTP/1.1 200 OK
HTTP響應(yīng)碼:
1xx:信息,請(qǐng)求收到,繼續(xù)處理
2xx:成功,行為被成功地接受、理解和采納
3xx:重定向,為了完成請(qǐng)求,必須進(jìn)一步執(zhí)行的動(dòng)作
4xx:客戶端錯(cuò)誤:
2.響應(yīng)頭標(biāo):像請(qǐng)求頭標(biāo)一樣,它們指出服務(wù)器的功能,標(biāo)識(shí)出響應(yīng)數(shù)據(jù)的細(xì)節(jié)。
3.空行:最后一個(gè)響應(yīng)頭標(biāo)之后是一個(gè)空行,發(fā)送回車符和退行,表明服務(wù)器以下不再有頭標(biāo)。
4.響應(yīng)數(shù)據(jù):HTML文檔和圖像等,也就是HTML本身。
四、服務(wù)器關(guān)閉連接,瀏覽器解析響應(yīng)
1.瀏覽器首先解析狀態(tài)行,查看表明請(qǐng)求是否成功的狀態(tài)代碼。
2.然后解析每一個(gè)響應(yīng)頭標(biāo),頭標(biāo)告知以下為若干字節(jié)的HTML。
3.讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)HTML的語(yǔ)法和語(yǔ)義對(duì)其進(jìn)行格式化,并在瀏覽器窗口中顯示它。
4.一個(gè)HTML文檔可能包含其它需要被載入的資源引用,瀏覽器識(shí)別這些引用,對(duì)其它的資源再進(jìn)行額外的請(qǐng)求,此過(guò)程循環(huán)多次。
五、無(wú)狀態(tài)連接
HTTP模型是無(wú)狀態(tài)的,表明在處理一個(gè)請(qǐng)求時(shí),Web服務(wù)器并不記住來(lái)自同一客戶端的請(qǐng)求。
六、實(shí)例
1.瀏覽器發(fā)出請(qǐng)求
GET /index.html HTTP/1.1
服務(wù)器返回響應(yīng)
HTTP /1.1 200 OK
Date: Apr 11 2006 15:32:08 GMT
Server: Apache/2.0.46(win32)
Content-Length: 119
Content-Type: text/html
<HTML>
<HEAD>
<LINK REL="stylesheet" HREF="index.css">
</HEAD>
<BODY>
<IMG SRC="image/logo.png">
</BODY>
</HTML>
2.瀏覽器發(fā)出請(qǐng)求
GET /index.css HTTP/1.1
服務(wù)器返回響應(yīng)
HTTP /1.1 200 OK
Date: Apr 11 2006 15:32:08 GMT
Server: Apache/2.0.46(win32)
Connection: Keep-alive, close
Content-Length: 70
Content-Type: text/plane
h3{
font-size:20px;
font-weight:bold;
color:#005A9C;
}
3.瀏覽器發(fā)出請(qǐng)求
GET image/logo.png HTTP/1.1
服務(wù)器返回響應(yīng)
HTTP /1.1 200 OK
Date: Apr 11 2006 15:32:08 GMT
Server: Apache/2.0.46(win32)
Connection: Keep-alive, close
Content-Length: 1280
Content-Type: text/plane
{Binary image data follows}
(附錄)
1.HTTP規(guī)范:Internet工程制定組織(IETF)發(fā)布的RFC指定Internet標(biāo)準(zhǔn),這些RFC被Internet研究發(fā)展機(jī)構(gòu)廣泛接受。因?yàn)樗鼈兪菢?biāo)準(zhǔn)文檔,故一般用正規(guī)語(yǔ)言編寫,如立法文標(biāo)一樣。
2.RFC:RFC一旦被提出,就被編號(hào)且不會(huì)再改變,當(dāng)一個(gè)標(biāo)準(zhǔn)被修改時(shí),則給出一個(gè)新的RFC。作為標(biāo)準(zhǔn),RFC在Internet上被廣泛采用。
3.HTTP的幾個(gè)重要RFC:
RFC1945 HTTP 1.0 描述
RFC2068 HTTP 1.1 初步描述
RFC2616 HTTP 1.1 標(biāo)準(zhǔn)
4.資源標(biāo)識(shí)符URI(Uniform Resource Identifter,URI)
http協(xié)議
Internet的基本協(xié)議是TCP/IP協(xié)議,例如:FTP,Http等是建立在TCP/IP協(xié)議之上的應(yīng)用層協(xié)議,www服務(wù)器使用的主要協(xié)議是HTTP協(xié)議(超文本傳輸協(xié)議),http協(xié)議支持的服務(wù)不限于www。
http協(xié)議的特點(diǎn):支持客戶/服務(wù)器模式,無(wú)連接,無(wú)狀態(tài)。
運(yùn)作方式是基于請(qǐng)求/響應(yīng)范式。內(nèi)部操作過(guò)程為:
1,建立連接,客戶與服務(wù)器是一個(gè)相對(duì)的概念。www服務(wù)器運(yùn)行時(shí),一直在TCP80端口(www的缺省端口)監(jiān)聽,等待連接的出現(xiàn)。連接的建立是通過(guò)申請(qǐng)?zhí)捉幼郑⊿ocket)實(shí)現(xiàn)的。客戶打開一個(gè)套接字并把它約束在一個(gè)端口上,如果成功,就相當(dāng)于建立了一個(gè)虛擬文件。相當(dāng)于對(duì)虛擬文件的操作。
2,發(fā)送請(qǐng)求,打開一個(gè)連接后,客戶機(jī)把請(qǐng)求消息送到服務(wù)器的停留端口上,完成提出請(qǐng)求動(dòng)作。
請(qǐng)求的格式為:
請(qǐng)求消息 = 請(qǐng)求行(通用信息|請(qǐng)求頭|實(shí)體頭) CRLF[實(shí)體內(nèi)容]
請(qǐng)求 行 = 方法 請(qǐng)求URL HTTP版本號(hào) CRLF
方 法 = GET|HEAD|POST|擴(kuò)展方法
U R L = 協(xié)議名稱+宿主名+目錄與文件名
HEAD——要求服務(wù)器查找某對(duì)象的元信息,而不是對(duì)象本身。
POST——從客戶機(jī)向服務(wù)器傳送數(shù)據(jù),在要求服務(wù)器和CGI做進(jìn)一步處理時(shí)會(huì)用到POST方法。POST主要用于發(fā)送HTML文本中FORM的內(nèi)容,讓CGI程序處理。
一個(gè)請(qǐng)求的例子為:
GET http://networking.zju.edu.cn/zju/index.htm HTTP/1.0
頭信息又稱為元信息,即信息的信息,利用元信息可以實(shí)現(xiàn)有條件的請(qǐng)求或應(yīng)答 。
請(qǐng)求頭——告訴服務(wù)器怎樣解釋本次請(qǐng)求,主要包括用戶可以接受的數(shù)據(jù)類型、壓縮方法和語(yǔ)言等。
實(shí)體頭——實(shí)體信息類型、長(zhǎng)度、壓縮方法、最后一次修改時(shí)間、數(shù)據(jù)有效期等。
實(shí)體 ——請(qǐng)求或應(yīng)答對(duì)象本身。
3,發(fā)送響應(yīng),服務(wù)器在處理完客戶的請(qǐng)求之后,要向客戶機(jī)發(fā)送響應(yīng)消息。
HTTP/1.0的響應(yīng)消息格式:
響應(yīng)消息 = 狀態(tài)行(通用信息頭|響應(yīng)頭|實(shí)體頭) CRLF 〔實(shí)體內(nèi)容〕
狀 態(tài) 行 = HTTP版本號(hào) 狀態(tài)碼 原因敘述
響應(yīng)頭的信息包括:服務(wù)程序名,通知客戶請(qǐng)求的URL需要認(rèn)證,請(qǐng)求的資源何時(shí)能使用。
4.關(guān)閉連接:客戶和服務(wù)器雙方都可以通過(guò)關(guān)閉套接字來(lái)結(jié)束TCP/IP對(duì)話。
posted on 2009-07-20 09:50
ViskerWong 閱讀(639)
評(píng)論(0) 編輯 收藏 引用