本页面介绍了frp如何管理服务器 (frps) 和客户端 (frpc) 组件之间的连接,以及用于建立、维护和复用连接的各种机制。连接管理是frp架构的核心部分,它能够通过NAT/防火墙有效地隧道传输流量。
frp涉及多种连接类型,它们在系统中承担不同的功能
连接类型:
来源: client/control.go34-81; server/control.go97-128; client/service.go62-134; server/service.go74-128
控制连接是frpc和frps之间最基本的通信通道。它负责处理认证、代理注册和工作连接协调。
Login 消息LoginResp 消息进行响应,并请求工作连接来源: client/service.go246-308; server/service.go420-428; server/control.go202-218
客户端和服务器都实现了心跳机制来检测连接故障
Ping 消息Pong 消息进行响应来源: client/control.go237-276; server/control.go299-312
工作连接用于传输实际的代理数据。它们通过一个池化机制进行管理。
服务器为每个客户端维护一个工作连接池
workConnCh 通道中来源: server/control.go232-297; client/control.go125-161
frp实现了多种连接复用机制,以高效利用网络资源。
当启用TCP复用时,系统使用 hashicorp/yamux 在单个TCP连接上复用多个逻辑流
来源: server/service.go516-536; client/connector.go
frp 支持多种用于控制连接的传输协议:
| 协议 | 描述 | 优点 |
|---|---|---|
| TCP | 标准TCP连接 | 可靠,支持广泛 |
| KCP | 基于UDP的可靠传输 | 在丢包网络中性能更佳 |
| QUIC | 基于UDP的复用传输 | 安全,低延迟,连接迁移 |
| WebSocket | 基于TCP的WebSocket协议 | 与代理/防火墙兼容性更好 |
| TLS | 加密TCP连接 | 安全通信 |
来源: server/service.go222-262; server/service.go274-279
对于HTTP和HTTPS代理,frp实现了虚拟主机功能,将请求路由到不同的后端。
vhost 包为此目的提供了 HTTPReverseProxy 和 HTTPSMuxer来源: pkg/util/vhost/http.go41-200; pkg/util/vhost/https.go26-37
以下章节描述了frp中如何处理不同的连接场景。
当新连接建立到服务器时
来源: server/service.go420-480; server/service.go567-649
客户端服务
来源: client/service.go168-202; client/control.go125-161
frp使用基于消息的协议在客户端和服务器之间进行通信。与连接管理相关的主要消息包括:
| 消息类型 | 目的 | 方向 |
|---|---|---|
| Login | 认证并建立控制连接 | 客户端 → 服务器 |
| LoginResp | 对Login尝试的响应 | 服务器 → 客户端 |
| NewProxy | 注册新的代理服务 | 客户端 → 服务器 |
| NewProxyResp | 对代理注册的响应 | 服务器 → 客户端 |
| Ping/Pong | 心跳消息 | 双向 |
| ReqWorkConn | 请求新的工作连接 | 服务器 → 客户端 |
| NewWorkConn | 注册新的工作连接 | 客户端 → 服务器 |
| StartWorkConn | 开始使用工作连接 | 服务器 → 客户端 |
来源: pkg/msg/msg.go; client/control.go230-235; server/control.go361-367
frp实现了多种机制来处理连接错误并确保系统稳定性
当控制连接失败时,客户端
来源: client/service.go215-244; client/control.go237-276
frp 也支持通过 SSH 隧道网关建立连接,这为连接管理提供了一种替代方法。
来源: pkg/ssh/gateway.go32-147; server/service.go264-271
frp 中的连接管理围绕着维护客户端和服务器之间稳定的控制连接,通过池化和多路复用高效管理工作连接,并支持各种传输协议。这种灵活的架构使 frp 能够在不同的网络环境和约束条件下提供可靠的代理服务。