HTTP协议 | 青训营笔记

75 阅读3分钟

HTTP 协议

HTTP 协议是超文本传输协议 (Hypertext Transfer Protocol) 的缩写,一般用于 Web 应用程序之间的通信。HTTP 协议定义了双方之间的信息交流规则,其目的在于传输如 HTML、JSON、XML 等各种类型的文档。在 HTTP 协议中,每个请求和响应都包括一些由协议约定的信息,以确保沟通顺畅和正确。

为什么需要协议?

协议实现了明确的边界,定义了开始和结束的标志,以便记录消息的范围。HTTP 协议能够携带各种文档类型和消息类型,从而为消息的传输提供了灵活性和可扩展性。

请求流程

HTTP 协议中,客户端通过向服务器发送请求来获取服务器的响应。一个典型的请求由以下内容组成:

请求:

  1. 请求行: 包括方法名(常用方法名有:GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH)、URL、协议版本;
  2. 请求头: 包括协议约定和业务相关信息;
  3. 请求体:包含需要在服务器上处理的任何数据。

响应:

  1. 状态行:包括协议版本、状态码(状态码一般分为五类,1xx:信息类、2xx:成功、3xx:重定向、4xx:客户端错误、5xx:服务器错误)和状态码描述;
  2. 响应头:包括协议约定和业务相关信息;
  3. 响应体:包含来自服务器的任何数据。

不足与展望

HTTP/1.x 版本的协议存在一些问题,例如队头阻塞、传输效率低、明文传输不安全等问题。为了解决这些问题,新的协议版本 HTTP/2 增加了多路复用和头部压缩等功能,而 QUIC 协议则基于 UDP 实现,通过加密减少握手次数,支持快速启动和解决队头阻塞等问题。

性能修炼之道

在进行性能优化时,应该注重以下方面:

  1. buffer 设计:go net 库中存储全部 Header,多次读取时能够复用内存,减少系统调用次数;netpoll 拷贝出完整的 Body,存储全部 Header。

  2. 针对协议的优化:Headers 解析时取核心字段进行快速解析,使用 byte slice 存储;热点资源池化可以减少内存分配,提高内存复用效率。

个人总结与分析

  1. HTTP 协议是一种超文本传输协议,它定义了双方之间的信息交流规则,能够携带如 HTML、JSON、XML 等各种类型的文档;

  2. 协议的存在是为了明确边界和消息范围,从而保证消息的传输顺利和正确;

  3. HTTP 协议的请求流程包括请求和响应,每个请求和响应均由请求行/状态行、请求头/响应头和请求体/响应体三部分组成;

  4. HTTP 协议存在一些问题,如队头阻塞、传输效率低、明文传输不安全等,新的协议版本 HTTP/2 和 QUIC 协议分别提供了多路复用、头部压缩和基于 UDP 实现等解决方案;

  5. 在网络库设计和实现时,需要注意 buffer 设计、协议优化和资源池化等方面,同时通过业界调研和方案评审来确保设计最合适的方案。