diff --git a/vnt/src/channel/context.rs b/vnt/src/channel/context.rs index 1529e4d..aa821df 100644 --- a/vnt/src/channel/context.rs +++ b/vnt/src/channel/context.rs @@ -199,7 +199,7 @@ impl ContextInner { if let Err(e) = udp.send_to(buf, addr) { log::warn!("{:?},add={:?}", e, addr); } - thread::sleep(Duration::from_millis(1)); + thread::sleep(Duration::from_millis(3)); } } pub fn try_send_all_main(&self, buf: &[u8], addr: SocketAddr) { diff --git a/vnt/src/channel/punch.rs b/vnt/src/channel/punch.rs index 216d069..20de4b3 100644 --- a/vnt/src/channel/punch.rs +++ b/vnt/src/channel/punch.rs @@ -1,5 +1,6 @@ use std::collections::HashMap; use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}; +use std::ops::{Div, Mul}; use std::str::FromStr; use std::time::Duration; use std::{io, thread}; @@ -249,6 +250,7 @@ impl Punch { id: Ipv4Addr, mut nat_info: NatInfo, punch_tcp: bool, + count: usize, ) -> io::Result<()> { if self.context.route_table.no_need_punch(&id) { log::info!("已打洞成功,无需打洞:{:?}", id); @@ -320,7 +322,11 @@ impl Punch { //预测范围内最多发送max_k1个包 let max_k1 = 60; //全局最多发送max_k2个包 - let max_k2 = rand::thread_rng().gen_range(600..800); + let mut max_k2: usize = rand::thread_rng().gen_range(600..800); + if count > 1 { + //递减探测规模 + max_k2 = max_k2.mul(4).div(3).div(count).max(max_k1 as usize); + } let port = nat_info.public_ports.get(0).map(|e| *e).unwrap_or(0); if nat_info.public_port_range < max_k1 * 3 { //端口变化不大时,在预测的范围内随机发送 @@ -336,8 +342,7 @@ impl Punch { } else { (max_port - min_port + 1) as usize }; - let mut nums: Vec = (min_port..max_port).collect(); - nums.push(max_port); + let mut nums: Vec = (min_port..=max_port).collect(); nums.shuffle(&mut rand::thread_rng()); self.punch_symmetric(&nums[..k], buf, &nat_info.public_ips, max_k1 as usize)?; } @@ -401,7 +406,7 @@ impl Punch { } let addr = SocketAddr::V4(SocketAddrV4::new(*pub_ip, *port)); self.context.send_main_udp(0, buf, addr)?; - thread::sleep(Duration::from_millis(2)); + thread::sleep(Duration::from_millis(3)); } } Ok(ports.len()) diff --git a/vnt/src/handle/maintain/punch.rs b/vnt/src/handle/maintain/punch.rs index 8c00f45..298d7a5 100644 --- a/vnt/src/handle/maintain/punch.rs +++ b/vnt/src/handle/maintain/punch.rs @@ -158,7 +158,7 @@ fn punch_start( log::error!("{:?}", e); continue; } - if let Err(e) = punch.punch(packet.buffer(), peer_ip, nat_info, count < 2) { + if let Err(e) = punch.punch(packet.buffer(), peer_ip, nat_info, count < 2, count) { log::warn!("{:?}", e) } } @@ -190,7 +190,7 @@ fn punch_request( ) { log::warn!("{:?}", e) } - let sleep_time = [5, 6, 7]; + let sleep_time = [6, 7]; Duration::from_secs(sleep_time[count % sleep_time.len()]) } else { Duration::from_secs(5)