學習記錄 斷點續傳 秒傳究竟是如何實現的

2021-10-08 14:09:02 字數 2584 閱讀 5192

作者簡介:朱鋼,筆名喵叔,csdn部落格專家,.net高階開發工程師,7年一線開發經驗,參與過電子政務系統和ai客服系統的開發,以及網際網路招聘**的架構設計,目前就職於北京恆創融慧科技發展****,從事企業級安全監控系統的開發。

零、斷點續傳

斷點續傳說白了就是將乙個檔案按照一定的規則人為的分割成多個小檔案,然後客戶端每次只上傳乙個小檔案(當然我們也可以利用多執行緒技術每次上傳多個小檔案),伺服器接收到上傳過來的小檔案後根據一定的規則來組合這些小檔案。如果在上傳過程**現網路中斷等意外情況,下次再次上傳時可以從已經上傳的部分繼續上傳,而不是重新上傳。

從 http1.1 協議開始就已經支出獲取檔案的部分內容,斷點續傳技術就是利用 http1.1 協議的這個特點在 header 裡新增兩個引數來實現的。這兩個引數分別是客戶端請求時傳送的 range 和伺服器返回資訊時返回的 content-range - range,range 用於指定第乙個位元組和最後乙個位元組的位置,格式如下:

range:(unit=first byte pos)-[last byte pos]

range 常用的格式有如下幾種情況:

range:bytes=0-1024 ,表示傳輸的是從開頭到第1024位元組的內容;

range:bytes=1025-2048 ,表示傳輸的是從第1025到2048位元組範圍的內容;

range:bytes=-2000 ,表示傳輸的是最後2000位元組的內容;

range:bytes=1024- ,表示傳輸的是從第1024位元組開始到檔案結束部分的內容;

range:bytes=0-0,-1 表示傳輸的是第乙個和最後乙個位元組 ;

range:bytes=1024-2048,2049-3096,3097-4096 ,表示傳輸的是多個位元組範圍。

content-range content-range 用於響應帶有 range 的請求。伺服器會將 content-range 新增在響應的頭部,格式如下:

content-range:bytes(unit first byte pos)-[last byte pos]/[entity length]

常見的格式內容如下:

content-range:bytes 2048-4096/10240

這裡邊 2048-4096 表示當前傳送的資料範圍, 10240 表示檔案總大小。

這裡我順便說一下,如果在客戶端請求報文頭中,對 range 填入了錯誤的範圍值,伺服器會返回416 狀態碼。416 狀態碼表示伺服器無法處理所請求的資料區間,常見的情況是請求的資料區間不在檔案範圍之內,也就是說,range 值,從語法上來說是沒問題的,但從語義上來說卻沒有意義。

當然光有 range 和 content-range 還是不夠的,我們還要知道服務端是否支援斷點續傳,只需要從如下兩方面判斷即可:

判斷服務端是否只 http/1.1 及以上版本,如果是則支援斷點續傳,如果不是則不支援

服務端返回響應的頭部是否包含 access-ranges ,且引數內容是 bytes 符合以上兩個條件即可判定位支援斷點續傳。

校驗某些檔案只是修改了修改時間而內容卻沒變,這時我們並不希望客戶端重新快取這些檔案;

某些檔案修改頻繁,有時一秒要修改十幾次,但是 if-modified-since 是秒級的,無法判斷比秒更小的級別; 部分伺服器無法獲得精確的修改時間。 要解決上述問題我們就需要用到 etag ,只需將相關標記(例如檔案版本號等)放在引號內即可。

當使用校驗的時候我們不需要手動實現驗證,只需要利用 if-range 結合 last-modified 或者 etage 來判斷是否發生改變,如果沒有發生改變伺服器將向客戶端傳送剩餘的部分,否則傳送全部。

注意:if-range 必須與 range 配套使用。缺少其中任意乙個另乙個都會被忽略。

原理

秒傳利檔案的md5,首先將檔案的md5傳送個伺服器,伺服器傳輸過來的md5判斷伺服器上是否存在相同型別的檔案,**如果存在就將檔案複製乙份,而不是本地上傳。**這樣就是先的秒傳功能。

md5

秒傳涉及到了md5,那麼什麼md5呢?md5的英文全稱是 message-digest algorith 5 ,是計算機廣泛使用的演算法之一。 md5 會為檔案產生唯一的「指紋」,任何改動都會改變檔案指紋。它以 512位分組來處理資訊,每個分組又被分為16個32位分組,經過處理後輸出4個32位分組,最後將輸出的4個32位分組進行級聯生成128位雜湊值。

md5的具有壓縮性、易計算、抗修改、弱抗碰撞和強抗碰撞。下面我們一一來講解:

壓縮性:任意長度資料,生成的md5值長度是固定的;

易計算:可以很方便的從原始資料計算出md5;

抗修改:對原始資料的任何修改,都會改變md5;

弱抗碰撞和強抗碰撞:很難找到具有相同md5的資料。

破解謠言:有人說網盤能秒傳證明資料在網盤伺服器是不加密的,有資料庫檢視許可權的人都可以看,所以私密檔案最好在本地磁碟加密後再上傳到網盤中。這句話是錯誤的,正規的網盤伺服器只是驗證了檔案的md5碼,檔案還是加密存放的。

【end】

Android斷點續傳學習

urlconnection.setrequestproperty range bytes start info.getlength 2 檔案移動到指定位置 randomfile.seek start 其他的沒有難度,很簡單 可以使用資料庫或者檔案作為快取檔案 主要是乙個思路 這裡簡單的記錄一下 作為...

HTTP 斷點續傳

客戶端請求域 range 格式如下例子 第乙個500位元組 位元組偏移量0 499,包括0和499 range bytes 0 499 第二個500位元組 位元組偏移量500 999,包括500和999 range bytes 500 999 最後500位元組 位元組偏移量9500 9999,包括9...

IOS斷點續傳

asihttprequest可以實現斷點續傳。網上有一些介紹類似使用 request setallowresumeforfiledownloads yes 不過,通過asihttprequest的非同步請求以及delegate還是可以實現斷點續傳的。本文還是以grails編寫斷點續傳伺服器端為例。非...