调整路径探测协议

This commit is contained in:
lbl
2026-03-02 14:23:39 +08:00
parent 1dc53ca898
commit 39602c478e
3 changed files with 36 additions and 10 deletions
@@ -106,6 +106,8 @@ pub enum MsgType {
RpcRes = 15,
Quic = 17,
RelayProbe = 18,
RelayProbeReply = 19,
}
impl From<MsgType> for u8 {
fn from(val: MsgType) -> Self {
@@ -138,7 +140,9 @@ impl TryFrom<u8> for MsgType {
14 => MsgType::RpcReq,
15 => MsgType::RpcRes,
16 => MsgType::RelayProbe,
17 => MsgType::Quic,
18 => MsgType::RelayProbeReply,
_ => {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
+24
View File
@@ -261,6 +261,30 @@ impl P2pInboundHandler {
}
MsgType::PingTurn => {}
MsgType::PongTurn => {}
MsgType::RelayProbe => {
let metric = ctx.max_ttl - ctx.ttl;
self.route_table
.add_route_if_absent(ctx.src_ip, Route::from_default_rt(route_key, metric));
let mut packet = NetPacket::new(TransmissionBytes::zeroed_size(
HEAD_LENGTH,
self.packet_crypto.encrypt_reserve(),
))?;
packet.set_msg_type(MsgType::RelayProbeReply);
packet.set_ttl(1);
packet.set_src_id(ctx.dest_ip.into());
packet.set_dest_id(ctx.src_ip.into());
self.packet_crypto.encrypt_in_place(&mut packet)?;
tunnel
.send_to(packet.into_bytes().into_buffer(), route_key.addr())
.await?;
}
MsgType::RelayProbeReply => {
let metric = ctx.max_ttl - ctx.ttl;
self.route_table.add_route(
ctx.src_ip,
Route::from_default_rt(route_key, metric),
);
}
_ => {}
}
Ok(())
+8 -10
View File
@@ -240,23 +240,21 @@ pub async fn relay_probe_task(
};
for (relay_ip, route_key) in selected_peers {
// 构造Ping消息,目标是target_ip,但发送给relay_ip
let Ok(mut ping) = NetPacket::new(TransmissionBytes::zeroed_size(
HEAD_LENGTH + 8,
// 构造RelayProbe消息,目标是target_ip,但发送给relay_ip
let Ok(mut probe) = NetPacket::new(TransmissionBytes::zeroed_size(
HEAD_LENGTH,
socket_manager.encrypt_reserve(),
)) else {
continue;
};
ping.set_msg_type(MsgType::Ping);
ping.set_ttl(2); // TTL设为2,允许中继一次
ping.set_src_id(src.into());
ping.set_dest_id((*target_ip).into());
ping.set_payload(&crate::utils::time::now_ts_ms().to_be_bytes())
.unwrap();
probe.set_msg_type(MsgType::RelayProbe);
probe.set_ttl(2); // TTL设为2,允许中继一次
probe.set_src_id(src.into());
probe.set_dest_id((*target_ip).into());
// 发送给已打洞的客户端,让它中继到目标
if let Err(e) = socket_manager.send_to(ping, &route_key).await {
if let Err(e) = socket_manager.send_to(probe, &route_key).await {
log::debug!(
"Failed to send relay probe to {} for target {}: {:?}",
relay_ip,