Files
knowledge-kit/Chapter5 - Network/5.1.md
2020-02-25 17:46:51 +08:00

48 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HTTP 请求头 Range 信息
请求资源的部分内容,单位是 byte字节从0开始。
如果请求头携带了 Range 信息,也就是分批下载,这时候服务器会返回 206 Partial Content 的状态码及说明。
如果服务器不支持分批下载那么会返回整个资源的大小以及状态码为200。
## Range 请求头
`Range: bytes=start-end`
例如:
```
Range: bytes=10- //从第10个字节开始到最后一个字节的数据
Rangebytes=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/"3103-1435633968000"` 表示资源版本的标示符。通常是消息摘要类似MD5。分段下载时需要注意或者缓存控制也需要注意。如果是分布式缓存系统需要确保每台计算机的 ETag 计算规则的一致性,缓存的过期需要结合 ETag 和 Last-Modified 共同决定。
## 分段下载
利用 HTTP 的头信息的上述几个特点,我们可以充分利用多线程的能力。
- 先发送一个 HEAD 方法的请求知道总文件大小Content-Length 就是总字节大小)
- 多线程下载线程1:Range:bytes=0-100线程2:Range:bytes=100-200,...