From 7b770a1bb00584697d1b08237362a6aa82af43c4 Mon Sep 17 00:00:00 2001 From: lubeilin <1791778603@qq.com> Date: Sun, 27 Aug 2023 14:07:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84tcp=E9=80=9A=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vnt/src/channel/channel.rs | 3 +++ vnt/src/handle/handshake_handler.rs | 3 +++ vnt/src/handle/heartbeat_handler.rs | 13 +++++++------ vnt/src/protocol/mod.rs | 4 ++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/vnt/src/channel/channel.rs b/vnt/src/channel/channel.rs index ec8e7b7..f3486dd 100644 --- a/vnt/src/channel/channel.rs +++ b/vnt/src/channel/channel.rs @@ -68,6 +68,9 @@ impl Context { pub fn close(&self) { let _ = self.inner.status_sender.send(Status::Close); } + pub fn is_main_tcp(&self)->bool{ + self.inner.main_tcp_channel.is_some() + } pub fn switch(&self, nat_type: NatType) { match nat_type { NatType::Symmetric => { diff --git a/vnt/src/handle/handshake_handler.rs b/vnt/src/handle/handshake_handler.rs index bd1ccea..c0aa422 100644 --- a/vnt/src/handle/handshake_handler.rs +++ b/vnt/src/handle/handshake_handler.rs @@ -207,5 +207,8 @@ pub async fn secret_handshake_req(context: &Context, server_address: SocketAddr, rsa_cipher: &RsaCipher, server_cipher: &Cipher, token: String, ) -> crate::Result<()> { let secret_packet = secret_handshake_request_packet(rsa_cipher, token, server_cipher.key().unwrap())?; context.send_main(secret_packet.buffer(), server_address).await?; + if context.is_main_tcp(){ + context.send_main_udp(secret_packet.buffer(),server_address).await?; + } Ok(()) } diff --git a/vnt/src/handle/heartbeat_handler.rs b/vnt/src/handle/heartbeat_handler.rs index ae805da..2efbb7c 100644 --- a/vnt/src/handle/heartbeat_handler.rs +++ b/vnt/src/handle/heartbeat_handler.rs @@ -71,7 +71,7 @@ pub fn start_heartbeat( } -fn heartbeat_packet( device_list: &Mutex<(u16, Vec)>,client_cipher: &Cipher, server_cipher: &Cipher, gateway: bool, src: Ipv4Addr, dest: Ipv4Addr) -> NetPacket<[u8; 48]> { +fn heartbeat_packet(device_list: &Mutex<(u16, Vec)>, client_cipher: &Cipher, server_cipher: &Cipher, gateway: bool, src: Ipv4Addr, dest: Ipv4Addr) -> NetPacket<[u8; 48]> { let mut net_packet = NetPacket::new_encrypt([0u8; 12 + 4 + ENCRYPTION_RESERVED]).unwrap(); net_packet.set_version(Version::V1); net_packet.set_protocol(Protocol::Control); @@ -84,7 +84,7 @@ fn heartbeat_packet( device_list: &Mutex<(u16, Vec)>,client_ciph let mut ping = PingPacket::new(net_packet.payload_mut()).unwrap(); let epoch = { device_list.lock().0 }; ping.set_epoch(epoch); - ping.set_time( crate::handle::now_time() as u16); + ping.set_time(crate::handle::now_time() as u16); } if gateway { net_packet.set_gateway_flag(true); @@ -109,7 +109,8 @@ async fn start_heartbeat_( return Ok(()); } let mut current_dev = current_device.load(); - if count % 20 == 2 { + //如果和服务端使用tcp连接,则维持udp洞的频率要更高些 + if (sender.is_main_tcp() && count % 2 == 0) || (!sender.is_main_tcp() && count % 20 == 1) { let mut packet = NetPacket::new_encrypt([0; 12 + ENCRYPTION_RESERVED])?; packet.set_version(Version::V1); packet.set_gateway_flag(true); @@ -137,7 +138,7 @@ async fn start_heartbeat_( } } let src = current_dev.virtual_ip(); - let server_packet = heartbeat_packet(&device_list,&client_cipher, &server_cipher, true, src, current_dev.virtual_gateway); + let server_packet = heartbeat_packet(&device_list, &client_cipher, &server_cipher, true, src, current_dev.virtual_gateway); if let Err(e) = sender.send_main(server_packet.buffer(), current_dev.connect_server).await { log::warn!( @@ -153,7 +154,7 @@ async fn start_heartbeat_( if peer.virtual_ip == current_dev.virtual_ip { continue; } - let client_packet = heartbeat_packet(&device_list,&client_cipher, &server_cipher, false, src, peer.virtual_ip); + let client_packet = heartbeat_packet(&device_list, &client_cipher, &server_cipher, false, src, peer.virtual_ip); if let Some(route) = sender.route_one(&peer.virtual_ip) { let _ = sender.send_by_key(client_packet.buffer(), &route.route_key()).await; if route.is_p2p() { @@ -190,7 +191,7 @@ async fn start_heartbeat_( if peer_ip == ¤t_dev.virtual_gateway { continue; } - let client_packet = heartbeat_packet(&device_list,&client_cipher, &server_cipher, false, src, *peer_ip); + let client_packet = heartbeat_packet(&device_list, &client_cipher, &server_cipher, false, src, *peer_ip); for route in route_list { if let Err(e) = sender.send_by_key(client_packet.buffer(), &route.route_key()).await { log::warn!("peer_ip:{:?},route:{:?},e:{:?}", peer_ip, route, e); diff --git a/vnt/src/protocol/mod.rs b/vnt/src/protocol/mod.rs index e6afa7d..592972b 100644 --- a/vnt/src/protocol/mod.rs +++ b/vnt/src/protocol/mod.rs @@ -6,7 +6,7 @@ use crate::protocol::body::ENCRYPTION_RESERVED; 0 15 31 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |e|s|unused| 版本(4) | 协议(8) | 上层协议(8) | 初始ttl(4) | 生存时间(4) | + |e |s |u |u| 版本(4) | 协议(8) | 上层协议(8) | 初始ttl(4) | 生存时间(4) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 源ip地址(32) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -14,7 +14,7 @@ use crate::protocol::body::ENCRYPTION_RESERVED; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 数据体 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - 注:e为是否加密标志,s为服务端通信包标志 + 注:e为是否加密标志,s为服务端通信包标志,u未使用 */