中微子代理 中微子代理
首页
  • 快速上手
  • 后台操作指南
案例
支持
更新记录
GitCode (opens new window)
Gitee (opens new window)
Github (opens new window)
首页
  • 快速上手
  • 后台操作指南
案例
支持
更新记录
GitCode (opens new window)
Gitee (opens new window)
Github (opens new window)
  • 个人赞赏
  • 贡献指南

    • 如何贡献
    • 项目结构
    • 实现原理
      • 指令通道(CmdChannel)
      • 用户访问通道(VisitorChannel)
      • 被代理服务的实际通道(RealServerChannel)
      • 代理数据传输的通道(ProxyChannel)
      • 1、服务连接阶段
      • 2、用户连接阶段
      • 3、实际被代理服务连接阶段
      • 4、代理通道连接阶段
      • 5、数据传输阶段
  • 赞赏公示

    • 2024年
    • 2023年
目录

实现原理

# 代理实现中涉及的几类Channel

# 指令通道(CmdChannel)

  • 该channel负责维护客户端与服务端之间的指令通讯,由客户端启动后向服务端发起连接请求,服务端验证license成功后连接建立。
  • 服务端维护第一个CmdChannel的映射表,key为licenseId。服务端可以根据licenseId,向指定的客户端指令通道发布指令。
  • 该通道建立完成后,服务端会将该license授权的外网映射端口打开,等待用户访问。正常情况下,只要客户端不下线,该通道一直可用。
  • 然后服务端维护第二个CmdChannel的映射表,key为服务端外网端口。服务端可以根据指定的外网端口,向指定的客户端指令通道发布指令。

# 用户访问通道(VisitorChannel)

  • 该channel负责维护访问者与服务端端口之间的通讯,由访问者向服务端映射的外网端口发起请求开始建立,具体断开时机由实际的被代理的 协议决定。
  • 如HTTP/1.0下,用户向该端口发起请求,响应结束后,该通道随之关闭,下一次发起请求后,重新建立新的连接。
  • 该连接建立后,服务端会向该外网端口映射的指令通道发送Connect指令,传输该外网端口需要代理的内网信息, 如:127.0.0.1:3306。

# 被代理服务的实际通道(RealServerChannel)

  • 该channel负责维护客户端与实际被代理服务之间的通讯,当客户端接收到服务端的Connect指令后,客户端便会建立该通道。

# 代理数据传输的通道(ProxyChannel)

  • 该channel负责完成内网被代理服务与代理服务端之间的数据转发任务。
  • 每个客户端维护一个ProxyChannel的缓存队列,需要时从该队列中取,当取不到时,直接新建一个ProxyChannel返回。 当一个ProxyChannel实例用完后,需要归还到缓存队列中(ProxyChannel收到DisConnect指令时)。
  • 当RealServerChannel建立完成后,就会获取相关联的ProxyChannel,并与其绑定。设置RealServerChannel为 可读状态。然后通过ProxyChannel向服务端发送Connect指令。

# 代理实现流程

# 1、服务连接阶段

  • 1.1、客户端根据是否需要使用SSL,选择对应的服务端端口发起连接,建立CmdChannel。
  • 1.2、客户端根据用户输入或配置文件获取license,并携带license通过CmdChannel向服务端发送Auth指令。
  • 1.3、服务端通过CmdChannel接收到来自客户端的Auth指令。若验证license有效,则建立licenseId与CmdChannel的映射缓存、 外网端口与CmdChannel的映射缓存。并启动服务端代理端口,等待用户连接。

# 2、用户连接阶段

  • 2.1、用户向服务端代理的外网端口发起请求,服务端建立VisitorChannel。
  • 2.2、根据外网端口查找CmdChannel,若不存在有效的CmdChannel,则关闭该VisitorChannel。否则, 设置VisitorChannel为不可读,并携带内网映射信息(如:127.0.0.1:3306)通过CmdChannel向客户端发送Connect指令。

# 3、实际被代理服务连接阶段

  • 3.1、客户端通过CmdChannel接收到服务端的Connect指令。拿到需要代理的内网IP、端口号,向实际被 代理服务发起连接请求,若连接失败,则通过CmdChannel向服务端发送DisConnect指令。建立RealServerChannel成功,设置RealServerChannel为不可读 状态,并进入4.1阶段

# 4、代理通道连接阶段

  • 4.1、客户端通过ProxyChannelQueue获取或新建一个ProxyChannel,并将RealServerChannel与ProxyChannel进行绑定。
  • 4.2、客户端通过ProxyChannel向服务端发送Connect指令。
  • 4.3、服务端通过ProxyChannel通道收到来自客户端的Connect指令后,将ProxyChannel与对应的VisitorChannel进行绑定,并 设置VisitorChannel为可读状态。

# 5、数据传输阶段

  • 5.1、服务端通过VisitorChannel收到来自用户的请求数据,然后找到VisitorChannel绑定的ProxyChannel, 通过ProxyChannel发送Transfer指令,并携带用户请求数据。
  • 5.2、客户端通过ProxyChannel收到来自服务端的Transfer指令,取出用户请求数据。找到ProxyChannel绑定的RealServerChannel, 通过RealServerChannel向被代理服务写入用户请求数据。
  • 5.3、客户端通过RealServerChannel收到被代理服务响应的数据,找到RealServerChannel绑定的ProxyChannel, 通过ProxyChannel向服务端发送Transfer指令,并携带响应数据。
  • 5.4、服务端通过ProxyChannel收到来自客户端的Transfer指令,找到ProxyChannel绑定的VisitorChannel, 通过VisitorChannel向用户端写入响应数据。
上次更新: 2023/10/26, 13:41:02
项目结构
2024年

← 项目结构 2024年→

Theme by Vdoing | Copyright © 2023-2024 傲世孤尘 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式