• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            http協(xié)議 文件下載原理詳解

            Posted on 2009-09-13 12:42 S.l.e!ep.¢% 閱讀(4513) 評論(0)  編輯 收藏 引用 所屬分類: NetWork
            http協(xié)議 文件下載原理詳解
            2009年06月01日 星期一 04:53 P.M.

            最近研究了一下關(guān)于文件下載的相關(guān)內(nèi)容,覺得還是寫些東西記下來比較好。起初只是想研究研究,但后來發(fā)現(xiàn)寫個(gè)可重用性比較高的模塊還是很有必要的,我想這也是大多數(shù)開發(fā)人員的習(xí)慣吧。
            對于HTTP協(xié)議,向服務(wù)器請求某個(gè)文件時(shí),只要發(fā)送類似如下的請求即可:

            GET /Path/FileName HTTP/1.0
            Host: www.server.com:80
            Accept: */*
            User-Agent: GeneralDownloadApplication
            Connection: close

            每行用一個(gè)“回車換行”分隔,末尾再追加一個(gè)“回車換行”作為整個(gè)請求的結(jié)束。

            第一行中的GET是HTTP協(xié)議支持的方法之一,方法名是大小寫敏感的,HTTP協(xié)議還支持OPTIONS、HAED、POST、PUT、DELETE、TRACE、CONNECT等方法,而GET和HEAD這兩個(gè)方法通常被認(rèn)為是“安全的”,也就是說任何實(shí)現(xiàn)了HTTP協(xié)議的服務(wù)器程序都會實(shí)現(xiàn)這兩個(gè)方法。對于文件下載功能,GET足矣。GET后面是一個(gè)空格,其后緊跟的是要下載的文件從WEB服務(wù)器根開始的絕對路徑。該路徑后又有一個(gè)空格,然后是協(xié)議名稱及協(xié)議版本。

            除第一行以外,其余行都是HTTP頭的字段部分。Host字段表示主機(jī)名和端口號,如果端口號是默認(rèn)的80則可以不寫。Accept字段中的*/*表示接收任何類型的數(shù)據(jù)。User-Agent表示用戶代理,這個(gè)字段可有可無,但強(qiáng)烈建議加上,因?yàn)樗欠?wù)器統(tǒng)計(jì)、追蹤以及識別客戶端的依據(jù)。Connection字段中的close表示使用非持久連接。

            關(guān)于HTTP協(xié)議更多的細(xì)節(jié)可以參考RFC2616(HTTP 1.1)。因?yàn)槲抑皇窍胪ㄟ^HTTP協(xié)議實(shí)現(xiàn)文件下載,所以也只看了一部分,并沒有看全。

            如果服務(wù)器成功收到該請求,并且沒有出現(xiàn)任何錯(cuò)誤,則會返回類似下面的數(shù)據(jù):

            HTTP/1.0 200 OK
            Content-Length: 13057672
            Content-Type: application/octet-stream
            Last-Modified: Wed, 10 Oct 2005 00:56:34 GMT
            Accept-Ranges: bytes
            ETag: "2f38a6cac7cec51:160c"
            Server: Microsoft-IIS/6.0
            X-Powered-By: ASP.NET
            Date: Wed, 16 Nov 2005 01:57:54 GMT
            Connection: close

            不用逐一解釋,很多東西一看幾乎就明白了,只說我們大家都關(guān)心內(nèi)容吧。

            第一行是協(xié)議名稱及版本號,空格后面會有一個(gè)三位數(shù)的數(shù)字,是HTTP協(xié)議的響應(yīng)狀態(tài)碼,200表示成功,OK是對狀態(tài)碼的簡短文字描述。狀態(tài)碼共有5類:
            1xx屬于通知類;
            2xx屬于成功類;
            3xx屬于重定向類;
            4xx屬于客戶端錯(cuò)誤類;
            5xx屬于服務(wù)端錯(cuò)誤類。
            對于狀態(tài)碼,相信大家對404應(yīng)該很熟悉,如果向一個(gè)服務(wù)器請求一個(gè)不存在的文件,就會得到該錯(cuò)誤,通常瀏覽器也會顯示類似“HTTP 404 - 未找到文件”這樣的錯(cuò)誤。Content-Length字段是一個(gè)比較重要的字段,它標(biāo)明了服務(wù)器返回?cái)?shù)據(jù)的長度,這個(gè)長度是不包含HTTP頭長度的。換句話說,我們的請求中并沒有Range字段(后面會說到),表示我們請求的是整個(gè)文件,所以Content-Length就是整個(gè)文件的大小。其余各字段是一些關(guān)于文件和服務(wù)器的屬性信息。

            這段返回?cái)?shù)據(jù)同樣是以最后一行的結(jié)束標(biāo)志(回車換行)和一個(gè)額外的回車換行作為結(jié)束,即“\r\n\r\n”。而“\r\n\r\n”后面緊接的就是文件的內(nèi)容了,這樣我們就可以找到“\r\n\r\n”,并從它后面的第一個(gè)字節(jié)開始,源源不斷的讀取,再寫到文件中了。

            以上就是通過HTTP協(xié)議實(shí)現(xiàn)文件下載的全過程。但還不能實(shí)現(xiàn)斷點(diǎn)續(xù)傳,而實(shí)際上斷點(diǎn)續(xù)傳的實(shí)現(xiàn)非常簡單,只要在請求中加一個(gè)Range字段就可以了。

            假如一個(gè)文件有1000個(gè)字節(jié),那么其范圍就是0-999,則:

            Range: bytes=500-????? 表示讀取該文件的500-999字節(jié),共500字節(jié)。
            Range: bytes=500-599?? 表示讀取該文件的500-599字節(jié),共100字節(jié)。
            Range還有其它幾種寫法,但上面這兩種是最常用的,對于斷點(diǎn)續(xù)傳也足矣了。如果HTTP請求中包含Range字段,那么服務(wù)器會返回206(Partial Content),同時(shí)HTTP頭中也會有一個(gè)相應(yīng)的Content-Range字段,類似下面的格式:
            Content-Range: bytes 500-999/1000
            Content-Range字段說明服務(wù)器返回了文件的某個(gè)范圍及文件的總長度。這時(shí)Content-Length字段就不是整個(gè)文件的大小了,而是對應(yīng)文件這個(gè)范圍的字節(jié)數(shù),這一點(diǎn)一定要注意。

            一切好像基本上沒有什么問題了,本來我也是這么認(rèn)為的,但事實(shí)并非如此。如果我們請求的文件的URL是類似http://www.server.com/filename.exe這樣的文件,則不會有問題。但是很多軟件下載網(wǎng)站的文件下載鏈接都是通過程序重定向的,比如pchome的ACDSee的HTTP下載地址是:

            http://download.pchome.net/php/tdownload2.php?sid=5547&url=/multimedia/viewer/acdc31sr1b051007.exe&svr=1&typ=0

            這種地址并沒有直接標(biāo)識文件的位置,而是通過程序進(jìn)行了重定向。如果向服務(wù)器請求這樣的URL,服務(wù)器就會返回302(Moved Temporarily),意思就是需要重定向,同時(shí)在HTTP頭中會包含一個(gè)Location字段,Location字段的值就是重定向后的目的URL。這時(shí)就需要斷開當(dāng)前的連接,而向這個(gè)重定向后的服務(wù)器發(fā)請求。

            ???? 好了,原理基本上就是這些了。其實(shí)裝個(gè)Sniffer好好分析一下,很容易就可以分析出來的。不過NetAnts也幫了我一些忙,它的文件下載日志對開發(fā)人員還是很有幫助的。

            本文引自:http://hi.baidu.com/chinessnetstone/blog/item/603d20094009468ad0581b23.html

            亚洲精品乱码久久久久久按摩| 久久精品成人欧美大片| 亚洲欧洲日产国码无码久久99| 久久久久久国产a免费观看不卡| 久久精品国产亚洲AV麻豆网站| 亚洲中文字幕无码久久2017| 麻豆国内精品久久久久久| 久久久久无码国产精品不卡| 久久精品国产亚洲Aⅴ香蕉| 94久久国产乱子伦精品免费| 精品久久久久久中文字幕| 久久精品黄AA片一区二区三区| 国内精品久久久久影院薰衣草| 久久人人爽人人爽人人av东京热| 国产精品久久久香蕉| 少妇无套内谢久久久久| 久久精品日日躁夜夜躁欧美| 久久久久亚洲AV片无码下载蜜桃| 亚洲性久久久影院| 亚洲综合精品香蕉久久网| 久久综合噜噜激激的五月天| 精品少妇人妻av无码久久| 久久中文字幕一区二区| 亚洲国产天堂久久综合网站| 久久国产成人午夜AV影院| 久久青青草原精品国产软件 | 一本色道久久99一综合| 亚洲中文字幕无码久久综合网| 久久亚洲国产成人精品性色| 99久久99久久精品国产片果冻| 久久久久久噜噜精品免费直播| 性做久久久久久免费观看| 久久综合噜噜激激的五月天| 91久久国产视频| 久久精品综合网| 97久久精品国产精品青草| 久久国产精品偷99| 久久精品国产男包| 免费国产99久久久香蕉| 香蕉久久久久久狠狠色| 国产成人精品久久二区二区|