S2 - 通信协议

代码详见:代码arrow-up-right

  1. 数据传输过程中的数据包格式如下

     +++++++++++++++++++++++++++++++++++++++++++++++++
     + size(16bit) | crc32(32bit) | protobuf payload +
     +++++++++++++++++++++++++++++++++++++++++++++++++
  2. msg结构为数据传输的基本结构,数据结构arrow-up-right如下

     message msg {
         enum type { // 消息类型定义
             ...
         }
         type      _type = 1; // 消息类型,详见type结构
         string     from = 2; // 数据来源client id
         string       to = 4; // 数据目标client id
         string  link_id = 6; // 虚拟链接id
         oneof payload { // 消息内容定义
             ...
         }
     }
  3. 对于数据传输过程中的编码,目前已有统一的封装,详情见代码arrow-up-right中的ReadMessage和WriteMessage接口

握手

在创建tcp/tls连接后client会发送一个握手报文来表明身份,其中包含一个enc字段该字段的值为配置文件中的secret的md5码

TODO补图

虚拟链接

在终端页面创建任何一个链接时,都会创建一个虚拟链接,该虚拟链接有两个端点,分别为控制端受控端体现在msg接口中的fromto字段

在每一个虚拟链接创建时都会发起一个connect_req请求,该请求使用connect_requestarrow-up-right结构进行包装

当受控端收到connect_req请求后会进行相应的处理,详见代码arrow-up-right

  1. 收到shell请求后

    • 若给定exec参数,则拉起exec参数指定的程序,并接管pty设备

    • 否则根据当前操作系统拉起指定程序

      • windows: 若当前操作系统有powershell则拉起powershell程序,否则拉起cmd程序

      • 非windows: 若当前系统有bash则拉起bash程序,否则拉起sh程序

    • 返回connect_response消息,其中包含是否成功或错误信息

  2. 收到vnc请求后

    • 从6155~6955之间顺序挑一个端口创建一个websocket服务,用于与后续创建的子进程通信

    • 创建子进程,action参数设置为vnc.worker,并传入规则名称和websocket端口号

    • 返回connect_response消息,其中包含是否成功或错误信息

最后更新于