|
最近一直在研究如何讓asp.net實(shí)現(xiàn)上傳大文件的功能,所以都沒怎么寫技術(shù)類的文章了??上У氖侵两襁€沒研究出來,慚愧~~~。不過因?yàn)檫@樣,也了解了一下http消息請(qǐng)求的大致過程。我就先簡(jiǎn)單介紹下,然后再來講如何利用Telnet來模擬Http請(qǐng)求。講得不對(duì)的地方還希望大家給我指出來。因?yàn)閮?nèi)容比較多,所以分成兩部分來寫。 ![]() http 1.0 請(qǐng)求模式 ![]() 1次完整的http請(qǐng)求消息包括:一個(gè)請(qǐng)求行、若干消息頭以及實(shí)體內(nèi)容,而消息頭和實(shí)體內(nèi)容可以沒有,消息頭和實(shí)體內(nèi)容間有一個(gè)空行。 我們來看一個(gè)例子(為了便于說明,我在每行前加了序號(hào)): 1 Get /mattmarg/ HTTP/1.0 2 User-Agent: Mozilla/2.0 (Macintosh; I; PPC) 3 Accept: text/html; */* 4 Cookie: name = value 5 Referer: http://www.XXX.com/a.html 其中,第1行就是請(qǐng)求行:請(qǐng)求方式為Get(除了Get之外,還有Post、Put、Delete方式),請(qǐng)求的文件位于"根目錄/mattmarg/"下,當(dāng)然也可以直接給出需要的頁面(如:/mattmarg/index.asp,也可以加上一些其它字段 如:/mattmarg/index.asp?id=1&uid=xxx。當(dāng)我們通過Get請(qǐng)求時(shí),提交給服務(wù)器的請(qǐng)求行長(zhǎng)度不能超過1K,而如果利用Post方式,則是把所提交的信息以實(shí)體內(nèi)容形式發(fā)送給服務(wù)器,所以如果服務(wù)器沒有限制的話,原則上講可以傳輸無限大的內(nèi)容),HTTP/1.0 表示了http的版本為1.0。其余幾行就是消息頭了,消息頭主要是用來向服務(wù)器傳達(dá)某種信息或指示。如告訴服務(wù)器自己的終端(User-Agent)是什么(如果是瀏覽器則返回相應(yīng)的瀏覽器型號(hào)),終端所可以解釋的類型(Accept)是什么,是從哪個(gè)頁面提交的請(qǐng)求(Referer),以及瀏覽器所能解釋的語言(Accept-Language)等等。我們這里拿Accept-Language來舉個(gè)例子,大家都知道google在中國大陸顯示的是簡(jiǎn)體中文,而在其它的國家則顯示對(duì)應(yīng)的語言,這個(gè)是怎么做到的呢?其實(shí)就是瀏覽器向服務(wù)器遞交的請(qǐng)求信息中包含了Accept-Language,而我們的瀏覽器默認(rèn)是zh-cn,然后服務(wù)器在接受到該信息時(shí)返回對(duì)應(yīng)的頁面。 我們可以通過以下方法來驗(yàn)證一下: 1、打開瀏覽器->工具->internet選項(xiàng)->常規(guī)選項(xiàng)卡 2、選擇"語言",可見默認(rèn)的語言是中文
![]() 3、選擇"添加",選擇一種語言,然后調(diào)節(jié)一下優(yōu)先順序
![]() 4、確定之后,我們?cè)僭L問一下http://www.google.com/,是不是發(fā)現(xiàn)原來的簡(jiǎn)體中文全都成了繁體字了。 ·HTTP響應(yīng)消息 Http響應(yīng)消息的格式為:一個(gè)狀態(tài)行、若干消息頭和實(shí)體內(nèi)容,其中消息頭和實(shí)體內(nèi)容可以沒有,消息頭和實(shí)體內(nèi)容間有一個(gè)空行。 我們依舊先來看一個(gè)例子: 01 HTTP/1.1 200 OK 02 Server: Microsoft-IIS/5.1 03 X-Powered-By: ASP.NET 04 Date: Sun, 06 Jul 2008 11:01:21 GMT 05 Content-Type: text/html 06 Accept-Ranges: bytes 07 Last-Modified: Wed, 02 Jul 2008 01:01:26 GMT 08 ETag: "0f71527dfdbc81:ade" 09 Content-Length: 46 10 11 <html><head></head><body>adfasfa</body></html> 其中,01行是狀態(tài)行,用于顯示服務(wù)器響應(yīng)的狀態(tài),HTTP/1.1顯示了對(duì)應(yīng)的http協(xié)議版本,200為狀態(tài)數(shù)字,OK為狀態(tài)信息用于解釋狀態(tài)數(shù)字(這里OK對(duì)應(yīng)200,表示請(qǐng)求正常);02~09是消息頭部分,10為空行,11為實(shí)體內(nèi)容(也就是服務(wù)器返回的網(wǎng)頁內(nèi)容)。 好了,相信大家應(yīng)該已經(jīng)對(duì)這個(gè)http請(qǐng)求的流程有了一個(gè)大概的了解了吧,那么我們反過來回答下最初留下的問題:當(dāng)我們?cè)跒g覽器的地址欄中輸入 " http://www.baidu.com/ " ,然后按"回車",這之后發(fā)生了什么事?。 首先,瀏覽器找到該網(wǎng)址所指向的IP,然后與其建立TCP連接,接著向百度服務(wù)器提出Get請(qǐng)求,當(dāng)服務(wù)器接收到我們的請(qǐng)求后,向我們傳送應(yīng)答信息--百度的頁面,然后斷開連接。 [補(bǔ)充]以上文章中主要是描述HTTP請(qǐng)求的大致流程,至于HTTP之前所建立的一系列連接,只用了"瀏覽器找到該網(wǎng)址所指向的IP,然后與其建立TCP連接"這句話或類似的話來帶過。根據(jù)朋友們的回復(fù)顯得這個(gè)說法不是很恰當(dāng)。所以我在這里再補(bǔ)充些東西。 1、獲取IP。瀏覽器地址欄中輸入"http://www./"并提交之后,首先它會(huì)在DNS本地緩存表中查找,如果有則直接告訴IP地址。如果沒有則要求網(wǎng)關(guān)DNS進(jìn)行查找,如此下去,當(dāng)找到對(duì)應(yīng)的ip后,則返回給瀏覽器。 2、建立TCP連接。當(dāng)獲取到IP之后,就開始與所請(qǐng)求的服務(wù)器建立TCP連接,你可以在下圖中發(fā)現(xiàn)syn,ack,這些標(biāo)識(shí)符就是用來同步用的。 3、連接建立后,就向服務(wù)器發(fā)出http請(qǐng)求(大家可以從圖中看出來)。如果是HTTP1.0的版本則,每一次請(qǐng)求結(jié)束后,就釋放TCP連接。 ![]() (上圖中,由于是第一次訪問網(wǎng)站,無法在本地找到對(duì)應(yīng)IP)
![]() (短時(shí)間內(nèi),第二次訪問同一網(wǎng)站) |
|
|