40 lines
1.9 KiB
Protocol Buffer
40 lines
1.9 KiB
Protocol Buffer
|
|
//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()函数的返回值)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|