HTTP协议
什么是HTTP协议?
HTTP (Hypertext Transfer Protocol)协议,顾名思义,就是超文本传输协议。
在网络通信的早期,用户之间传递的是 Text(文本信息),但是随着时代的发展,单纯的文本传递渐渐地无法满足用户的需求,于是传输图片,音乐,视频等的协议出现了,我们便将其称之为 HTTP 协议。
为什么需要协议?
传递信息,需要一个明确的开始与结束的边界,并且能够表示消息的类型。
协议里有什么?
POST /sis HTTP/1.1 //请求行,包含着对 HTTP 协议当前版本的描述
Who: Alex
Content-Type: text/plain
Host: 127.0.0.1:8888
Content-Length: 28 //到底有多少个字节的数据
Let's watch a movie together
协议内部大体可以分为三部分,分别是请求行/状态行,请求头/状态头,请求体/响应体
请求行一般包括方法名,URL 与协议版本;状态行一般包括协议版本,状态码,状态码描述
请求头和响应头一般分为协议相关(Content-Length 等)的与业务相关的内容
创建一个 Demo
package main
import (
"context"
"code.byted.org/middleware/hertz/pkg/app"
"code.byted.org/middleware/hertz/pkg/app/server"
)
func main() {
h := server.New()
h.POST("/sis", func(c context.Context, ctx *app.RequestContext) {
ctx.Data(200, "text/plain; charset=utf-8", []byte("OK"))
})
h.Spin()
}
首先在业务层,需要完成业务逻辑,然后进入依托于中间件层的服务治理层,接下来进入协议编解码层将内容变成可读的,最后到达传输层
HTTP 协议的不足与展望
对于 HTTP1 来说,因为它是基于TCP的,具有一个队头阻塞的问题,同时传输效率比较低,不支持多路复用,这个请求没结束时,是不支持发起新的请求的,它也是一个明文的传输,缺乏加密,安全性较低
对于 HTTP2 来说,解决了一部分问题比如说支持了头部压缩与多路复用,可以减少头部数据量,同时 HTTP2 是二进制协议,传输效率相比一代也高了许多,但因为 HTTP2 仍然是基于 TCP 的,并没有解决队头阻塞的问题。
为了解决这些问题,QUIC 协议出现了,它基于 UDP 实现,解决了队头阻塞的问题,同时它也优化了加密的算法,减少了握手的次数,并且支持快速启动
HTTP 框架
框架的分层设计
OSI 七层网络模型:
应用层(Application)
提供合理的 API,注意可理解性,兼容性,可测试性,可见性,简单性,避免冗余
对应协议:HTTP, TFTP, FTP, NFS, WAIS, SMTP
表示层(Presentation)
对应协议:Telnet, Rlogin, SNMP, Gopher
会话层(Session)
对应协议:SMTP, DNS
传输层(Transport)
对应协议:TCP, UDP
网络层(Network)
对应协议:IP, ICMP, ARP, RARP, AKP, UUCP
数据链路层(Data Link)
对应协议:FDDI, Ethernet, Arpanet, PDN, SLIP, PPP
物理层(Physical)
对应协议:IEEE 802.1A, IEEE 802.2 到 IEEE 802.11
分层设计有着高内聚,低耦合,易复用,高扩展性等特性
中间件设计
中间件需求:
- 配合 Handler 实现一个完整的请求处理生命周期
- 拥有预处理逻辑和后处理逻辑
- 可以注册多中间件
- 对上层模块用户逻辑模块易用
洋葱模型:
核心逻辑与通用逻辑分离,适用于日志记录,性能统计,安全控制,事务处理等场景
路由设计
采用前缀匹配树
协议层设计
抽象出合适的接口
type Server interface {
Serve(c context.Context, conn network.Conn) error
}
Comments | NOTHING