这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
本文为青训营课程笔记,配合原课程食用效果更佳哦~
课程笔记
再谈 HTTP 协议
-
HTTP 协议是什么:超文本 传输协议(Hypertext Transfer Protocol)
-
为什么需要协议
-
需要明确的边界
- 开始
- 结束
-
能够携带信息
- 什么消息
- 消息类型
-
-
请求流程
-
协议里有什么
-
请求
-
请求行
- 方法名(常见方法名:GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH
- URL
- 协议版本
-
请求头
- 协议约定
- 业务相关
-
请求体
-
-
响应
-
状态行
- 协议版本
- 状态码(状态码:1xx:信息类、2xx:成功、3xx:重定向、4xx:客户端错误、5xx:服务端错误
- 状态码描述
-
响应头
- 协议约定
- 业务相关
-
响应体
-
-
不足与展望
-
HTTP1
- 队头阻塞
- 传输效率低
- 明文传输不安全
-
HTTP2
- 多路复用
- 头部压缩
- 二进制协议
-
QUIC
- 基于UDP实现
- 解决队头阻塞
- 加密减少握手次数
- 支持快速启动
-
-
性能修炼之道
-
go net 存下全部 Header 减少系统调用次数 能够复用内存 能够多次读
-
netpoll 存下全部 Header 拷贝出完整的 Body
-
分配足够大的 buffer 限制最大 buffer size
-
3.2 针对协议的优化 -- Headers 解析
取:核心字段快速解析、使用byte slice存储
舍:额外存储到成员变量中、普通 header 性能较低、没有 map 结构
-
针对协议的优化 -- Headers 解析
取:超高的转换效率、比 net.http 提高 40倍
舍:额外的内存开销、变更困难
-
热点资源池化 取:减少了内存分配、提高了内存复用、降低了GC压力、性能提升 舍:额外的 Reset 逻辑、请求内有效、问题定位难度增加
-
总结 针对网络库的优化:buffer 设计 针对协议的优化:header 解析、热点资源池化
总结收获
通过样例与知识点结合的方式,学到了一些 HTTP框架的相关知识 ;
通过样例的讲解,更了解了具体的 HTTP技术 ;
又是收获满满的一天
引用参考
青训营官方课程视频
青训营官方课程文档
青训营官方课程笔记