完善tcp通道
This commit is contained in:
@@ -68,6 +68,9 @@ impl Context {
|
|||||||
pub fn close(&self) {
|
pub fn close(&self) {
|
||||||
let _ = self.inner.status_sender.send(Status::Close);
|
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) {
|
pub fn switch(&self, nat_type: NatType) {
|
||||||
match nat_type {
|
match nat_type {
|
||||||
NatType::Symmetric => {
|
NatType::Symmetric => {
|
||||||
|
|||||||
@@ -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<()> {
|
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())?;
|
let secret_packet = secret_handshake_request_packet(rsa_cipher, token, server_cipher.key().unwrap())?;
|
||||||
context.send_main(secret_packet.buffer(), server_address).await?;
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ pub fn start_heartbeat(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn heartbeat_packet( device_list: &Mutex<(u16, Vec<PeerDeviceInfo>)>,client_cipher: &Cipher, server_cipher: &Cipher, gateway: bool, src: Ipv4Addr, dest: Ipv4Addr) -> NetPacket<[u8; 48]> {
|
fn heartbeat_packet(device_list: &Mutex<(u16, Vec<PeerDeviceInfo>)>, 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();
|
let mut net_packet = NetPacket::new_encrypt([0u8; 12 + 4 + ENCRYPTION_RESERVED]).unwrap();
|
||||||
net_packet.set_version(Version::V1);
|
net_packet.set_version(Version::V1);
|
||||||
net_packet.set_protocol(Protocol::Control);
|
net_packet.set_protocol(Protocol::Control);
|
||||||
@@ -84,7 +84,7 @@ fn heartbeat_packet( device_list: &Mutex<(u16, Vec<PeerDeviceInfo>)>,client_ciph
|
|||||||
let mut ping = PingPacket::new(net_packet.payload_mut()).unwrap();
|
let mut ping = PingPacket::new(net_packet.payload_mut()).unwrap();
|
||||||
let epoch = { device_list.lock().0 };
|
let epoch = { device_list.lock().0 };
|
||||||
ping.set_epoch(epoch);
|
ping.set_epoch(epoch);
|
||||||
ping.set_time( crate::handle::now_time() as u16);
|
ping.set_time(crate::handle::now_time() as u16);
|
||||||
}
|
}
|
||||||
if gateway {
|
if gateway {
|
||||||
net_packet.set_gateway_flag(true);
|
net_packet.set_gateway_flag(true);
|
||||||
@@ -109,7 +109,8 @@ async fn start_heartbeat_(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
let mut current_dev = current_device.load();
|
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])?;
|
let mut packet = NetPacket::new_encrypt([0; 12 + ENCRYPTION_RESERVED])?;
|
||||||
packet.set_version(Version::V1);
|
packet.set_version(Version::V1);
|
||||||
packet.set_gateway_flag(true);
|
packet.set_gateway_flag(true);
|
||||||
@@ -137,7 +138,7 @@ async fn start_heartbeat_(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
let src = current_dev.virtual_ip();
|
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
|
if let Err(e) = sender.send_main(server_packet.buffer(), current_dev.connect_server).await
|
||||||
{
|
{
|
||||||
log::warn!(
|
log::warn!(
|
||||||
@@ -153,7 +154,7 @@ async fn start_heartbeat_(
|
|||||||
if peer.virtual_ip == current_dev.virtual_ip {
|
if peer.virtual_ip == current_dev.virtual_ip {
|
||||||
continue;
|
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) {
|
if let Some(route) = sender.route_one(&peer.virtual_ip) {
|
||||||
let _ = sender.send_by_key(client_packet.buffer(), &route.route_key()).await;
|
let _ = sender.send_by_key(client_packet.buffer(), &route.route_key()).await;
|
||||||
if route.is_p2p() {
|
if route.is_p2p() {
|
||||||
@@ -190,7 +191,7 @@ async fn start_heartbeat_(
|
|||||||
if peer_ip == ¤t_dev.virtual_gateway {
|
if peer_ip == ¤t_dev.virtual_gateway {
|
||||||
continue;
|
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 {
|
for route in route_list {
|
||||||
if let Err(e) = sender.send_by_key(client_packet.buffer(), &route.route_key()).await {
|
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);
|
log::warn!("peer_ip:{:?},route:{:?},e:{:?}", peer_ip, route, e);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use crate::protocol::body::ENCRYPTION_RESERVED;
|
|||||||
0 15 31
|
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
|
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) |
|
| 源ip地址(32) |
|
||||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
@@ -14,7 +14,7 @@ use crate::protocol::body::ENCRYPTION_RESERVED;
|
|||||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
| 数据体 |
|
| 数据体 |
|
||||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
注:e为是否加密标志,s为服务端通信包标志
|
注:e为是否加密标志,s为服务端通信包标志,u未使用
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user