HTTP协议简介
HTTP协议的全称为超文本传输协议(Hypertext Transfer Protocol,HTTP),是一个简单的请求-响应协议。HTTP协议工作在应用层,指定了客户端可能会发送给服务器的消息格式,以及从服务器那得到消息的格式。该协议基于文本,其请求响应消息的头以ASCII码的形式给出。
Http工作的框架图
其中HTTP框架负责对HTTP请求的解析,如图中所框出来的:请求解析<->后端路由<->业务逻辑
Http协议结构
常见结构:
Post请求
POST /sis HTTP/1.1
who: Alex
Content-Type: text/plain
Host: 127.0.0.1:8888
Content-Length: 28
Let's watch a movie together
请求方法和路径:
POST /sis HTTP/1.1
请求头:
who: Alex 这个字段可能用于标识发出此请求的用户或实体。Content-Type: text/plain 表示请求主体中的数据类型是纯文本(text/plain)。Host: 127.0.0.1:8888 请求的目标主机是本地回环IP地址127.0.0.1,并且使用的端口是8888。Content-Length: 28 告诉接收方请求主体部分的长度是28个字符
请求主体: Let's watch a movie together
响应(回复):结构与Post类似
HTTP/1.1 200 OK
Server: hertz
Date: Thu, 21 Apr 2022 11:46:32 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 2
Upstream-Caught: 1650541592984580
OK
结构图
请求流程:
网络分层设计
网络分层模型是指将网络通信的功能划分为多个层次,每一层负责不同的任务。最著名的网络分层模型有两个:OSI模型和TCP/IP模型。下面分别介绍这两个模型:
OSI 模型(Open Systems Interconnection Model)
- 物理层 (Physical Layer)
- 负责传输原始比特流。
- 定义物理连接的标准,如电压、线缆规格等。
- 数据链路层 (Data Link Layer)
- 负责节点之间的可靠传输。
- 处理帧同步、错误检测和纠正等。
- 网络层 (Network Layer)
- 负责数据包的路由选择。
- 处理逻辑地址和路径选择。
- 传输层 (Transport Layer)
- 负责端到端的通信。
- 提供可靠的数据传输服务,如TCP(传输控制协议)。
- 会话层 (Session Layer)
- 负责建立、管理和终止会话。
- 提供会话管理功能。
- 表示层 (Presentation Layer)
- 负责数据格式转换、加密和解密等。
- 确保数据在发送方和接收方之间的一致性。
- 应用层 (Application Layer)
- 直接面向用户的应用程序。
- 提供各种网络服务,如HTTP、FTP、SMTP等。
TCP/IP 模型
TCP/IP模型是互联网中最常用的分层模型,它简化了OSI模型,只有四层:
- 应用层 (Application Layer)
- 类似于OSI模型的应用层、表示层和会话层。
- 提供各种网络服务,如HTTP、FTP、SMTP等。
- 传输层 (Transport Layer)
- 类似于OSI模型的传输层。
- 提供可靠的数据传输服务,如TCP和UDP(用户数据报协议)。
- 互联网层 (Internet Layer)
- 类似于OSI模型的网络层。
- 负责数据包的路由选择,主要协议是IP(互联网协议)。
- 链路层 (Link Layer)
- 类似于OSI模型的物理层和数据链路层。
- 负责节点之间的物理传输,包括以太网、Wi-Fi等。
OSI模型:更加理论化,层次划分更细,适合教学和理论研究。 TCP/IP模型:更加实用,层次划分更简洁,是实际互联网通信的基础。实际上,TCP/IP在目前市场上早已占据主要地位
Http分层设计
尽管OSI模型和TCP/IP模型已经将网络进行分层,但具体每层的设计仍然很复杂,因此我们也有必要对该协议进行分层设计
应用层的设计
提供合理的API
- 可理解性:如ctx.Body(),ctx.GetBody()
- 简单性:如ctx.Request.Header.Peek(key)/ctx.GetHeader(key)
- 冗余性:不要设置冗余的接口
- 兼容性
- 可测性
- 可见性:注意封装范围
- 不要试图在文档中说明,大多数用户不看文档
中间件层
中间件层需求
- 配合Handler实现一个完整的请求处理生命周期
- 拥有预处理逻辑与后处理逻辑
- 可以注册多中间件
- 对上层模块用户逻辑模块易用 洋葱模型
路由设计
框架路由实际上就是为 URL 匹配对应的处理函数(Handlers)
- 静态路由: /a/b/c、/a/b/d
- 参数路由: /a/:id/c (/a/b/c, /a/d/c)、/*all
- 路由修复: /a/b <-> /a/b/
- 冲突路由以及优先级: /a/b、/:id/c
- 匹配 HTTP 方法
- 多处理函数: 方便添加中间件
匹配HTTTP方法
协议层设计
抽象出合适的接口:
type Server interface{
Serve(c context.Context,conn network.Conn) error
}
网络层设计
BI0
go func() {
for {
conn, _ := listener.Accept()
go func() {
conn.Read(request)
handle...
conn.Write(response)
}()
}
}()
NIO
go func() {
for {
readableConns, _ := Monitor(conns)
for conn := range readableConns {
go func() {
conn.Read(request)
handle...
conn.Write(response)
}()
}
}
}()