本文档涵盖了 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 资源 |
|---|---|---|---|
| TCP | tcp | TcpConn | TcpStreamResource |
| Unix | unix | UnixConn | UnixStreamResource |
| VSOCK | vsock | VsockConn | VsockStreamResource |
| TLS | tcp | TlsConn | TlsStreamResource |
| UDP | udp | DatagramConn | UdpSocketResource |
来源:ext/net/01_net.js100-270 ext/net/ops.rs538-551
所有连接类型都实现了一个通用接口,提供了
read(buffer) 和 write(data) 方法close() 和 closeWrite()localAddr 和 remoteAddrreadable 和 writableref() 和 unref()TCP 支持通过 TcpConn 和 TcpListener 类型提供可靠的、面向连接的通信。
来源:ext/net/ops.rs474-536 ext/net/01_net.js680-700
op_net_connect_tcp 操作处理连接建立,包括权限检查、地址解析和可选的取消支持。
TCP 监听器通过 op_net_listen_tcp 创建,并通过 NetworkListenerResource 包装器进行管理。
TCP 连接支持其他选项
setNoDelay() 通过 op_set_nodelay 控制 Nagle 算法。setKeepAlive() 通过 op_set_keepalive 启用保活数据包。来源:ext/net/01_net.js235-241 ext/net/ops.rs1012-1049
UDP 通过 DatagramConn 类型和各种多播操作提供无连接的数据报通信。
来源: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 传输):面向连接,可靠。unixpacket 传输):无连接的数据报。Unix 套接字需要读写权限,因为它们与文件系统交互。
TLS 功能在 Rustls 库的基础上提供加密通信,支持客户端和服务器操作。
来源: ext/net/02_tls.js26-250 ext/net/ops_tls.rs92-567
TLS 支持多种证书来源
TlsKey 提供 PEM 编码的证书/密钥对TlsKeyResolver 在运行时解析证书来源: ext/net/ops_tls.rs194-256 ext/tls/lib.rs200-261
为客户端和服务器连接都支持应用层协议协商 (ALPN)
DNS 解析通过 hickory-resolver 库中的 resolveDns() 函数提供。
来源: 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 为不同的网络操作提供细粒度的访问控制。
网络操作在建立连接前执行权限检查
check_net()来源: ext/net/ops.rs484-495 ext/net/ops_tls.rs366-369
这种权限模型确保了网络访问是可控且可审计的,支持 Deno 的默认安全方法。