update connection quality speed

This commit is contained in:
2026-04-03 19:34:03 +07:00
parent 2db4ba1e9d
commit 1ab28cefcf
7 changed files with 63 additions and 30 deletions
+2 -2
View File
@@ -90,12 +90,12 @@ impl SessionManager {
#[cfg(any(target_os = "android", target_os = "ios"))]
{
config = config.disable_routing().with_mtu(1500);
config = config.disable_routing().with_mtu(1380);
}
#[cfg(target_os = "linux")]
{
config = config.with_mtu(1500);
config = config.with_mtu(1380);
}
NetworkConfig::init_global(config.mtu);
+1 -1
View File
@@ -19,7 +19,7 @@ async fn main() -> anyhow::Result<()> {
let config = EngineConfig::new(&remote_address)
.with_cache_path(".")
.with_mtu(1500);
.with_mtu(1380);
NetworkConfig::init_global(config.mtu);
+53 -20
View File
@@ -111,7 +111,8 @@ impl ConnectionManager {
for (_, socket) in socket_set.iter_mut() {
match socket {
Socket::Tcp(tcp) => {
if !tcp.is_open() {
// 🛡️ ИСПРАВЛЕНО: Только пустые базовые сокеты слушают 443
if !tcp.is_open() && tcp.local_endpoint().is_none() {
let _ = tcp.listen(IpListenEndpoint {
addr: None,
port: 443,
@@ -119,7 +120,8 @@ impl ConnectionManager {
}
}
Socket::Udp(udp) => {
if !udp.is_open() {
// 🛡️ ИСПРАВЛЕНО: Только пустые базовые сокеты биндят 53
if !udp.is_open() && udp.endpoint().port == 0 {
let _ = udp.bind(IpListenEndpoint {
addr: None,
port: 53,
@@ -204,6 +206,11 @@ impl ConnectionManager {
fn intercept_tcp(&mut self, f: Flow, socket_set: &mut SocketSet) {
if !self.tracker.has_connection_from(f.src, f.src_p, socket_set) {
if socket_set.iter().count() >= 2048 {
netrunner_logger::warn!("🔥 TCP Socket limit reached! Dropping SYN.");
return;
}
let socket = self.factory.create_listening_tcp(Some(f.dst), f.dst_p);
let handle = socket_set.add(socket);
self.tracker.add_pending_tcp(handle);
@@ -220,6 +227,11 @@ impl ConnectionManager {
return;
}
if socket_set.iter().count() >= 2048 {
netrunner_logger::warn!("🔥 UDP Socket limit reached! Dropping packet.");
return;
}
let socket_id = self.tracker.next_id();
let (dst_ip, target) = self.resolver.resolve_destination(f.dst, f.dst_p);
@@ -249,15 +261,32 @@ impl ConnectionManager {
}
}
}
fn handle_tcp(&mut self, handle: SocketHandle, socket: &mut tcp::Socket) {
self.tracker.update_activity(handle);
if socket.state() == tcp::State::Closed {
let state = socket.state();
// 1. Терминальные состояния (уже закрыты)
if state == tcp::State::Closed || state == tcp::State::TimeWait {
self.tracker.queue_removal(handle);
return;
}
// 🛡️ ИСПРАВЛЕНИЕ: Мы не считаем сокет "мертвым", если он в процессе Handshake
let is_handshaking = state == tcp::State::SynSent || state == tcp::State::SynReceived;
// 🚨 Логика очистки Half-Close (CloseWait/FinWait2)
// Убиваем сокет ТОЛЬКО если он не слушает, не коннектится И при этом не может передавать данные
if !is_handshaking && state != tcp::State::Listen {
if !socket.may_recv() && !socket.may_send() {
trace!(%handle, ?state, "💀 Cleaning up dead half-closed socket");
socket.abort();
self.tracker.queue_removal(handle);
return;
}
}
// Тайм-аут на установку соединения (если SYN висит слишком долго)
if self
.tracker
.check_pending_timeout(handle, Duration::from_secs(20))
@@ -267,28 +296,33 @@ impl ConnectionManager {
return;
}
if socket.state() == tcp::State::Established && self.tracker.should_init_tcp(handle) {
let ep = socket.local_endpoint().unwrap();
let socket_id = self.tracker.next_id();
let (dst_ip, target) = self.resolver.resolve_destination(ep.addr, ep.port);
// Инициализация туннеля при успешном коннекте
if state == tcp::State::Established && self.tracker.should_init_tcp(handle) {
if let Some(ep) = socket.local_endpoint() {
let socket_id = self.tracker.next_id();
let (dst_ip, target) = self.resolver.resolve_destination(ep.addr, ep.port);
let (conn, rx_smol, tx_smol, handshake_tx) = TcpConnection::new(handle);
self.tracker.register_tcp(handle, socket_id, conn, tx_smol);
let (conn, rx_smol, tx_smol, handshake_tx) = TcpConnection::new(handle);
self.tracker.register_tcp(handle, socket_id, conn, tx_smol);
TcpConnection::spawn(
socket_id,
dst_ip,
ep.port,
target,
rx_smol,
handshake_tx,
self.tx_to_tunnel.clone(),
);
TcpConnection::spawn(
socket_id,
dst_ip,
ep.port,
target,
rx_smol,
handshake_tx,
self.tx_to_tunnel.clone(),
);
}
}
// Прокачка данных
if let Some(conn) = self.tracker.get_tcp_mut(handle) {
if !conn.tick(socket) {
// Если tick вернул false (ошибка в каналах или Close от туннеля)
socket.abort();
self.tracker.queue_removal(handle);
}
}
}
@@ -314,7 +348,6 @@ impl ConnectionManager {
pub fn cleanup(&mut self, socket_set: &mut SocketSet) {
self.tracker.enforce_idle_timeouts(Duration::from_secs(120));
self.tracker.cleanup(socket_set);
}
}
+1 -1
View File
@@ -262,7 +262,7 @@ impl EngineConfig {
Self {
remote_address: remote_address.into(),
cache_path: ".".to_string(),
mtu: 1500,
mtu: 1380,
setup_routing: true,
any_ip: true,
transparent_mode: true,
+2 -2
View File
@@ -90,8 +90,8 @@ impl SocketProvider for SmolSocketFactory {
socket.set_ack_delay(None);
}
TrafficProfile::Bulk | TrafficProfile::Default => {
socket.set_nagle_enabled(true);
socket.set_ack_delay(Some(Duration::from_millis(10)));
socket.set_nagle_enabled(false);
socket.set_ack_delay(None);
}
_ => {}
}