1. 程式人生 > >網路應用(4):塊的概念 | Range

網路應用(4):塊的概念 | Range

分塊來處理,也算是自然的想法,就是化整為零。而於對於檔案的下載同樣使用這個道理,既可整體下載,也可分塊下載。

小程這裡以http協議為例,來看一下塊的概念與使用。

http的range

http1.0請求與返回檔案都是整體,不支援“只拿一部分資料”,伺服器也不支援斷點續傳(因為不支援從某個點開始拿部分資料),對於這個特徵你可能已經想到不足--要整個來下,如果失敗又要重來,那不是麻煩s了?能不能按塊按需地下載啊?

既然你有意見了,那http1.1就開始支援只拿部分資料,也支援斷點續傳(從某點開始下載部分資料),但這時伺服器也可以設定為不支援。

這個“拿部分資料”,在http上,也叫分段、分範圍,或直接叫分range,因為在http請求頭或響應頭使用了Range關鍵字。

考慮到伺服器可能不支援range請求,所以客戶端在想分range取資料時,最好先跟服務端確認一下:“大哥你支援range嗎?”

如果想測試伺服器是否支援range,可以發一個head請求來看一下:

curl -I "https://free-picture1.oss-cn-shenzhen.aliyuncs.com/%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8/%E6%8A%93%E5%8C%85/%E4%BF%AE%E6%94%B9%E7%9B%AE%E6%A0%87id.png"

可以看到這樣的響應:

注意Accept-Ranges欄位,如果值是bytes,就是支援range請求。如果沒有這個欄位,或者值為none,就是不支援range請求。

如果想整個檔案請求,那可以不使用range欄位,也可以使用range,如:Range: bytes=0-,比如這樣:

curl -I -H "Range: bytes=0-" "https://free-picture1.oss-cn-shenzhen.aliyuncs.com/%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8/%E6%8A%93%E5%8C%85/%E4%BF%AE%E6%94%B9%E7%9B%AE%E6%A0%87id.png"

這時是整個檔案請求,跟不加range的含義是一樣的,但伺服器的響應不再是200,而是206(部分資料),但長度還是整個檔案的長度:

顯然這裡的重點是,使用range進行分段請求,比如:

curl -I -H "Range: bytes=0-1023" "https://free-picture1.oss-cn-shenzhen.aliyuncs.com/%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8/%E6%8A%93%E5%8C%85/%E4%BF%AE%E6%94%B9%E7%9B%AE%E6%A0%87id.png"

這裡請求了1024個位元組(左閉右閉區間),可以看到這樣的響應:

“塊”的管理

以上用http示例,以range來下載資料塊,對於其它協議,比如p2p,一樣能夠以塊來下載資料,而且還必須以塊下載才滿足業務需求,業務就是老大。

如果是分塊下載,那最好有一個塊的非業務的基本管理模組。塊的基本管理模組的設計,最重要的是選擇何種資料結構,對於c++來說,map是還不錯的選擇。

這個塊管理類,應該能add一個塊(也就是一個區間),能判斷塊是否已經存在,等等。

比如,用c++,這個類可以這樣宣告:

class RangeMgr
{
public:
void addRange(long long pos, long long len);
bool hasRange(long long pos, long long len) const;
private:
std::map<long long, long long> m_ranges;
};

這個range管理類應該按場景來增加功能,比如合併重疊的區間,判斷從某個點開始有多少資料,等等,具體由你的應用場景來驅動,我不多話了,但你至少要能提出“塊”的概念吧。


相關推薦

網路應用4概念 | Range

分塊來處理,也算是自然的想法,就是化整為零。而於對於檔案的下載同樣使用這個道理,既可整體下載,也可分塊下載。 小程這裡以http協議為例,來看一下塊的概念與使用。 http的range http1.0請求與返回檔案都是整體,不支援“只拿一部分資料”,伺服器也不支援斷點續傳(因為不支援從某個點開始拿部分資料),

網路應用3CDN與P2P的概念

我前面說了流量的概念,流量是使用網路時經常要考慮的一個因素--如何才能更快的使用流量,如何才能節省流量使用的成本,對於這樣的問題,你可能要了解一下什麼是cdn,什麼是p2p。 (1)cdn是什麼 cdn是一個基於已有的internet網路而進行擴充套件的網路系統,叫作內容分發網路,content delive

Linux同步與相互排斥應用基礎概念

使用 line 關系 並發執行 來看 文章 必須 生產者 而且 【版權聲明:尊重原創,轉載請保留出處:blog.csdn.net/shallnet 或 .../gentleliu,文章僅供學習交流,請勿用於商業用途】 當操作系統進入多道批處理

NS3網路模擬4 DataRate屬性

快樂蝦歡迎轉載,但請保留作者資訊在first.py中建立了一個點到點的通道,且配置了兩個屬性:pointToPoint = ns.point_to_point.PointToPointHelper() pointToPoint.SetDeviceAttribute("Data

Postman高階應用4只改一處地方——設定全域性變數

背景 之前我們做過一個案例,就是在cookie設定登入憑證token。但token有時需要改變,而且大量請求都需要用到這個token。每次請求都改掉token顯然不切實際,如果使用上一節介紹的環境變數也無法一次性修改所有請求。這裡帶大家介紹Postman的全域

網路應用1抓包獲取APP的重要資訊 | charles

小白:何為抓包? 小程:就是截獲網路上收發的資料包。 小白:網路上那麼多資料包,怎麼知道哪些是有用的? 小程:只截獲目標app的資料包就縮小了範圍,但即便是縮小了範圍,也需要進一步分析與排查。 小白:在垃圾堆裡找壞人的行動時間與地點嗎?這是使徒行者2的橋段啊,你有沒有看過? "抓

網路應用2流量與位元速率等 | 流量、頻寬、速度、位元速率

架設網路,按規定,需要拿到工信部頒發的營業執照。我們使用的網路,由運營商提供。運營商指的是網路運營商(提供網際網路服務的組織,也叫ISP),包括:移動、電信、網通、鐵通、長城、天威、教育網、廣電、方正,等等。 現在,運營商提供網路,是收費的,收費的理由,主要還是運營商提供了通道(基站建議等),就相當收路費。那

網路應用6http報文結構與curl的使用

http是一個協議,協議就是約定、規定,先不管為什麼這麼約定有什麼高深的東西,為了解決具體問題,我們先要能使用協議,理解協議中對我們有用的那部分資料,是的,我們不是研究生,更不是純研究,所有的研究都要由具體的問題來驅動。 那這裡的具體問題是什麼?就是看懂http的請求跟回覆啊,就像寫某某申請一樣,你不理申請最

網路應用8http的封裝與使用

之前講過http的協議,怎麼約定請求或響應的行、頭、體,也介紹怎麼使用curl來完成http的請求。這一次,再接再厲,換一個角度換一些角色,再次說http的封裝與使用。反正目的只有一個:加深對http協議的理解。 (1)tcp的實現 說http的實現,非講tcp不可(為什麼?後面會解釋),而之前講tcp協議的

網路應用簡記4DNS使用

dns,domain name system,域名系統,把域名轉化成ip的系統。 先來看几上工具的使用,這幾個工具都能把域名轉換成ip,都使用了dns。dns就好比資料庫,通過對它的查詢,能給url找到對應的ip。 (1)dig dig的簡單使用是這樣: dig baidu.

Python從菜鳥到高手4導入Python模

imp port fun code image 技術分享 pro 出版 麻煩 在Python代碼中導入模塊需要使用import語句,語法結構如下: import module_name ??引用模塊中函數的語法如下: module_name.function_name ??

由散列表到BitMap的概念應用面試中的海量資料處理

一道面試題 在面試軟體開發工程師時,經常會遇到海量資料排序和去重的面試題,特別是大資料崗位。 例1:給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4G,找出a、b檔案共同的url? 首先我們最常想到的方法是讀取檔案a,建立雜湊表,然後再讀取檔案b,遍歷檔

【複雜網路】複雜網路分析庫NetworkX學習筆記4統計指標計算

無論是實際網路還是對模型網路進行分析,都離不開對網路拓撲統計指標的計算。反映網路結構與動力學特性的統計指標有很多,Costa等的Characterization of Complex Networks: A Survey of measurements一文對此有全面的綜述,本文僅介紹一些常用的統計指

卷積神經網路簡單的應用目的與資料

目的構建一個卷積神經網路對性別以及美麗程度(beautiful or handsome)進行識別。資料準備模型中採用的資料來自百度搜索資料,為了效率可採用爬蟲(大家可以在以下相關程式碼上進行更改):http://blog.sina.com.cn/s/blog_13927ddb50102w2m1.html,下圖

卷積神經網路簡單的應用模型測試

模型測試模型訓練好之後通過重新載入模型的方式進行模型測試,使用Tensorflow中的Saver物件。相關程式碼如下:def test_cnn(x_data): output = create_cnn(4) saver = tf.train.Saver()

卷積神經網路簡單的應用模型構建與訓練

模型構建文中採用了Tensorflow框架進行模型的構建,這裡簡單介紹下Tensorflow的安裝(在Anaconda上安裝):⑴Anaconda安裝:https://www.anaconda.com/download/,選擇支援py36的版本;⑵直接在命令列中安裝Tenso

Unity如何實現網路通訊觀察者模式以及在網路模組的應用

    首先我們來說一下什麼叫觀察者模式。觀察者模式,顧名思義,就是觀察,那麼就會有觀察者和被觀察者,比如在軍隊中,所有的軍人要聽長官的指示,軍人就是觀察者,長官就是被觀察者,長官一聲號令:“向左轉!”,長官所有的監聽者就會執行向左轉的方法,那麼這就是一個觀察者模式的流程

【H.264/AVC視訊編解碼技術詳解】十三、熵編碼演算法4H.264使用CAVLC解析巨集的殘差資料

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

區塊鏈學堂4以太坊基本概念及工具Geth、Browser-solidity、Mist

在我研究以太坊技術的過程中,由於相關資料較少,因此走了較多的彎路。所以這裡我們不會先介紹Solidity的語法結構,而會在接下來的第一階段,從實戰出發,陸續向大家介紹Geth、Browser-solidity、Mist這三大工具,並在過程中不斷講解以太坊的基本概念。 通過這

學習android 筆記4如何獲取螢幕的相關屬性以及dp 、dip、dpi 、px的概念

<span style="font-size:24px;">DisplayMetrics dm = new DisplayMetrics(); getWindowManager().g