2013-04-13 103 views
2

我需要快速下載一個大文件,但是我能找到的所有資源都會限制帶寬。他們每個人似乎都支持HTTP 1.1字節服務(範圍請求),因爲我可以暫停並恢復下載。我怎樣才能從多個來源並行下載它?如何通過HTTP從多個位置下載單個文件?

回答

1

假設這是一個編程問題(鑑於這是StackOverflow),我將解釋如何鏈接到下載加速器,而不是利用這一點。

在服務器方面需要做什麼?

  • 支持Range HTTP標頭的服務器。
  • 允許併發連接的服務器。可以支持Range,同時不允許通過使用端點或基於IP的限制服務器端的多個同時連接。出於這個原因,我建議您設置一個簡單的測試服務器,而不是從文件共享站點下載,同時測試它。

什麼是Range標題?

如果未設置Range標頭,則通過HTTP傳輸的數據按從文件開始的順序發送。服務器上文件的第一個字節將是HTTP響應的第一個字節,服務器上文件的最後一個字節將是HTTP響應的最後一個字節。 Range頭允許您指定字節開始發送的位置,允許您「跳過」響應的開頭。

實際回答實施例

我們的情況

的響應是純文本。響應內容只是一個單詞「StackOverflow !!」編碼ASCII,意思是每個字符是一個字節。因此,Content-Length標頭的值是15 octets(字節的另一項)。

我們打算使用3個請求下載此文件。爲了這個例子,我們會說它會快3倍,但你應該認識到,這種方法會使下載速度變得很慢,非常小的文件。這是因爲HTTP頭必須與每個請求一起發送以及3次握手。我們還假定服務器支持HEAD請求,並且頭文件會隨下載響應一起發送。最後,由於HEAD請求的原因,此請求將使用GET執行。但是,POST有解決方法。

多汁詳細

首先,執行一個HTTP HEAD請求。取「Content-Length」標題並將該值除以您希望創建的並行連接數量。對於這個例子,Content-Length是15,我們希望做3個連接,所以劃分的值將是5.

現在執行你希望並行預處理的請求數量。對於每個請求,將Range標題設置爲「範圍:字節=」,按照上面找到的除以多少個請求的次數來執行。然後追加「 - 」,然後加上剛剛確定的值加上除數值。 對於這個例子,每個請求都應該設置標題如下。

  1. Range: bytes=0-5
  2. Range: bytes=5-10
  3. Range: bytes=10-15

每個這些請求的響應應該是

  1. 堆棧
  2. Overf
  3. 低!

本質上,我們只是符合Range規範(section 3.12 of RFC 2616)以及Byte Range規範(RFC 2616的14.35節)。

最後,追加每個請求的字節以形成最終的響應數據。

免責聲明:我從未試過,但它應該在理論上

+0

如果服務器確實支持範圍請求,這絕對是不正確的!您當然可以同時下載文件的多個部分,有時它可以真正提高吞吐量。許多下載管理員都這樣做。 – AriX

+0

@AriX我14歲的時候寫過那封信,請看我修改後的答案,並根據需要進行編輯。 –

+0

哈哈看起來不錯,我只是想添加一個評論,以確保人們沒有看到它,並認爲這是正確的答案,但很好的工作。 – AriX

0

工作,我不能說,如果wget是能夠把一個文件再度合作,如果獲取的來自多個來源。

以下示例顯示如何使用aria2c執行此操作。

你將建立一個下載描述文件,然後傳遞到唱腔,像這樣:

aria2c -i uri.txt --split=5 --min-split-size=1M --max-connection-per-server=5 

其中uri.txt可能包含

http://a.com/file1.iso http://mirror-1.com/file1.iso http://mirror-2.com/file1.iso 
dir=/downloads 
out=file1.iso 

這將獲取相同的文件,從3個不同位置並將其放入名稱爲file1.iso(out)的下載文件夾(dir)中。

相關問題