1 line
9.3 KiB
JavaScript
1 line
9.3 KiB
JavaScript
(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{398:function(e,v,_){"use strict";_.r(v);var n=_(14),a=Object(n.a)({},(function(){var e=this,v=e._self._c;return v("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[v("h1",{attrs:{id:"代理实现中涉及的几类channel"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#代理实现中涉及的几类channel"}},[e._v("#")]),e._v(" 代理实现中涉及的几类Channel")]),e._v(" "),v("h2",{attrs:{id:"指令通道-cmdchannel"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#指令通道-cmdchannel"}},[e._v("#")]),e._v(" 指令通道(CmdChannel)")]),e._v(" "),v("ul",[v("li",[e._v("该channel负责维护客户端与服务端之间的指令通讯,由客户端启动后向服务端发起连接请求,服务端验证license成功后连接建立。")]),e._v(" "),v("li",[e._v("服务端维护第一个CmdChannel的映射表,key为licenseId。服务端可以根据licenseId,向指定的客户端指令通道发布指令。")]),e._v(" "),v("li",[e._v("该通道建立完成后,服务端会将该license授权的外网映射端口打开,等待用户访问。正常情况下,只要客户端不下线,该通道一直可用。")]),e._v(" "),v("li",[e._v("然后服务端维护第二个CmdChannel的映射表,key为服务端外网端口。服务端可以根据指定的外网端口,向指定的客户端指令通道发布指令。")])]),e._v(" "),v("h2",{attrs:{id:"用户访问通道-visitorchannel"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#用户访问通道-visitorchannel"}},[e._v("#")]),e._v(" 用户访问通道(VisitorChannel)")]),e._v(" "),v("ul",[v("li",[e._v("该channel负责维护访问者与服务端端口之间的通讯,由访问者向服务端映射的外网端口发起请求开始建立,具体断开时机由实际的被代理的\n协议决定。")]),e._v(" "),v("li",[e._v("如HTTP/1.0下,用户向该端口发起请求,响应结束后,该通道随之关闭,下一次发起请求后,重新建立新的连接。")]),e._v(" "),v("li",[e._v("该连接建立后,服务端会向该外网端口映射的指令通道发送"),v("code",[e._v("Connect")]),e._v("指令,传输该外网端口需要代理的内网信息,\n如:"),v("code",[e._v("127.0.0.1:3306")]),e._v("。")])]),e._v(" "),v("h2",{attrs:{id:"被代理服务的实际通道-realserverchannel"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#被代理服务的实际通道-realserverchannel"}},[e._v("#")]),e._v(" 被代理服务的实际通道(RealServerChannel)")]),e._v(" "),v("ul",[v("li",[e._v("该channel负责维护客户端与实际被代理服务之间的通讯,当客户端接收到服务端的"),v("code",[e._v("Connect")]),e._v("指令后,客户端便会建立该通道。")])]),e._v(" "),v("h2",{attrs:{id:"代理数据传输的通道-proxychannel"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#代理数据传输的通道-proxychannel"}},[e._v("#")]),e._v(" 代理数据传输的通道(ProxyChannel)")]),e._v(" "),v("ul",[v("li",[e._v("该channel负责完成内网被代理服务与代理服务端之间的数据转发任务。")]),e._v(" "),v("li",[e._v("每个客户端维护一个"),v("code",[e._v("ProxyChannel")]),e._v("的缓存队列,需要时从该队列中取,当取不到时,直接新建一个"),v("code",[e._v("ProxyChannel")]),e._v("返回。\n当一个"),v("code",[e._v("ProxyChannel")]),e._v("实例用完后,需要归还到缓存队列中("),v("code",[e._v("ProxyChannel")]),e._v("收到"),v("code",[e._v("DisConnect")]),e._v("指令时)。")]),e._v(" "),v("li",[e._v("当"),v("code",[e._v("RealServerChannel")]),e._v("建立完成后,就会获取相关联的"),v("code",[e._v("ProxyChannel")]),e._v(",并与其绑定。设置"),v("code",[e._v("RealServerChannel")]),e._v("为\n可读状态。然后通过"),v("code",[e._v("ProxyChannel")]),e._v("向服务端发送"),v("code",[e._v("Connect")]),e._v("指令。")])]),e._v(" "),v("h1",{attrs:{id:"代理实现流程"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#代理实现流程"}},[e._v("#")]),e._v(" 代理实现流程")]),e._v(" "),v("h2",{attrs:{id:"_1、服务连接阶段"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_1、服务连接阶段"}},[e._v("#")]),e._v(" 1、服务连接阶段")]),e._v(" "),v("ul",[v("li",[e._v("1.1、客户端根据是否需要使用SSL,选择对应的服务端端口发起连接,建立"),v("code",[e._v("CmdChannel")]),e._v("。")]),e._v(" "),v("li",[e._v("1.2、客户端根据用户输入或配置文件获取"),v("code",[e._v("license")]),e._v(",并携带"),v("code",[e._v("license")]),e._v("通过"),v("code",[e._v("CmdChannel")]),e._v("向服务端发送"),v("code",[e._v("Auth")]),e._v("指令。")]),e._v(" "),v("li",[e._v("1.3、服务端通过"),v("code",[e._v("CmdChannel")]),e._v("接收到来自客户端的"),v("code",[e._v("Auth")]),e._v("指令。若验证"),v("code",[e._v("license")]),e._v("有效,则建立"),v("code",[e._v("licenseId")]),e._v("与"),v("code",[e._v("CmdChannel")]),e._v("的映射缓存、\n外网端口与"),v("code",[e._v("CmdChannel")]),e._v("的映射缓存。并启动服务端代理端口,等待用户连接。")])]),e._v(" "),v("h2",{attrs:{id:"_2、用户连接阶段"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_2、用户连接阶段"}},[e._v("#")]),e._v(" 2、用户连接阶段")]),e._v(" "),v("ul",[v("li",[e._v("2.1、用户向服务端代理的外网端口发起请求,服务端建立"),v("code",[e._v("VisitorChannel")]),e._v("。")]),e._v(" "),v("li",[e._v("2.2、根据外网端口查找"),v("code",[e._v("CmdChannel")]),e._v(",若不存在有效的"),v("code",[e._v("CmdChannel")]),e._v(",则关闭该"),v("code",[e._v("VisitorChannel")]),e._v("。否则,\n设置"),v("code",[e._v("VisitorChannel")]),e._v("为不可读,并携带内网映射信息(如:"),v("code",[e._v("127.0.0.1:3306")]),e._v(")通过"),v("code",[e._v("CmdChannel")]),e._v("向客户端发送"),v("code",[e._v("Connect")]),e._v("指令。")])]),e._v(" "),v("h2",{attrs:{id:"_3、实际被代理服务连接阶段"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_3、实际被代理服务连接阶段"}},[e._v("#")]),e._v(" 3、实际被代理服务连接阶段")]),e._v(" "),v("ul",[v("li",[e._v("3.1、客户端通过"),v("code",[e._v("CmdChannel")]),e._v("接收到服务端的"),v("code",[e._v("Connect")]),e._v("指令。拿到需要代理的内网IP、端口号,向实际被\n代理服务发起连接请求,若连接失败,则通过"),v("code",[e._v("CmdChannel")]),e._v("向服务端发送"),v("code",[e._v("DisConnect")]),e._v("指令。建立"),v("code",[e._v("RealServerChannel")]),e._v("成功,设置"),v("code",[e._v("RealServerChannel")]),e._v("为不可读\n状态,并进入4.1阶段")])]),e._v(" "),v("h2",{attrs:{id:"_4、代理通道连接阶段"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_4、代理通道连接阶段"}},[e._v("#")]),e._v(" 4、代理通道连接阶段")]),e._v(" "),v("ul",[v("li",[e._v("4.1、客户端通过"),v("code",[e._v("ProxyChannelQueue")]),e._v("获取或新建一个"),v("code",[e._v("ProxyChannel")]),e._v(",并将"),v("code",[e._v("RealServerChannel")]),e._v("与"),v("code",[e._v("ProxyChannel")]),e._v("进行绑定。")]),e._v(" "),v("li",[e._v("4.2、客户端通过"),v("code",[e._v("ProxyChannel")]),e._v("向服务端发送"),v("code",[e._v("Connect")]),e._v("指令。")]),e._v(" "),v("li",[e._v("4.3、服务端通过"),v("code",[e._v("ProxyChannel")]),e._v("通道收到来自客户端的"),v("code",[e._v("Connect")]),e._v("指令后,将"),v("code",[e._v("ProxyChannel")]),e._v("与对应的"),v("code",[e._v("VisitorChannel")]),e._v("进行绑定,并\n设置"),v("code",[e._v("VisitorChannel")]),e._v("为可读状态。")])]),e._v(" "),v("h2",{attrs:{id:"_5、数据传输阶段"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#_5、数据传输阶段"}},[e._v("#")]),e._v(" 5、数据传输阶段")]),e._v(" "),v("ul",[v("li",[e._v("5.1、服务端通过"),v("code",[e._v("VisitorChannel")]),e._v("收到来自用户的请求数据,然后找到"),v("code",[e._v("VisitorChannel")]),e._v("绑定的"),v("code",[e._v("ProxyChannel")]),e._v(",\n通过"),v("code",[e._v("ProxyChannel")]),e._v("发送"),v("code",[e._v("Transfer")]),e._v("指令,并携带用户请求数据。")]),e._v(" "),v("li",[e._v("5.2、客户端通过"),v("code",[e._v("ProxyChannel")]),e._v("收到来自服务端的"),v("code",[e._v("Transfer")]),e._v("指令,取出用户请求数据。找到"),v("code",[e._v("ProxyChannel")]),e._v("绑定的"),v("code",[e._v("RealServerChannel")]),e._v(",\n通过"),v("code",[e._v("RealServerChannel")]),e._v("向被代理服务写入用户请求数据。")]),e._v(" "),v("li",[e._v("5.3、客户端通过"),v("code",[e._v("RealServerChannel")]),e._v("收到被代理服务响应的数据,找到"),v("code",[e._v("RealServerChannel")]),e._v("绑定的"),v("code",[e._v("ProxyChannel")]),e._v(",\n通过"),v("code",[e._v("ProxyChannel")]),e._v("向服务端发送"),v("code",[e._v("Transfer")]),e._v("指令,并携带响应数据。")]),e._v(" "),v("li",[e._v("5.4、服务端通过"),v("code",[e._v("ProxyChannel")]),e._v("收到来自客户端的"),v("code",[e._v("Transfer")]),e._v("指令,找到"),v("code",[e._v("ProxyChannel")]),e._v("绑定的"),v("code",[e._v("VisitorChannel")]),e._v(",\n通过"),v("code",[e._v("VisitorChannel")]),e._v("向用户端写入响应数据。")])])])}),[],!1,null,null,null);v.default=a.exports}}]); |