调整路径探测协议
This commit is contained in:
@@ -106,6 +106,8 @@ pub enum MsgType {
|
|||||||
RpcRes = 15,
|
RpcRes = 15,
|
||||||
|
|
||||||
Quic = 17,
|
Quic = 17,
|
||||||
|
RelayProbe = 18,
|
||||||
|
RelayProbeReply = 19,
|
||||||
}
|
}
|
||||||
impl From<MsgType> for u8 {
|
impl From<MsgType> for u8 {
|
||||||
fn from(val: MsgType) -> Self {
|
fn from(val: MsgType) -> Self {
|
||||||
@@ -138,7 +140,9 @@ impl TryFrom<u8> for MsgType {
|
|||||||
14 => MsgType::RpcReq,
|
14 => MsgType::RpcReq,
|
||||||
15 => MsgType::RpcRes,
|
15 => MsgType::RpcRes,
|
||||||
|
|
||||||
|
16 => MsgType::RelayProbe,
|
||||||
17 => MsgType::Quic,
|
17 => MsgType::Quic,
|
||||||
|
18 => MsgType::RelayProbeReply,
|
||||||
_ => {
|
_ => {
|
||||||
return Err(io::Error::new(
|
return Err(io::Error::new(
|
||||||
io::ErrorKind::InvalidInput,
|
io::ErrorKind::InvalidInput,
|
||||||
|
|||||||
@@ -261,6 +261,30 @@ impl P2pInboundHandler {
|
|||||||
}
|
}
|
||||||
MsgType::PingTurn => {}
|
MsgType::PingTurn => {}
|
||||||
MsgType::PongTurn => {}
|
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(())
|
Ok(())
|
||||||
|
|||||||
@@ -240,23 +240,21 @@ pub async fn relay_probe_task(
|
|||||||
};
|
};
|
||||||
|
|
||||||
for (relay_ip, route_key) in selected_peers {
|
for (relay_ip, route_key) in selected_peers {
|
||||||
// 构造Ping消息,目标是target_ip,但发送给relay_ip
|
// 构造RelayProbe消息,目标是target_ip,但发送给relay_ip
|
||||||
let Ok(mut ping) = NetPacket::new(TransmissionBytes::zeroed_size(
|
let Ok(mut probe) = NetPacket::new(TransmissionBytes::zeroed_size(
|
||||||
HEAD_LENGTH + 8,
|
HEAD_LENGTH,
|
||||||
socket_manager.encrypt_reserve(),
|
socket_manager.encrypt_reserve(),
|
||||||
)) else {
|
)) else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
ping.set_msg_type(MsgType::Ping);
|
probe.set_msg_type(MsgType::RelayProbe);
|
||||||
ping.set_ttl(2); // TTL设为2,允许中继一次
|
probe.set_ttl(2); // TTL设为2,允许中继一次
|
||||||
ping.set_src_id(src.into());
|
probe.set_src_id(src.into());
|
||||||
ping.set_dest_id((*target_ip).into());
|
probe.set_dest_id((*target_ip).into());
|
||||||
ping.set_payload(&crate::utils::time::now_ts_ms().to_be_bytes())
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
// 发送给已打洞的客户端,让它中继到目标
|
// 发送给已打洞的客户端,让它中继到目标
|
||||||
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!(
|
log::debug!(
|
||||||
"Failed to send relay probe to {} for target {}: {:?}",
|
"Failed to send relay probe to {} for target {}: {:?}",
|
||||||
relay_ip,
|
relay_ip,
|
||||||
|
|||||||
Reference in New Issue
Block a user