HTTP Q&A
HTTP与Websocket的区别是?
- http一次性请求,即使使用了Keep-Alive保留了tcp连接,也需要client发起请求,一次client请求对应一个server响应
- websocket则是创建了tcp连接后,client和server可以双向请求,适用于server要主动请求的场景。
Keep-Alive下,HTTP client的请求如何复用之前的connection?
- server会返回response header
Connection: keep-alive
,以及timeout的时间 - client可以建立session维护连接池,在请求同一个目标(host+port)时,重复使用active的连接
- curl默认支持keep-alive
- 在浏览器中,浏览器自动管理keep-alive连接,当需要访问同一域名时会复用active的连接
- http2支持Multiplexing,单个tcp连接上可以同时传输多个请求,按ID区分
流式传输(Streaming Transfer/Chunked Transfer Encoding)?
- 即client请求之后,服务器可以通过设置
Transfer-Encoding: chunked
response header让客户端知道这是一个流式传输 - 在python中,client可以在请求时设置
streaming=True
,可以逐块处理server的响应for chunk in response.iter_content(chunk_size=8192):
直到chunked finished - 适用于实时日志流、大型响应数据。
server如何让client知道响应是一个文件?
- 通过设置response headers,
Content-Disposition: attachment; filename="%s";
,
server如何让client知道下载的文件是pdf?
- 通过设置
contenType
为application/pdf
server如何压缩response
- client可以在request headers中指定压缩编码
Accept-Encoding: gzip, deflate, br
- 可以通过
gzip
等经典方式,server返回response header,Content-Encoding: gzip
一次response的最大响应?
- 大小没有明确的限制,取决于服务器的处理能力
- Nignx默认response最大为100m
- 客户端可能对response的最大长度有限制,难以处理(比如在屏幕上难以完全展示)
- 一般过大的文件推荐使用流式传输来分chunked处理
server如何传输超大响应(>1GB
)
特性/方式 | 流式传输 | 分页 | 分块下载 | 数据分片 | 文件分块传输 |
---|---|---|---|---|---|
主要场景 | 实时数据流 | 大数据集分页展示 | 大文件断点续传 | 分布式数据存储/查询 | 上传或下载超大文件 |
数据单位 | 按数据块(chunk)传输 | 每页记录 | 文件的部分字节 | 数据集的逻辑片段 | 文件的物理块 |
客户端请求次数 | 1 次 | 多次(按页请求) | 多次(按范围请求) | 多次(按分片规则访问) | 1 次或多次 |
实时性 | 高 | 低 | 中 | 中 | 低 |
典型应用 | 视频流、日志流监控 | 数据分页展示 | 视频、文件下载 | 分布式数据库(如 MongoDB) | AWS S3 多部分上传 |
断点续传支持 | 不支持 | 不支持 | 支持 | 不涉及 | 支持 |
其中
- 流式传输为http原生支持
Transfer-Encoding: chunked
- 分块下载也是http原生支持,使用 HTTP 的
Range
头来指定字节范围,服务器返回206 Partial Content
响应。 - 分页和数据分片属于应用层API的设计,pagination和数据库sharding
- 文件分块传输也是应用层API设计, client请求时明确上传哪些块的数据,server收到后保存起来