1. HTTP协议
1.1 HTTP协议
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它定义了客户端和服务器之间交换数据的格式和传输方式。HTTP协议是互联网上应用最广泛的协议之一,主要用于Web浏览器和服务器之间的通信。
1.2 协议里面有什么
mindmap
HTTP协议
请求行/状态行
方法名
GET
HEAD
POST
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
URL
协议版本
请求头/响应头
请求体/响应体
1.3 请求流程
-
建立连接:
- 客户端通过DNS解析服务器的域名,获取服务器的IP地址。
- 客户端与服务器的HTTP端口(通常是80端口,HTTPS是443端口)建立TCP连接。如果是HTTPS请求,还会建立SSL/TLS加密连接。
-
发送HTTP请求:
-
客户端向服务器发送一个HTTP请求消息。请求消息通常包括以下部分:
- 请求行:包含请求方法(如GET、POST等)、请求的URI和HTTP版本。
- 请求头部:包含一系列的键值对,提供关于请求、客户端能力和期望响应的额外信息。
- 空行:请求头部和实体主体之间的分隔符。
- 实体主体(可选):包含请求的数据,例如表单数据或上传的文件。
-
-
服务器处理请求:
- 服务器接收到请求后,解析请求消息,确定如何处理请求。
- 服务器可能需要进行认证和授权检查。
- 服务器根据请求的URI找到对应的资源或执行相应的操作。
-
服务器响应:
-
服务器生成HTTP响应消息,发送回客户端。响应消息通常包括以下部分:
- 状态行:包含HTTP版本、状态码(如200表示成功)和状态描述。
- 响应头部:包含关于响应的元数据,如内容类型、长度、缓存指令等。
- 空行:分隔响应头部和实体主体。
- 实体主体:包含响应的数据,如HTML页面、图片或JSON数据。
-
-
客户端处理响应:
- 客户端接收到响应后,解析状态码和响应头部,根据状态码决定如何处理响应。
- 如果是成功的响应(如状态码200),客户端会处理实体主体,例如渲染HTML页面或显示图片。
- 如果是重定向响应(如状态码301或302),客户端可能会自动向新的URI发送请求。
- 如果是错误响应(如状态码4xx或5xx),客户端可能会显示错误信息。
-
关闭连接:
- 在HTTP/1.0中,服务器通常在发送完响应后关闭连接。
- 在HTTP/1.1中,默认使用持久连接,除非显式地指定
Connection: close头部,否则连接可能会保持打开状态,以便发送后续请求。
1.4 不足与展望
- 队头阻塞
- 传输效率低
- 明文传输不安全
- 多路复用
- 头部压缩
- 二进制协议
1.5 QUIC协议
-
基于UDP:
- QUIC运行在UDP之上,避免了TCP的一些限制,如队头阻塞(Head-of-Line Blocking)和缓慢的启动时间。
-
性能提升:
- 由于不需要像TCP那样通过三次握手来建立连接,QUIC可以实现更快的连接建立,尤其是在有之前连接历史的情况下。
-
拥塞控制:
- QUIC内置了拥塞控制机制,而不是像TCP那样依赖于操作系统的拥塞控制算法。
-
前向纠错(Forward Error Correction, FEC) :
- QUIC支持前向纠错,允许接收方在丢失少量数据包的情况下恢复数据,而无需重新传输。
-
流的多路复用:
- QUIC允许多个数据流在同一个连接中并行传输,且一个流的丢包不会影响到其他流。
-
加密和安全:
- QUIC默认对所有数据包进行加密,提供了更好的隐私保护和安全性。
-
连接迁移:
- QUIC支持连接迁移,即在网络切换(如从Wi-Fi切换到移动数据)时,保持连接状态不变。
2 HTTP框架设计与实现
2.1 分层设计
graph TD
应用层 --> 中间件层-->路由层-->协议层-->网络层
2.2 应用层设计
提供合理易理解的API
- 可理解性
- 简单性
- 冗余性
- 兼容性
- 可测性
- 可见性
2.3 中间件设计
中间件需求
- 配合Handler实现一个完整的请求处理生命周期
- 拥有预处理逻辑与后处理逻辑
- 可以注册多个中间件
- 对上层模块用户逻辑模块易用
2.4 路由设计
框架路由实际上就是为URL匹配对应的处理函数(Handlers)
- 静态路由:/a/b/c
- 参数路由:/a/:id/c
- 路由修复:/a/b <-->/a/b/
- 冲突路由以及优先级:/a/b、/:id/c
- 匹配HTTP方法
- 多处理函数:方便添加中间件