[ HTTP框架基础 | 青训营笔记 ]

88 阅读3分钟

1. HTTP协议

  • HTTP 全称叫做超文本传输协议(HyperText Transfer Protocol)。HTTP是为超文本服务的传输协议。「超文本」,是文字、图片、视频以及超链接等的混合体。
  • 为什么需要协议:我们在网络上传输的都是一些 01 数据流,需要按照一定的编码规范进行编码才能够让通信双方理解。
  • 协议内容:
    1. 明确边界:通过协议规定数据流种的HTTP请求是从何时开始以及何时结束的。
    2. 协商元数据:描述HTTP协议传输数据的信息
    3. 数据部分:真正传输的数据,比如文本、图片、视频等。
  • HTTP协议的请求和响应:

image.png

HTTP协议的请求和响应都是三段式的结构:

1.请求行中描述请求方法、URL、协议版本号;状态行中描述协议版本、状态码、和状态码描述。

2.请求头和响应头中则描述包的一些元数据,它的长度是不固定的,以两个换行符表明协议结束,可以分为协议相关和业务相关。

3.请求体和响应体中则存放具体传输的数据。

  • 三种常见协议的对比
    • HTTP1:1.基于 TCP 实现,存在队头阻塞。2.传输效率低,头部冗余字段比较多。即使传输的数据量很少,请求头中也会存在大量的字段。3.明文传输不安全。
    • HTTP2:1.基于 HTTPS ,保障了安全性;2.实现了头部压缩,如果同时发出多个请求的请求头是一样的或是相似的,那么,协议会帮你消除重复的部分;3.全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧;4.并发传输,引出了 Stream 概念,多个 Stream 复用一条 TCP 连接。
    • QUIC:1.基于UDP实现,解决了队头阻塞;2.加密算法优化,减少握手开销;3.支持快速启动。

2. HTTP框架的设计

需要考虑高内聚、低耦合、易用性和高扩展性

image.png 使用分层设计,层与层之间使用接口解耦。

  1. 应用层:对请求和响应进行抽象,提供丰富易用的API。API设计应该满足可理解性、简单性、兼容性、可测性,保证非冗余和合理的可见性。
  2. 中间件层:配合Handler实现一个完整的请求处理声明周期,对的求进行预处理或后处理逻辑,对上层易用。
  3. 路由层:提供路由注册和寻址等功能,包括:静态路由、参数路由、路由修复功能、路由冲突处理以及优先级等。
  4. 协议层:提供不同协议实现的支持能力。
  5. 网络层:提供替换不同网络库的能力(数据处理方式BIO/NIO)。

3. HTTP框架的性能优化

  • 针对go net网络库的优化需求:存下全部Header、减少系统调用次数、能够复用内存、能够多次读 -> 绑定一块缓冲区。
  • 针对netpoll网络库的优化需求:存下全部Header、拷贝出完整的Body -> 分配足够大的buffer、限制最大buffer size。
  • Headers解析优化
  • 热点资源池化