HTTP协议及设计实现|青训营

163 阅读6分钟

1 HTTP协议

1.1 HTTP协议简介

HTTP(超文本传输协议,Hypertext Transfer Protocol)是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器的传输协议,它是一个基于请求与响应模型的、无状态的、应用层协议。

HTTP协议是一个基于TCP/IP协议的、无状态的、应用层协议。HTTP协议是万维网(WWW)的基础,WWW是在HTTP协议上运行的应用。HTTP协议的主要特点有:

  1. 简单易用:HTTP协议的语法简单,易于实现,可以使用文本编辑器编写。
  2. 灵活:HTTP协议允许服务器和客户端使用多种数据格式进行通信,如XML、JSON、文本、图像等。
  3. 可扩展性:HTTP协议可以扩展以支持新的请求方法、新的头部和新的状态码。
  4. 可靠性:HTTP协议可以保证客户端和服务器之间的可靠性,可以确保请求的正确性。

1.2 HTTP协议请求流程

HTTP协议的工作流程如下:

  1. 客户端通过TCP/IP协议向服务器发送一个请求报文,包括请求的方法、URL、协议版本、Content-Type等信息。
  2. 服务器接收到请求报文后,根据请求信息进行处理,并返回一个响应报文,包括响应的方法、URL、协议版本、Content-Type、状态码等信息。
  3. 客户端接收到响应报文后,根据响应信息进行处理,并将结果展示出来。

image.png HTTP协议的请求报文和响应报文都是由HTTP头部和HTTP主体组成的。HTTP头部包括请求头部和响应头部,HTTP主体包括请求主体和响应主体。HTTP协议使用TCP/IP协议传输数据,使用TCP/IP协议建立连接、传输数据、关闭连接等操作。

1.3 HTTP协议不足与展望

HTTP协议在当前互联网应用中已经得到了广泛的应用,但也存在一些不足之处:

  1. 无法支持大规模的并发请求:HTTP协议是基于TCP/IP协议的,采用请求与响应模型,无法支持大规模的并发请求。
  2. 无法支持实时通信:HTTP协议是基于TCP/IP协议的,无法支持实时通信,无法满足实时应用的需求。
  3. 无法支持数据加密:HTTP协议无法支持数据加密,无法保证数据的安全性。

针对这些不足之处,HTTP协议也在不断地发展和演进,HTTP2是一种新的HTTP协议版本,它解决HTTP1存在的一些性能和安全问题。HTTP2使用了多路复用技术,可以同时处理多个HTTP请求和响应,从而提高了HTTP协议的性能和效率。此外,HTTP2还支持了更多的HTTP头部字段,可以更好地支持缓存和压缩等功能。

QUIC是一种新的传输协议,它是基于HTTP/2协议的,主要是为了解决HTTP2协议存在的一些性能和安全问题。QUIC协议使用了TCP/IP协议的传输层,支持多路复用和流量控制等功能,可以提高HTTP协议的性能和效率。此外,QUIC协议还支持了更多的HTTP头部字段,可以更好地支持缓存和压缩等功能。

2 HTTP框架的设计与实现

HTTP框架的设计与实现是一个复杂的问题,需要考虑多个方面,包括分层设计、应用层设计、中间件设计、路由设计、协议层设计和网络层设计等。

2.1 分层设计

image.png HTTP框架通常采用分层设计,将复杂的应用分为多个层次,每个层次负责不同的功能。常见的HTTP框架分层设计包括应用层、中间件层、路由层、协议层和网络层等。

分层设计往往要求具有高内聚、低耦合、易复用和高扩展性特点。

2.2 应用层设计

应用层是HTTP框架的最顶层,负责处理应用逻辑和业务流程。应用层通常包括请求处理、响应处理、会话管理、安全性等功能。应用层设计时要求提供合理的API,具备可解释性如使用ctx.Body(), ctx.GetBody()不要用ctx.BodyA();具备简单性如使用ctx.Request.Header.Peek(key)不要用ctx.GetHeader(key),设计时要兼顾冗余性、兼容性、可测性和可见性。

2.3 中间件设计

中间件层是HTTP框架的核心层,负责处理HTTP请求和响应的流程。中间件层通常包括请求处理、响应处理、负载均衡、缓存、日志等功能。

中间件需求:

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

设计时往往采用洋葱模型,将核心逻辑与通用逻辑分离:

image.png

2.4 路由设计

路由层是HTTP框架的重要层次,负责根据请求的URL和方法,将请求路由到不同的处理程序。路由层通常包括URL映射、路由规则、路由优先级等功能。

框架路由实际上就是为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方法
  • 多处理函数:方便添加中间件

2.5 协议层设计

协议层是HTTP框架的底层,负责处理HTTP协议的报文格式和交互流程。协议层通常包括HTTP请求报文、HTTP响应报文、HTTP协议版本等功能。例如,可以使用Java HttpURLConnection类来实现HTTP请求和响应报文的发送和接收。

设计规范:

  • 不要将上下文存储在结构类型中;相反,将上下文显式传递给需要它的每个函数,上下文应该是第一个参数。
  • 需要在来连接上读写数据。

2.6 网络层设计

网络层是HTTP框架的最底层,负责将HTTP请求和响应发送到网络中的目标服务器。网络层通常包括TCP/IP协议、HTTP协议栈、网络连接等功能。HTTP网络层设计的目的是保证Web应用的正常运行,使得客户端和服务器之间的数据传输更加高效、可靠和安全。

HTTP网络层设计的主要规范包括请求报文和响应报文的结构、请求行、请求头、请求数据和响应数据的内容和格式,以及通信流程等。

3 总结

本文首先介绍了HTTP协议及其请求流程,简要分析其不足并对改进的HTTP2协议和QUIC协议进行介绍,后详细介绍HTTP框架的设计与实现,往往采用分层设计:API 设计注重可理解性和简单性,中间件设计采用洋葱模型,路由设计采用前缀匹配树,协议层设计往往抽象出合适的接口,网络层设计注重网络模型。

本文为个人见解,如有错误欢迎指正!