HTTP介绍
HTTP即超文本传输协议(Hypertext Transfer Protocol)马,超链接,图片,视频等都属于超文本##
为什么需要协议
- 需要明确的边界,信息的开始和结束
- 能够携带信息,包括什么信息,信息的类型等
协议里有什么
-
请求行/状态行
- 请求行包括方法名(GET,POST等),URL和协议版本
- 状态行包括协议版本,状态码,状态码描述等
-
请求头/相应头
-
请求体/相应体
请求流程
客户端业务层->中间件层->协议编码解码层->传输层->服务器传输层
服务器传输层->编码解码层->路由层->中间件层->服务器业务层->
HTTP的演化
HTTP/1.1
相对于HTTP/1.0使用长连接和管道传输
存在的性能瓶颈:
- 头部不压缩,只压缩Body,首部信息越大延迟越大
- 发送重复的头部信息浪费大
- 存在响应的队头阻塞
- 没有请求优先级
- 请求只能由客户端发出,服务器只能被动响应
HTTP/2.0
HTTP/2.0基于HTTPS
相对于HTTP/1.1
- 头部压缩
- 二进制格式
- 并发传输
- 服务器可主动推送资源
服务器和客户端都可建立Stream,服务器的Stream ID必须是偶数,客户端必须是奇数;若客户端请求一个HTML文件,但需要CSS文件来渲染,使用HTTP/2.0就不需要再发送一次请求获取CSS,服务器主动发送CSS文件,提高效率
缺陷
HTTP/2.0解决了HTTP/1.1的响应队头阻塞,解决了HTTP层的队头阻塞问题,但仍存在队头阻塞问题;由于HTTP/2.0基于TCP协议,TCP必须保证接受到的字节数据完整且连续,若存在字节缺失,则后面收到的信息全部阻塞到缓冲区中,直到重新发送该缺失字节
所以一旦丢包,就会触发TCP重传,在一个TCP连接中的所有HTTP请求都必须等待该包被重传
HTTP/3.0
HTTP/3.0将HTTP下层协议从TCP协议改为UDP协议,通过基于UDP的QUIC协议也可以实现类似TCP的可靠性传输
QUIC有以下三个特点:
- 无队头阻塞
- 更快建立连接
- 连接迁移
HTTP框架的设计与实现
分层设计
HTTP协议专注于OSI七层网络的第四层往上,应用层,表示层和会话层,即TCP/IP四层概念模型的应用层
分层设计:高内聚,低耦合,易复用和高拓展性
一个切实可行的复杂系统势必是从一个切实可行的简单系统发展而来的。从头开始设计的复杂系统根本不切实可行,无法修修补补让它切实可行。你必须由一个切实可行的简单系统重新开始。
应用层设计
-
提供合理的API
- 可理解性:使用ctx.Body(),不要用ctx.BodyA(),A意义不明
- 简单性
- 冗余性
- 兼容性
- 可测性
- 可见性
中间件设计
需求
- 配合 Handler实现一个完整的请求处理生命周期
- 拥有预处理逻辑与后处理逻辑
- 可以注册多中间件
- 对上层模块用户逻辑模块易用
洋葱模型
- 中间件类似调用函数
- 用户不主动调用下一个处理函数则自动调用,帮助index递增
- 令index为最大值就可以中值调用
- 若不在一个调用链上,需要手动调用Next
路由设计
框架路径实际上就是为URL匹配相应的处理函数,比如静态路由,参数路由,匹配HTTP方法等.
- 用map实现路由,只适用于静态路由
- 用前缀匹配树优化等
如何匹配HTTP方法?
- 构建map,外层map使用Method(string)作为key,路由树作为value,然后在路由树中寻找
协议层设计
- 抽象出合适的接口
网络层设计
- BIO:阻塞
- NIO:非阻塞:netpoll,网络库管理buffer