1. HTTP协议
- HTTP 全称叫做超文本传输协议(HyperText Transfer Protocol)。HTTP是为超文本服务的传输协议。「超文本」,是文字、图片、视频以及超链接等的混合体。
- 为什么需要协议:我们在网络上传输的都是一些 01 数据流,需要按照一定的编码规范进行编码才能够让通信双方理解。
- 协议内容:
- 明确边界:通过协议规定数据流种的HTTP请求是从何时开始以及何时结束的。
- 协商元数据:描述HTTP协议传输数据的信息
- 数据部分:真正传输的数据,比如文本、图片、视频等。
- HTTP协议的请求和响应:
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框架的设计
需要考虑高内聚、低耦合、易用性和高扩展性
使用分层设计,层与层之间使用接口解耦。
- 应用层:对请求和响应进行抽象,提供丰富易用的API。API设计应该满足可理解性、简单性、兼容性、可测性,保证非冗余和合理的可见性。
- 中间件层:配合Handler实现一个完整的请求处理声明周期,对的求进行预处理或后处理逻辑,对上层易用。
- 路由层:提供路由注册和寻址等功能,包括:静态路由、参数路由、路由修复功能、路由冲突处理以及优先级等。
- 协议层:提供不同协议实现的支持能力。
- 网络层:提供替换不同网络库的能力(数据处理方式BIO/NIO)。
3. HTTP框架的性能优化
- 针对go net网络库的优化需求:存下全部Header、减少系统调用次数、能够复用内存、能够多次读 -> 绑定一块缓冲区。
- 针对netpoll网络库的优化需求:存下全部Header、拷贝出完整的Body -> 分配足够大的buffer、限制最大buffer size。
- Headers解析优化
- 热点资源池化