HTTP协议
Hypertext Transfer Protocol: 超文本传输协议 为了在计算机之间进行信息传输,需要传输协议。超文本的意义——例如图片、音频等,它们是超出简单文本的数据。
- 为什么需要协议?协议里有什么?
协议的边界,协议的元数据,协议的内容。总结下来包含以下三类内容:
- 请求行/状态行
- 请求行由方法名+URL+协议版本组成,方法例如:GET HEAD POST PUT PATHCH等。
- 状态行由协议版本+状态码+状态码描述组成,状态码例如:2xx(成功),4xx(客户端错误)
- 请求头/响应头
- 协议元数据,例如数据长度
- 请求体/响应体
- 真正需要传输的数据包
- 请求行/状态行
- HTTP协议的请求流程 包含业务层,服务治理层,路由层,协议编码解码层,传输层
- http协议的不足 HTTP1不支持多路复用,且明文传输,传输效率低下 HTTP2改进了一些,支持多路复用和二进制协议,头部压缩 QUIC协议是基于UDP实现,解决队头阻塞问题,加密减少握手次数,支持快速启动
HTTP框架设计与实现
OSI的七层协议模型:
可以看到HTTP是属于第七层,应用层。
这里借一位博主的图来看一下不同协议各个层之间的对应关系:
协议的设计原则:高内聚,低耦合,易复用,高扩展性。
应用层设计
提供合理的API,面向应用,需要:(这一部分可以回去看性能优化和高质量编程那一部分)
- 可理解性
- 简单性
- 冗余性
- 兼容性
- 可测性
- 可见性
中间件设计
- 配合Handler实现一个完整的请求处理生命周期
- 拥有预处理逻辑与后处理逻辑
- 可以注册多中间件
- 对上层模块用户逻辑模块易用 核心在于将核心逻辑与通用逻辑分离
路由设计
为URL匹配对应的处理函数
- 静态路由 /a/b/c
- 参数路由 /a/:id
- 路由修复 /a/b/<->a/b
- 冲突路由以及优先级
- 匹配HTTP方法,get post等等
- 多处理函数 静态路由可以使用简单的map实现,前缀匹配树可以实现参数路由 外层Map根据methon进行初步筛选匹配HTTP方法
协议层设计
抽象出合适的接口 需要在连接上读写数据
传输层
BIO阻塞io——例子:客服占线,go net 例如Read Write NIO——注册一个监听器,监听到足够数据后再唤醒function,也就不会阻塞,net poll
优化
针对网络库的优化
go net基于“BIO”,为每一个连接reader和writer绑定一个buffer,减少连接的压力:流式友好,小包性能高 netpoll基于“NIO”,添加nocopy peek,分配足够大的buffer并限制最大的buffer size:中大包性能更高,时延低
只有第一节课听得懂啊啊啊啊,后面再多复习一下
针对协议的优化
网络库的优化是针对headers的优化,针对协议
- 找到header line的边界——字符串匹配,但是效率很低!可以先找到\n在判断前一个\r 怎么更快的找到\n ? SIMD——加速加速加速 (回去学汇编吧。。)
- Headers解析 1.通过Header key首字母快速筛除 2.解析对应value到独立字段 3.使用字节数组管理对应的header,复用 总结下来,针对网络库的优化在于buffer设计,针对协议的优化在于header解析的优化,热点资源池化
企业实践
框架设计要在追求性能的同时也要追求易用性,打造良好的生态,沉淀文档和用户群
总结:经过这接课我认识到了HTTP协议作为超文本传输协议的核心作用,它不仅用于在计算机之间传输信息,还涉及到了图片、音频等非文本数据的传输,复习了之前学过的计算机网络,也认识到了一些http版本的局限性和瓶颈,了解了一些优化策略。虽然这些企业级的东西对我来说还比较远,没接触过也不怎么听得懂,但是把笔记写下来,之后看到相关的可以留个心眼。真的好难呀~~~~