零、斷點續傳
簡述原理
斷點續傳說白了就是將乙個檔案按照一定的規則人為的分割成多個小檔案,然後客戶端每次只上傳乙個小檔案(當然我們也可以利用多執行緒技術每次上傳多個小檔案),伺服器接收到上傳過來的小檔案後根據一定的規則來組合這些小檔案。如果在上傳過程**現網路中斷等意外情況,下次再次上傳時可以從已經上傳的部分繼續上傳,而不是重新上傳。
詳細講解
從 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的英文全稱是 message-digest algorith 5 ,是計算機廣泛使用的演算法之一。 md5 會為檔案產生唯一的「指紋」,任何改動都會改變檔案指紋。它以 512位分組來處理資訊,每個分組又被分為16個32位分組,經過處理後輸出4個32位分組,最後將輸出的4個32位分組進行級聯生成128位雜湊值。
md5的具有壓縮性、易計算、抗修改、弱抗碰撞和強抗碰撞。下面我們一一來講解:
壓縮性:任意長度資料,生成的md5值長度是固定的;
易計算:可以很方便的從原始資料計算出md5;
抗修改:對原始資料的任何修改,都會改變md5;
弱抗碰撞和強抗碰撞:很難找到具有相同md5的資料。
破解謠言:有人說網盤能秒傳證明資料在網盤伺服器是不加密的,有資料庫檢視許可權的人都可以看,所以私密檔案最好在本地磁碟加密後再上傳到網盤中。這句話是錯誤的,正規的網盤伺服器只是驗證了檔案的md5碼,檔案還是加密存放的。
這篇文章講解了斷點續傳和秒傳的知識,也講解了它們所使用技術的相關知識點。這些知識可以用在任何程式語言的斷點續傳和秒傳的開發中,因此這篇文章我並沒有根據具體的語言講解。
斷點續傳的原理
斷點續傳的原理 其實斷點續傳的原理很簡單 打個比方,瀏覽器請求伺服器上的乙個文時,所發出的請求如下 假設伺服器網域名稱為w www.sjtu.edu.cn 檔名為down.zip。伺服器收到請求後,按要求尋找請求的檔案,提取檔案的資訊,然後返回給瀏覽器,返回資訊如下 200 content leng...
斷點續傳的原理
其實斷點續傳的原理很簡單,就是在http的請求上和一般的 有所不同而已。打個比方,瀏覽器請求 伺服器上的乙個文時,所發出的請求如下 假設伺服器網域名稱為wwww.sjtu.edu.cn,檔名為down.zip。伺服器收到請求後,按要求尋找請求的檔案,提取檔案的資訊,然後返回給瀏覽器,返回資訊如下 2...
android斷點續傳原理
httpurlconnection.setrequestproperty range bytes mdownloadtask.getdownloadsize 總碼 inputstream inputstream httpurlconnection.getinputstream 斷點上傳 filein...