菜单

代理服务

相关源文件

概述

Shadowsocks Windows 客户端中的代理服务是处理网络流量重定向和加密的核心组件。这些服务在客户端应用程序和远程服务器之间建立连接,实现SOCKS5协议并处理TCP和UDP流量。本页记录了这些代理服务的架构和功能。

有关PAC(代理自动配置)系统的信息,请参阅PAC 系统。有关插件扩展的详细信息,请参阅SIP003 插件

核心架构

Shadowsocks Windows 中的代理服务依赖于一个核心的Listener 类,该类负责接收客户端连接并将其分派给相应的服务处理程序。主要的服务处理程序是TCPRelayUDPRelayPortForwarder

来源: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

TCP 中继服务

TCPRelay 服务处理SOCKS5 TCP连接。它验证传入连接是否使用SOCKS5协议,然后创建一个TCPHandler 来管理连接生命周期。

TCPHandler

TCPHandler 负责

  1. 与客户端建立SOCKS5握手
  2. 解析连接请求以确定目的地
  3. 连接到Shadowsocks服务器(或插件)
  4. 加密并转发客户端和服务器之间的流量

来源:shadowsocks-csharp/Controller/Service/TCPRelay.cs141-1063

TCP中继过程中的关键方法

  • Handle(): 判断连接是否使用SOCKS5协议并创建处理程序
  • StartConnect(): 建立与远程服务器的连接
  • StartPipe(): 开始客户端和服务器之间的数据传输

TCPHandler 还管理连接超时、数据的加密/解密以及连接关闭时的资源清理。

UDP 中继服务

UDPRelay 服务处理UDP流量,采用类似模式,但针对UDP的无连接特性进行了优化。它维护一个UDPHandler 实例缓存,这些实例映射到客户端端点。

来源:shadowsocks-csharp/Controller/Service/UDPRelay.cs13-236

UDP 中继过程

  1. 传入的UDP数据包由Listener 接收
  2. UDPRelay.Handle() 为客户端端点创建或检索一个UDPHandler
  3. UDPHandler.Send() 加密并将数据包转发到远程服务器
  4. UDPHandler.Receive() 监听来自服务器的响应
  5. 响应被解密并转发回客户端

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流量。这些服务管理客户端和远程服务器之间的连接建立、数据加密和流量转发。模块化设计,监听器和服务处理程序之间有清晰的分离,允许灵活的代理实现和高效的资源管理。