Shadowsocks Windows 客户端中的代理服务是处理网络流量重定向和加密的核心组件。这些服务在客户端应用程序和远程服务器之间建立连接,实现SOCKS5协议并处理TCP和UDP流量。本页记录了这些代理服务的架构和功能。
有关PAC(代理自动配置)系统的信息,请参阅PAC 系统。有关插件扩展的详细信息,请参阅SIP003 插件。
Shadowsocks Windows 中的代理服务依赖于一个核心的Listener 类,该类负责接收客户端连接并将其分派给相应的服务处理程序。主要的服务处理程序是TCPRelay、UDPRelay 和PortForwarder。
来源:shadowsocks-csharp/Controller/Service/Listener.cs11-225 shadowsocks-csharp/Controller/Service/TCPRelay.cs20-141 shadowsocks-csharp/Controller/Service/UDPRelay.cs13-168 shadowsocks-csharp/Controller/Service/PortForwarder.cs9-262
Listener 在指定端口接受传入连接,并将收到的第一个数据包依次传递给每个注册服务,直到其中一个处理它。服务根据协议和数据包内容确定是否可以处理该连接。
此图说明了网络流量如何通过Shadowsocks代理服务
来源:shadowsocks-csharp/Controller/Service/Listener.cs194-223 shadowsocks-csharp/Controller/Service/TCPRelay.cs44-99 shadowsocks-csharp/Controller/Service/UDPRelay.cs28-49
TCPRelay 服务处理SOCKS5 TCP连接。它验证传入连接是否使用SOCKS5协议,然后创建一个TCPHandler 来管理连接生命周期。
TCPHandler 负责
来源:shadowsocks-csharp/Controller/Service/TCPRelay.cs141-1063
TCP中继过程中的关键方法
Handle(): 判断连接是否使用SOCKS5协议并创建处理程序StartConnect(): 建立与远程服务器的连接StartPipe(): 开始客户端和服务器之间的数据传输TCPHandler 还管理连接超时、数据的加密/解密以及连接关闭时的资源清理。
UDPRelay 服务处理UDP流量,采用类似模式,但针对UDP的无连接特性进行了优化。它维护一个UDPHandler 实例缓存,这些实例映射到客户端端点。
来源:shadowsocks-csharp/Controller/Service/UDPRelay.cs13-236
UDP 中继过程
Listener 接收UDPRelay.Handle() 为客户端端点创建或检索一个UDPHandlerUDPHandler.Send() 加密并将数据包转发到远程服务器UDPHandler.Receive() 监听来自服务器的响应LRU缓存机制通过在达到缓存限制时关闭不活动的UDP处理程序来确保高效的内存使用。
PortForwarder 服务提供简单的端口转发功能,在本地端口之间中继流量,不进行加密。
来源:shadowsocks-csharp/Controller/Service/PortForwarder.cs9-262
端口转发用于本地服务之间的通信,例如将HTTP流量转发到SOCKS5代理。
IProxy 接口定义了代理连接所需的常用方法。Shadowsocks实现了多种代理策略:
来源:shadowsocks-csharp/Proxy/IProxy.cs8-38 shadowsocks-csharp/Proxy/DirectConnect.cs9-99 shadowsocks-csharp/Proxy/Socks5Proxy.cs11-323
DirectConnect: 建立与目标服务器的直接连接Socks5Proxy: 通过SOCKS5代理服务器转发连接这些代理实现由TCPHandler 使用,根据配置建立连接。
下图详细说明了通过Shadowsocks建立TCP连接的步骤
来源:shadowsocks-csharp/Controller/Service/TCPRelay.cs344-575 shadowsocks-csharp/Controller/Service/TCPRelay.cs647-852
TCPHandler 使用复杂的缓冲区管理系统来处理数据的加密和解密
| 缓冲区名称 | 目的 | 大小 |
|---|---|---|
_remoteRecvBuffer | 存储从服务器接收到的加密数据 | 缓冲区大小 (2048 + 开销) |
_remoteSendBuffer | 存储要发送到服务器的解密数据 | 缓冲区大小 |
_connetionRecvBuffer | 存储从客户端接收到的明文数据 | 缓冲区大小 |
_connetionSendBuffer | 存储要发送到客户端的加密数据 | 缓冲区大小 |
来源:shadowsocks-csharp/Controller/Service/TCPRelay.cs219-228
加密/解密过程在以下方法中执行
PipeRemoteReceiveCallback(): 解密来自服务器的数据SendToServer(): 加密来自客户端的数据来源:shadowsocks-csharp/Controller/Service/TCPRelay.cs889-943 shadowsocks-csharp/Controller/Service/TCPRelay.cs976-998
TCPRelay 实现了一个事件系统,以提供连接状态和数据传输的反馈
这些事件允许控制器监控连接质量、跟踪数据使用情况并处理连接失败。事件在连接生命周期的适当点触发。
来源:shadowsocks-csharp/Controller/Service/TCPRelay.cs24-27 shadowsocks-csharp/Controller/Service/TCPRelay.cs112-139
TCPRelay 维护一组活动处理程序并定期检查空闲连接
闲置15分钟(900秒)的连接会自动关闭以释放资源。
来源:shadowsocks-csharp/Controller/Service/TCPRelay.cs34 shadowsocks-csharp/Controller/Service/TCPRelay.cs67-88
Shadowsocks Windows 中的代理服务实现了核心代理功能,通过SOCKS5协议处理TCP和UDP流量。这些服务管理客户端和远程服务器之间的连接建立、数据加密和流量转发。模块化设计,监听器和服务处理程序之间有清晰的分离,允许灵活的代理实现和高效的资源管理。