# HTTP 请求头 Range 信息

请求资源的部分内容，单位是 byte（字节），从0开始。
如果请求头携带了 Range 信息，也就是分批下载，这时候服务器会返回 206 Partial Content 的状态码及说明。

如果服务器不支持分批下载，那么会返回整个资源的大小以及状态码为200。


## Range 请求头

`Range: bytes=start-end`

例如：
```
Range: bytes=10- //：从第10个字节开始到最后一个字节的数据
Range：bytes=20-39 //：从第20个字节到第39个字节之间的数据
```

注意：整个表示 [start, end] 是前闭后闭的，也就是包含请求头的 start 和 end。所以下次请求应该是 [end+1, nextEnd]。


## Content-Range 响应头

`Content-Range:bytes 0-10/3000`
表示服务器返回了前（0-10）个字节的数据，总共3000字节的数据。


## Content-Type 数据类型
`Content-Type:image/png` 表示资源类型是 png 格式的图片

## Content-Length 资源的长度

`Content-Length:11` 表示服务器响应了11个字节的数据

## Last-Modified

`Last-Modified:Tue, 30 Jun 2018 03:12:48 GMT` 表示资源最近被修改的时间，如果分批下载的时候发现 Last-Modified 被修改了，那么需要重新下载

## ETag

`ETag: W/&quot;3103-1435633968000&quot;` 表示资源版本的标示符。通常是消息摘要（类似MD5）。分段下载时需要注意，或者缓存控制也需要注意。如果是分布式缓存系统，需要确保每台计算机的 ETag 计算规则的一致性，缓存的过期需要结合 ETag 和 Last-Modified 共同决定。

## 分段下载

利用 HTTP 的头信息的上述几个特点，我们可以充分利用多线程的能力。

- 先发送一个 HEAD 方法的请求，知道总文件大小（Content-Length 就是总字节大小）
- 多线程下载（线程1:Range:bytes=0-100，线程2:Range:bytes=100-200,...）