本文档描述了 frp (Fast Reverse Proxy) 的架构设计,解释了其组件如何交互以提供 NAT 穿透功能。涵盖了高层架构、通信流程和关键子系统。
有关代理类型详情,请参阅 代理类型。有关配置信息,请参阅 配置。
frp 遵循客户端-服务器架构模式,包含两个主要组件:frps (服务器) 和 frpc (客户端)。服务器运行在具有公网 IP 地址的机器上,而客户端运行在 NAT 后面的私有网络中。
客户端-服务器架构图
来源: README.md35-37 server/service.go74-128 client/service.go100-134
frp 的架构由多个关键组件组成,共同提供反向代理功能。
组件架构图
来源: server/service.go74-128 server/control.go97-167 client/service.go100-134 client/control.go54-81
服务器端包含以下关键组件
来源: server/service.go74-128 server/control.go45-95
客户端包含以下关键组件
来源: client/service.go100-134 client/control.go54-81
客户端和服务器之间的通信通过控制连接和数据连接进行。
通信序列图
来源: client/control.go125-161 server/control.go251-297 client/control.go238-277
frp 为不同目的使用了不同类型的连接。
来源: server/service.go222-262 client/control.go225-228
frp 支持多种用于控制连接的传输协议:
| 协议 | 描述 | 配置 |
|---|---|---|
| TCP | 默认传输协议 | 默认 |
| KCP | 基于 UDP,在 UDP 上提供可靠性 | transport.protocol = "kcp" |
| QUIC | 基于 UDP 的多路复用传输 | transport.protocol = "quic" |
| WebSocket | 通过 HTTP 传输 | 使用路径 /~!frp 进行标识 |
| TLS | 加密传输 | transport.tls.enable = true |
来源: server/service.go239-279 client/service.go246-250
代理系统是 frp 的核心功能,支持各种网络流量的转发。
代理系统架构图
来源: README.md35-37 server/proxy/proxy.go client/proxy/proxy.go
NewProxy 消息给服务器NewProxyResp 消息来源: client/control.go163-174 server/control.go370-403 server/control.go456-530
连接管理对 frp 的性能和可靠性至关重要。
连接管理图
来源: server/service.go483-542 client/control.go225-228
frp实现了连接池机制来提高性能
ReqWorkConn)来源: server/control.go251-297 client/control.go125-161
TCP多路复用允许多个逻辑连接共享一个物理TCP连接
来源: server/service.go516-536 README.md816-824
frp包含一个插件系统,允许扩展功能
插件系统图
来源: server/service.go190-195 README.md320-358
服务器和客户端有不同的启动流程
服务器启动流程
客户端启动流程
来源: cmd/frps/root.go101-117 cmd/frpc/sub/root.go140-168 server/service.go343-384 client/service.go168-212
frp实现了多种安全机制
来源: README.md599-639 README.md655-684
frp的架构设计是模块化、可扩展且安全的。客户端-服务器模型,拥有独立的控制和数据连接,能够实现高效的NAT穿透;代理系统支持多种协议和连接类型;插件系统提供可扩展性;安全机制确保部署的安全性。