菜单

网络

相关源文件

本文档涵盖了 Deno 的底层网络原语,包括 TCP/UDP 套接字、Unix 域套接字、VSOCK 支持、TLS 功能和 DNS 解析。这些 API 为 Deno 中更高级的网络功能提供了基础。

有关 HTTP 客户端/服务器功能,请参阅 Fetch 和 HTTP。有关 WebSocket 支持,请参阅 WebSocket 协议。有关加密操作,请参阅 Web Crypto

架构概述

Deno 的网络系统作为扩展(deno_net)实现,采用分层架构,涵盖 JavaScript API、Rust 操作和系统级套接字管理。

核心扩展结构

来源:ext/net/lib.rs141-284 ext/net/01_net.js1-743 ext/net/02_tls.js1-252

操作与实现映射

来源:ext/net/01_net.js667-723 ext/net/ops.rs459-536 ext/net/ops_tls.rs349-441

核心网络类型

网络系统定义了几种核心连接和监听器类型,它们在不同的传输协议之间提供统一的接口。

连接层级

类型传输JavaScript 类Rust 资源
TCPtcpTcpConnTcpStreamResource
UnixunixUnixConnUnixStreamResource
VSOCKvsockVsockConnVsockStreamResource
TLStcpTlsConnTlsStreamResource
UDPudpDatagramConnUdpSocketResource

来源:ext/net/01_net.js100-270 ext/net/ops.rs538-551

基础连接接口

所有连接类型都实现了一个通用接口,提供了

  • 用于 I/O 的 read(buffer)write(data) 方法
  • 用于连接终止的 close()closeWrite()
  • 属性 localAddrremoteAddr
  • readablewritable
  • 用于事件循环管理的 ref()unref()

来源:ext/net/01_net.js133-206

TCP 网络

TCP 支持通过 TcpConnTcpListener 类型提供可靠的、面向连接的通信。

TCP 连接建立

来源:ext/net/ops.rs474-536 ext/net/01_net.js680-700

op_net_connect_tcp 操作处理连接建立,包括权限检查、地址解析和可选的取消支持。

TCP 监听器实现

TCP 监听器通过 op_net_listen_tcp 创建,并通过 NetworkListenerResource 包装器进行管理。

来源:ext/net/ops.rs553-584

套接字选项

TCP 连接支持其他选项

  • 无延迟setNoDelay() 通过 op_set_nodelay 控制 Nagle 算法。
  • 保活setKeepAlive() 通过 op_set_keepalive 启用保活数据包。

来源:ext/net/01_net.js235-241 ext/net/ops.rs1012-1049

UDP 网络

UDP 通过 DatagramConn 类型和各种多播操作提供无连接的数据报通信。

UDP 套接字操作

来源:ext/net/ops.rs586-427 ext/net/01_net.js402-573

多播支持

UDP 套接字支持 IPv4 和 IPv6 多播,具有专用操作。

  • 用于组管理的 joinMulticastV4()joinMulticastV6()
  • 用于多播配置的 setLoopback()setTTL()
  • 用于离开多播组的 leave() 方法

来源:ext/net/01_net.js438-487 ext/net/ops.rs285-410

Unix 域套接字

Unix 域套接字在类 Unix 系统上通过文件系统路径提供本地进程间通信。

Unix 套接字类型

该系统支持两种 Unix 套接字类型:

  • 流套接字unix 传输):面向连接,可靠。
  • 数据报套接字unixpacket 传输):无连接的数据报。

来源:ext/net/ops_unix.rs33-255

权限模型

Unix 套接字需要读写权限,因为它们与文件系统交互。

来源:ext/net/ops_unix.rs99-110

TLS 支持

TLS 功能在 Rustls 库的基础上提供加密通信,支持客户端和服务器操作。

TLS 架构

来源: ext/net/02_tls.js26-250 ext/net/ops_tls.rs92-567

证书管理

TLS 支持多种证书来源

  • 静态证书:通过 TlsKey 提供 PEM 编码的证书/密钥对
  • 动态证书:通过 TlsKeyResolver 在运行时解析证书
  • CA 证书:自定义根证书存储

来源: ext/net/ops_tls.rs194-256 ext/tls/lib.rs200-261

ALPN 支持

为客户端和服务器连接都支持应用层协议协商 (ALPN)

来源: ext/net/ops_tls.rs325-328

DNS 解析

DNS 解析通过 hickory-resolver 库中的 resolveDns() 函数提供。

DNS 操作流程

来源: ext/net/ops.rs907-1009 ext/net/01_net.js72-98

支持的记录类型

DNS 解析器支持多种具有结构化数据的记录类型

记录类型数据结构描述
A{A: string}IPv4 地址
AAAA{Aaaa: string}IPv6 地址
CNAME{Cname: string}规范名称
MX{Mx: {preference, exchange}}邮件交换
TXT{Txt: string[]}文本记录
SRV{Srv: {priority, weight, port, target}}服务记录

来源: ext/net/ops.rs831-878 ext/net/ops.rs1051-1137

权限系统

网络操作受到 NetPermissions trait 的保护,该 trait 为不同的网络操作提供细粒度的访问控制。

权限接口

来源: ext/net/lib.rs27-58

权限检查流程

网络操作在建立连接前执行权限检查

  1. 地址验证:主机名和端口验证
  2. 权限检查:使用目标地址调用 check_net()
  3. 地址解析:如果需要,进行 DNS 查询
  4. 连接建立:实际的套接字创建

来源: ext/net/ops.rs484-495 ext/net/ops_tls.rs366-369

这种权限模型确保了网络访问是可控且可审计的,支持 Deno 的默认安全方法。