面试题答案
一键面试1. 帧和流的机制实现并行处理
- 帧(Frame):
- HTTP/2 协议将数据分割为更小的单元,即帧。每个帧都有特定的类型,如 HEADERS 帧用于传输请求头或响应头,DATA 帧用于传输请求体或响应体。
- 不同类型的帧在客户端和服务器之间进行双向传输。例如,客户端可以发送 HEADERS 帧发起请求,紧接着发送 DATA 帧传输请求体;服务器收到后,以同样方式返回 HEADERS 帧和 DATA 帧。
- 这些帧在连接上交错传输,不再像 HTTP/1.1 那样需要按顺序逐个处理请求和响应,从而实现了并行性。
- 流(Stream):
- 流是一个独立的、双向的帧序列,用于在客户端和服务器之间传输特定的请求和响应。每个流都有唯一的标识符(Stream ID)。
- 多个流可以在同一个 TCP 连接上同时存在并并行传输。例如,客户端可以同时发起多个请求,每个请求对应一个不同的流 ID,服务器也能通过流 ID 准确区分并处理不同的请求,然后通过相应的流返回响应。这样,多个请求和响应就可以在同一连接上并行处理,大大提高了传输效率。
2. 流的优先级管理
- 优先级标识:
- 在 HTTP/2 中,每个流都可以被赋予一个优先级。优先级通过 HEADERS 帧中的特定字段来表示,包括权重(一个介于 1 到 256 之间的数字)和依赖关系。
- 权重越高,该流在资源分配时会得到更多的优先级。例如,对于关键资源(如网页的关键 CSS 和 JavaScript 文件)的请求流,可以设置较高的权重,使其在网络拥塞等情况下优先得到处理。
- 依赖关系:
- 流之间还可以定义依赖关系。例如,流 A 可以依赖于流 B。这意味着在处理流 A 之前,必须先处理完流 B。通过这种依赖关系,可以确保资源的加载顺序符合逻辑,比如先加载基础的样式表,再加载依赖于该样式表的特定页面样式。
- 依赖关系也可以是间接的,形成一个优先级树结构。HTTP/2 实现会根据这些权重和依赖关系,动态地分配网络资源,优先处理高优先级的流,从而优化整体的传输性能。