Skip to main content

HTTP Q&A

HTTP与Websocket的区别是?

  • http一次性请求,即使使用了Keep-Alive保留了tcp连接,也需要client发起请求,一次client请求对应一个server响应
  • websocket则是创建了tcp连接后,client和server可以双向请求,适用于server要主动请求的场景。

Keep-Alive下,HTTP client的请求如何复用之前的connection?

  • server会返回response headerConnection: 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?

  • 通过设置contenTypeapplication/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收到后保存起来