天天看點

15.9 範圍請求

  • HTTP 允許用戶端實際上隻請求文檔的一部分,或者說某個範圍。
  • 假設你正通過慢速的數據機連接配接下載下傳最新的熱門軟體,已經下了四分之三,忽然因為一個網絡故障,連接配接中斷了。你已經為等待下載下傳完成耽誤了很久,而現在被迫要全部重頭再來。
  • 有了範圍請求,HTTP 用戶端可以通過請求曾擷取失敗的實體的一個範圍(或者說一部分),來恢複下載下傳該實體。當然這有一個前提,那就是從用戶端上一次請求該實體到這次發出範圍請求的時段内,該對象沒有改變過。
  • 比如:
GET /bigfile.html HTTP/1.1
Host: www.joes-hardware.com
Range: bytes=4000-
User-Agent: Mozilla/4.61 [en] (WinNT; I) ...
           
  • 在本例中,用戶端請求的是文檔開頭 4000 位元組之後的部分(不必給出結尾位元組數,因為請求方可能不知道文檔的大小)。在用戶端收到了開頭的 4000 位元組之後就失敗的情況下,可以使用這種形式的範圍請求。
  • 還可以用 Range 首部來請求多個範圍(這些範圍可以按任意順序給出,也可以互相重疊)。例如,假設用戶端同時連接配接到多個伺服器,為了加速下載下傳文檔而從不同的伺服器下載下傳同一個文檔的不同部分。對于用戶端在一個請求内請求多個不同範圍的情況,傳回的響應也是單個實體,它有一個多部分主體及 Content-Type: multipart/byteranges 首部。
  • 并不是所有伺服器都接受範圍請求,但很多伺服器可以。伺服器可以通過在響應中包含 Accept-Ranges 首部的形式向用戶端說明可以接受的範圍請求。這個首部的值是計算範圍的機關,通常是以位元組計算的(HTTP/1.1 規範中隻定義了 bytes 記号,但伺服器和用戶端的具體實作可以用它們自己認定的機關來衡量或切分實體)。比如:
HTTP/1.1 200 OK
Date: Fri, 05 Nov 1999 22:35:15 GMT 
Server: Apache/1.2.4
Accept-Ranges: bytes
...
           
  • 下圖展示了涉及範圍請求的一系列 HTTP 事務的例子:
    15.9 範圍請求
  • Range 首部在流行的點對點(Peer-to-Peer,P2P)檔案共享用戶端軟體中得到廣泛應用,它們從不同的對等實體同時下載下傳多媒體檔案的不同部分。
  • 注意,範圍請求也屬于一類執行個體操控,因為它們是在用戶端和伺服器之間針對特定的對象執行個體來交換資訊的。也就是說,用戶端的範圍請求僅當用戶端和伺服器擁有文檔的同一個版本時才有意義。

繼續閱讀