1. 程式人生 > 其它 >斷點續傳原理分析

斷點續傳原理分析

技術標籤:網路基礎http

文章目錄

概述

斷點續傳:在下載或上傳時,將下載或上傳任務(一個檔案或一個壓縮包)人為的劃分為幾個部分,每一個部分採用一個執行緒進行上傳或下載,如果碰到網路故障,可以從已經上傳或下載的部分開始繼續上傳下載未完成的部分,而沒有必要從頭開始上傳下載。使用者可以節省時間,提高速度。

斷點續傳

為什麼需要斷點續傳?

檔案上傳過程
使用者在前端選擇好要上傳的檔案,然後後端處理檔案,先將檔案載入到執行記憶體中,然後系統呼叫相關的API(應用程式介面)將檔案寫入到硬碟中

兩個原因:

  • 當上傳的檔案過大時會導致請求速度下降,佔用過多的頻寬資源
  • 如果上傳檔案的過程中發生了網路中斷、服務中斷、等導致上傳過程中斷的情況,就可能會導致檔案重新上傳

所以需要斷點續傳來保證上傳檔案的效率(主要是針對大檔案的上傳)

斷點續傳原理

服務端給客戶端一個上傳位置標記p,然後客戶端將檔案指標移動到標記p位置,將檔案剩餘部分通過輸入流上傳給服務端(客戶端記錄自己的下載位置,若下載中斷,下次下載的時候傳送下載資料的時候,告訴服務端開始下載,下載多少資料)

什麼是斷點?
檔案上傳過程中,檔案被分為N塊,然後使用多執行緒併發上傳,當該過程因為某種原因中斷時,此時中斷的位置就叫做斷點
什麼是續傳?


從斷點(上傳中斷的位置)繼續上傳剩餘的檔案
續傳是如何實現的?

  • 先確定需要續傳的檔案,通過對檔案進行MD5加密作為檔案的識別符號
  • 在HTTP協議中斷點續傳的幾個頭部資訊
    下載響應頭部
Accept-Ranges: 伺服器告訴客戶端自己支援資源傳輸範圍的定義,告訴客戶端自己支援斷點續傳
Accept-Ranges:bytes
Content-Range: bytes 200-1000/*
* 指的是檔案總大小

請求頭部

Range: 客戶端告訴伺服器,自己想要的資料資源範圍
Range: bytes = 200-1000 想要檔案第200位元組長度共801個位元組,則開啟檔案跳轉讀寫位置到200
        然後讀取801
位元組資料響應,檔案資源的部分響應狀態碼是206而不是200,響應碼為200:指全部下載

斷點續傳的關鍵:伺服器上所需下載的資料沒有被修改,所以需要,當客戶端需要斷點續傳的時候,將服務端檔案的Etag資訊傳遞回來,判斷當前檔案與想要斷點續傳的檔案是否一致,若一致則斷點續傳響應碼為206,若不一致則全部下載,響應碼為200

ETag

HTTP1.1用ETag來判斷請求的檔案是否被修改
ETag: 被請求變數的實體值,用於標識資源的狀態,當資源發生改變時,ETag也隨之發生改變

Content-Range

用於響應頭部中,在發出帶有Range的請求後,服務端會在Content-Range頭部返回當前接受的範圍和檔案總大小

  • 格式
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
Content-Range: bytes 0-500/1000
0-500:指當前傳送的資料範圍
1000:指檔案總大小

響應完成後返回的響應頭部內容

HTTP/1.1 200 Ok(不使用斷點續傳方式) 
HTTP/1.1 206 Partial Content(使用斷點續傳方式)

Range

  • 用於請求頭部中,告知資料範圍(第一個位元組到最後一個位元組)

格式

Range:(unit=first byte pos)-[last byte pos]
Range: bytes=0-499 表示第 0-499 位元組範圍的內容 
Range: bytes=500-999 表示第 500-999 位元組範圍的內容 
Range: bytes=-500 表示最後 500 位元組的內容 
Range: bytes=500- 表示從第 500 位元組開始到檔案結束部分的內容 
Range: bytes=0-0,-1 表示第一個和最後一個位元組 
Range: bytes=500-600,601-999 同時指定幾個範圍

If-Range

判斷實體是否發生改變,如果實體沒有發生改變,服務端則傳送客戶端丟失的部分,否則傳送整個實體

  • 格式
If-Range: Etag | HTTP-Date
  • If-Range 必須與 Range 配套使用。如果請求報文中沒有 Range,那麼 If-Range 就會被忽略。如果伺服器不支援 If-Range,那麼 Range 也會被忽略。
  • 若一致則斷點續傳,響應碼為206,若不一致則全部下載,響應碼為200