菜单

HTTP 和网络

相关源文件

本文档解释了 Node.js 中 HTTP 和网络的功能,涵盖了 HTTP 和 HTTPS 模块。它详细介绍了 HTTP 服务器、客户端、连接管理、消息处理以及用于监控 HTTP 操作的诊断等关键组件。有关底层网络功能的信息,请参阅关于 `net` 模块的文档。

核心架构

Node.js 中的 HTTP 实现被设计为一个低级 API,专注于流处理和消息解析。它构建在流模块和 Node.js 的网络功能之上。

来源: lib/http.js126-151 lib/https.js58-138 lib/_http_server.js534-577 lib/_http_client.js137-390 lib/_http_agent.js81-107

关键组件

HTTP 模块包含几个关键类

  • Server:创建一个监听客户端请求的 HTTP 服务器
  • ClientRequest:表示一个出站 HTTP 请求
  • IncomingMessage:表示一个入站 HTTP 消息(服务器请求或客户端响应)
  • ServerResponse:由服务器用于向客户端发送响应
  • Agent:管理 HTTP 请求的客户端连接
  • OutgoingMessage:ClientRequest 和 ServerResponse 的基类

每个组件处理 HTTP 协议的不同方面,协同工作以提供完整的 HTTP 实现。

来源: lib/http.js12-37 lib/_http_server.js196-236 lib/_http_client.js137-390 lib/_http_incoming.js49-94 lib/_http_outgoing.js104-158 lib/_http_agent.js81-107

HTTP 消息结构

Node.js 中的 HTTP 消息表示为具有头部和正文内容的属性。头部表示被标准化,以便更容易使用

头部以原始形式(保留大小写和顺序)和解析后的形式(小写键)存储。正文内容通过 Stream 接口处理,允许高效的数据处理。

来源: lib/_http_incoming.js49-94 lib/_http_incoming.js107-185 doc/api/http.md18-51

HTTP 服务器

创建 HTTP 服务器

服务器监听 HTTP 请求并通过提供的回调处理它们。

来源: lib/http.js62-64 lib/_http_server.js534-577

服务器请求-响应流程

此流程展示了 HTTP 服务器如何处理入站请求,通过 HTTP 解析器处理它们,并将响应发送回客户端。

来源: lib/_http_server.js660-730 lib/_http_server.js135-176 lib/_http_common.js71-118

连接管理

服务器通过连接跟踪系统管理连接。它包括以下功能:

  • 超时处理
  • Keep-alive 支持
  • 连接限制
  • 空闲连接管理

来源: lib/_http_server.js516-529 lib/_http_server.js583-612 lib/_http_server.js614-619

HTTP 客户端

发起 HTTP 请求

来源: lib/http.js112-116 lib/_http_client.js137-390

客户端请求-响应流程

此图说明了 HTTP 请求的完整生命周期,包括通过 Agent 进行的连接管理。

来源: lib/_http_client.js346-383 lib/_http_client.js577-586 lib/_http_agent.js116-179

HTTP Agent

HTTP Agent 管理客户端连接,通过连接池和连接复用提高性能。

Agent 为每个唯一的 host:port 组合管理一个套接字池,控制并发连接的数量和复用方式。

来源: lib/_http_agent.js81-107 lib/_http_agent.js230-282 lib/_http_agent.js328-349

代理配置

来源: lib/_http_agent.js81-107 lib/http.js130-145

消息类

核心消息类继承关系

此继承关系展示了主要的 HTTP 消息类之间的继承关系。

来源: lib/_http_outgoing.js104-158 lib/_http_incoming.js49-94 lib/_http_server.js196-236 lib/_http_client.js137-390

请求头管理

Node.js 中的 Headers 通过多种方法管理

设置 Headers读取 Headers其他操作
OutgoingMessagesetHeader(name, value)
setHeaders(headers)
appendHeader(name, value)
getHeader(name)
getHeaders()
getHeaderNames()
removeHeader(name)
hasHeader(name)
IncomingMessageN/A (只读)headers 属性
rawHeaders 属性
headersDistinct 属性
不适用

通过 headers 对象访问时,Headers 会被规范化(转为小写),但原始的大小写会在 rawHeaders 中保留。

来源: lib/_http_outgoing.js639-664 lib/_http_outgoing.js796-832 lib/_http_incoming.js107-185

HTTPS 支持

HTTPS 功能通过 TLS/SSL 功能扩展了 HTTP 组件。

HTTPS 实现提供了与 HTTP 相同的 API,但增加了 TLS 配置选项。

来源: lib/https.js62-102 lib/https.js206-225 lib/https.js364-420

创建 HTTPS 服务器

来源: lib/https.js62-102 lib/https.js134-136

发起 HTTPS 请求

来源: lib/https.js364-382 lib/https.js416-420

诊断通道

Node.js 提供了诊断通道用于监控 HTTP 操作,无需修改应用程序代码即可实现可观测性。

HTTP 诊断通道

通道名称描述提供的数据
http.client.request.created创建客户端请求时触发{ request }
http.client.request.start客户端请求开始时触发{ request }
http.client.request.error客户端请求出错时触发{ request, error }
http.client.response.finish客户端响应完成时触发{ request, response }
http.server.request.start服务器开始处理请求时触发{ request, response, socket, server }
http.server.response.created创建服务器响应时触发{ request, response }
http.server.response.finish服务器响应完成时触发{ request, response, socket, server }

来源: lib/_http_client.js92-105 lib/_http_server.js98-102 test/parallel/test-diagnostics-channel-http.js15-67

使用诊断通道

来源: lib/diagnostics_channel.js102-116 lib/diagnostics_channel.js162-173 test/parallel/test-diagnostics-channel-http.js15-67

性能考量

HTTP Agent 优化

HTTP Agent 可以针对不同的性能特性进行调整

  • keepAlive: true - 启用套接字重用,减少连接建立的开销
  • maxSockets - 控制每个目标的并发连接数
  • maxTotalSockets - 限制总连接数
  • scheduling - 控制套接字选择策略('fifo' 或 'lifo')

来源: lib/_http_agent.js81-107 lib/_http_agent.js104-107

请求和响应性能

为了获得最佳的 HTTP 请求和响应性能

  1. 对大型请求/响应正文使用流
  2. 设置适当的头信息(已知时设置 Content-Length)
  3. 对同一服务器的多个请求启用 keep-alive
  4. 对于较大的载荷,考虑响应压缩
  5. 使用自定义 Agent 配置监视和调整连接池

来源: lib/_http_outgoing.js339-392 lib/_http_client.js275-290

错误处理

HTTP 应用中的正确错误处理至关重要。关键的错误事件和模式包括:

  1. 客户端请求错误:监听 ClientRequest 对象上的 'error' 事件
  2. 服务器错误:处理请求侦听器中的错误并使用 'clientError' 事件
  3. 连接错误:通过套接字错误事件进行管理
  4. 超时错误:适当设置和处理超时

来源: lib/_http_client.js509-531 lib/_http_server.js881-908