Day9:豆包MarsCode 技术训练营第九课HTTP协议详解 | 豆包MarsCode AI 刷题

138 阅读4分钟

1. HTTP协议

1.1 HTTP协议

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它定义了客户端和服务器之间交换数据的格式和传输方式。HTTP协议是互联网上应用最广泛的协议之一,主要用于Web浏览器和服务器之间的通信。

1.2 协议里面有什么

mindmap
      HTTP协议
          请求行/状态行
           方法名
            GET
            HEAD
            POST
            PUT
            DELETE
            CONNECT
            OPTIONS
            TRACE
            PATCH
           URL
           协议版本
          请求头/响应头
          请求体/响应体    

1.3 请求流程

  • 建立连接

    • 客户端通过DNS解析服务器的域名,获取服务器的IP地址。
    • 客户端与服务器的HTTP端口(通常是80端口,HTTPS是443端口)建立TCP连接。如果是HTTPS请求,还会建立SSL/TLS加密连接。
  • 发送HTTP请求

    • 客户端向服务器发送一个HTTP请求消息。请求消息通常包括以下部分:

      • 请求行:包含请求方法(如GET、POST等)、请求的URI和HTTP版本。
      • 请求头部:包含一系列的键值对,提供关于请求、客户端能力和期望响应的额外信息。
      • 空行:请求头部和实体主体之间的分隔符。
      • 实体主体(可选):包含请求的数据,例如表单数据或上传的文件。
  • 服务器处理请求

    • 服务器接收到请求后,解析请求消息,确定如何处理请求。
    • 服务器可能需要进行认证和授权检查。
    • 服务器根据请求的URI找到对应的资源或执行相应的操作。
  • 服务器响应

    • 服务器生成HTTP响应消息,发送回客户端。响应消息通常包括以下部分:

      • 状态行:包含HTTP版本、状态码(如200表示成功)和状态描述。
      • 响应头部:包含关于响应的元数据,如内容类型、长度、缓存指令等。
      • 空行:分隔响应头部和实体主体。
      • 实体主体:包含响应的数据,如HTML页面、图片或JSON数据。
  • 客户端处理响应

    • 客户端接收到响应后,解析状态码和响应头部,根据状态码决定如何处理响应。
    • 如果是成功的响应(如状态码200),客户端会处理实体主体,例如渲染HTML页面或显示图片。
    • 如果是重定向响应(如状态码301或302),客户端可能会自动向新的URI发送请求。
    • 如果是错误响应(如状态码4xx或5xx),客户端可能会显示错误信息。
  • 关闭连接

    • 在HTTP/1.0中,服务器通常在发送完响应后关闭连接。
    • 在HTTP/1.1中,默认使用持久连接,除非显式地指定Connection: close头部,否则连接可能会保持打开状态,以便发送后续请求。

1.4 不足与展望

  • 队头阻塞
  • 传输效率低
  • 明文传输不安全
  • 多路复用
  • 头部压缩
  • 二进制协议

1.5 QUIC协议

  • 基于UDP

    • QUIC运行在UDP之上,避免了TCP的一些限制,如队头阻塞(Head-of-Line Blocking)和缓慢的启动时间。
  • 性能提升

    • 由于不需要像TCP那样通过三次握手来建立连接,QUIC可以实现更快的连接建立,尤其是在有之前连接历史的情况下。
  • 拥塞控制

    • QUIC内置了拥塞控制机制,而不是像TCP那样依赖于操作系统的拥塞控制算法。
  • 前向纠错(Forward Error Correction, FEC)

    • QUIC支持前向纠错,允许接收方在丢失少量数据包的情况下恢复数据,而无需重新传输。
  • 流的多路复用

    • QUIC允许多个数据流在同一个连接中并行传输,且一个流的丢包不会影响到其他流。
  • 加密和安全

    • QUIC默认对所有数据包进行加密,提供了更好的隐私保护和安全性。
  • 连接迁移

    • QUIC支持连接迁移,即在网络切换(如从Wi-Fi切换到移动数据)时,保持连接状态不变。

2 HTTP框架设计与实现

2.1 分层设计

graph TD
应用层 --> 中间件层-->路由层-->协议层-->网络层

2.2 应用层设计

提供合理易理解的API

  • 可理解性
  • 简单性
  • 冗余性
  • 兼容性
  • 可测性
  • 可见性

2.3 中间件设计

中间件需求

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

2.4 路由设计

框架路由实际上就是为URL匹配对应的处理函数(Handlers)

  • 静态路由:/a/b/c
  • 参数路由:/a/:id/c
  • 路由修复:/a/b <-->/a/b/
  • 冲突路由以及优先级:/a/b、/:id/c
  • 匹配HTTP方法
  • 多处理函数:方便添加中间件