Http协议入门 | 豆包MarsCode AI刷题

50 阅读4分钟

HTTP协议简介

HTTP协议的全称为超文本传输协议(Hypertext Transfer Protocol,HTTP),是一个简单的请求-响应协议。HTTP协议工作在应用层,指定了客户端可能会发送给服务器的消息格式,以及从服务器那得到消息的格式。该协议基于文本,其请求响应消息的头以ASCII码的形式给出。

Http工作的框架图

图片.png 其中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
结构图

图片.png

请求流程:

图片.png

网络分层设计

网络分层模型是指将网络通信的功能划分为多个层次,每一层负责不同的任务。最著名的网络分层模型有两个:OSI模型和TCP/IP模型。下面分别介绍这两个模型:

OSI 模型(Open Systems Interconnection Model)
  1. 物理层 (Physical Layer)
    • 负责传输原始比特流。
    • 定义物理连接的标准,如电压、线缆规格等。
  2. 数据链路层 (Data Link Layer)
    • 负责节点之间的可靠传输。
    • 处理帧同步、错误检测和纠正等。
  3. 网络层 (Network Layer)
    • 负责数据包的路由选择。
    • 处理逻辑地址和路径选择。
  4. 传输层 (Transport Layer)
    • 负责端到端的通信。
    • 提供可靠的数据传输服务,如TCP(传输控制协议)。
  5. 会话层 (Session Layer)
    • 负责建立、管理和终止会话。
    • 提供会话管理功能。
  6. 表示层 (Presentation Layer)
    • 负责数据格式转换、加密和解密等。
    • 确保数据在发送方和接收方之间的一致性。
  7. 应用层 (Application Layer)
    • 直接面向用户的应用程序。
    • 提供各种网络服务,如HTTP、FTP、SMTP等。
TCP/IP 模型

TCP/IP模型是互联网中最常用的分层模型,它简化了OSI模型,只有四层:

  1. 应用层 (Application Layer)
    • 类似于OSI模型的应用层、表示层和会话层。
    • 提供各种网络服务,如HTTP、FTP、SMTP等。
  2. 传输层 (Transport Layer)
    • 类似于OSI模型的传输层。
    • 提供可靠的数据传输服务,如TCP和UDP(用户数据报协议)。
  3. 互联网层 (Internet Layer)
    • 类似于OSI模型的网络层。
    • 负责数据包的路由选择,主要协议是IP(互联网协议)。
  4. 链路层 (Link Layer)
    • 类似于OSI模型的物理层和数据链路层。
    • 负责节点之间的物理传输,包括以太网、Wi-Fi等。

OSI模型:更加理论化,层次划分更细,适合教学和理论研究。 TCP/IP模型:更加实用,层次划分更简洁,是实际互联网通信的基础。实际上,TCP/IP在目前市场上早已占据主要地位

Http分层设计

尽管OSI模型和TCP/IP模型已经将网络进行分层,但具体每层的设计仍然很复杂,因此我们也有必要对该协议进行分层设计

图片.png

应用层的设计

提供合理的API

  • 可理解性:如ctx.Body(),ctx.GetBody()
  • 简单性:如ctx.Request.Header.Peek(key)/ctx.GetHeader(key)
  • 冗余性:不要设置冗余的接口
  • 兼容性
  • 可测性
  • 可见性:注意封装范围
  • 不要试图在文档中说明,大多数用户不看文档

中间件层

中间件层需求

  • 配合Handler实现一个完整的请求处理生命周期
  • 拥有预处理逻辑与后处理逻辑
  • 可以注册多中间件
  • 对上层模块用户逻辑模块易用 洋葱模型

图片.png

路由设计

框架路由实际上就是为 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方法

图片.png

协议层设计

抽象出合适的接口:

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)
            }()
        }
    }
}()