//Relay-Based Connection Upgrade (RBCU) 是通信流程中的一个步骤。它通过中继路径确保基础通信的可用性,并在此基础上,尝试升级到更高效的直连(P2P)方式。 //## RBCU 流程 //前提:1. 已建立的中继连接, 2. 可以获取自己socket对应的外网地址端口(STUN或其他)。 //设定主动方为A,被动方为B //1. 【基于中继】A获取地址列表,形成RbcuInfo发送到B,并等待RbcuInfo。 //2. 【基于中继】B收到RbcuInfo,将自己的地址列表形成RbcuResp作为响应。 //4. 【基于UDP】AB向对方的地址列表发送RbcuProbe //5. 【基于UDP】AB收到RbcuProbe则认为直连成功,并回复RbcuConfirm // 参阅:https://docs.star-lock.cn/zh/starchart/rbcu syntax = "proto3"; package main; option go_package = "./spb/rbcu"; // RbcuInfo 地址交换 message RbcuInfo { string SessionId = 1; // 随机UUID,用于匹配接下来的打洞会话 string Name = 2; // 用于标识自己的名字 repeated string Address = 4; // 地址+端口 列表 uint64 Time = 5; // 开始时间戳 bool isResp = 6; // 是否是响应, 如果是响应,就不用回复了, 第一个发起的人这里传false,后续收到并发出的人这里传true } // RbcuProbe 万箭齐发 message RbcuProbe { string SessionId = 1; // RbcuInfo的UUID,用于匹配 string Data = 2; // 100字节随机数据,因为有些防火墙会拦截小包(空白也行,但是会被pb压缩,所以最好填充随机或顺序数据) string TargetAddress = 3; // 目标地址,例如这个包我发往192.168.1.2:9000 那么这个字段就是192.168.1.2:9000 } // RbcuConfirm 连通确认 message RbcuConfirm { string SessionId = 1; // RbcuInfo的UUID,用于匹配 string ProbeAddress = 2; // 地址+端口 从RbcuProbe里面取的TargetAddress string ReceiveAddress = 3; // 地址+端口 收到RbcuProbe的来源地址(udp_read()函数的返回值) }