调整路径探测协议
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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(())
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user