Natter icon indicating copy to clipboard operation
Natter copied to clipboard

是否nat存活包存在bug

Open wuwenhan2010 opened this issue 6 months ago • 10 comments

如果不设置存活包,黑山起源大约20s就会卡在半空中,且黑山网络检测工具5彩绘制会中断几秒,然后实体和环境数据包很高,然后正常,但我将存活包设为120时卡顿被大幅延缓了

wuwenhan2010 avatar Jun 03 '25 20:06 wuwenhan2010

python.exe main/natter.py -b 5000 -p 27015 -u -U -k 10 -v 2025-06-04 04:49:59 [I] Natter v2.1.1 2025-06-04 04:49:59 [D] stun: Got address udp://113.124.44.227:11595 from udp://stun.miwifi.com:3478, source udp://192.168.1.5:5000 2025-06-04 04:50:02 [D] keep-alive: OK 2025-06-04 04:50:02 [D] stun: Got address udp://113.124.44.227:11595 from udp://stun.miwifi.com:3478, source udp://192.168.1.5:5000 2025-06-04 04:50:02 [D] fwd-socket: Starting socket udp://192.168.1.5:5000 forward to udp://192.168.1.5:27015 2025-06-04 04:50:03 [I] 2025-06-04 04:50:03 [I] Scanning UPnP Devices... 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/description.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/description.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/description.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/description.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/description.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/description.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/description.xml 2025-06-04 04:50:03 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:04 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:04 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:04 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:04 [D] upnp: Got URL http://192.168.1.1:52869/gatedesc.xml 2025-06-04 04:50:05 [I] [UPnP] Found router 192.168.1.1 2025-06-04 04:50:05 [I] 2025-06-04 04:50:05 [I] udp://192.168.1.5:27015 <--socket--> udp://192.168.1.5:5000 <--Natter--> udp://113.124.44.227:11595 2025-06-04 04:50:05 [I] 2025-06-04 04:50:08 [D] keep-alive: OK 2025-06-04 04:50:08 [D] upnp: OK 2025-06-04 04:50:18 [D] keep-alive: OK 2025-06-04 04:50:18 [D] upnp: OK 2025-06-04 04:50:28 [D] keep-alive: OK 2025-06-04 04:50:28 [D] upnp: OK 2025-06-04 04:50:38 [D] keep-alive: OK 2025-06-04 04:50:38 [D] upnp: OK 2025-06-04 04:50:48 [D] keep-alive: OK 2025-06-04 04:50:48 [D] upnp: OK 2025-06-04 04:50:58 [D] keep-alive: OK 2025-06-04 04:50:58 [D] upnp: OK 2025-06-04 04:51:08 [D] keep-alive: OK 2025-06-04 04:51:08 [D] upnp: OK 2025-06-04 04:51:18 [D] keep-alive: OK 2025-06-04 04:51:18 [D] upnp: OK 2025-06-04 04:51:28 [D] keep-alive: OK 2025-06-04 04:51:28 [D] upnp: OK 2025-06-04 04:51:38 [D] keep-alive: OK 2025-06-04 04:51:38 [D] upnp: OK 2025-06-04 04:51:48 [D] keep-alive: OK 2025-06-04 04:51:48 [D] upnp: OK 2025-06-04 04:51:58 [D] keep-alive: OK 2025-06-04 04:51:58 [D] upnp: OK 2025-06-04 04:52:08 [D] keep-alive: OK 2025-06-04 04:52:08 [D] upnp: OK 2025-06-04 04:52:18 [D] keep-alive: OK 2025-06-04 04:52:18 [D] upnp: OK 2025-06-04 04:52:28 [D] keep-alive: OK 2025-06-04 04:52:28 [D] upnp: OK 2025-06-04 04:52:38 [D] keep-alive: OK 2025-06-04 04:52:38 [D] upnp: OK

wuwenhan2010 avatar Jun 03 '25 20:06 wuwenhan2010

当我调为10时,每次保活都会带来卡顿

wuwenhan2010 avatar Jun 03 '25 20:06 wuwenhan2010

我将 def keep_alive(self): if self.sock is None: self._connect() if self.udp: self._keep_alive_udp() else: self._keep_alive_tcp() Logger.debug("keep-alive: OK") 改为 def keep_alive(self): return if self.sock is None: self._connect() if self.udp: self._keep_alive_udp() else: self._keep_alive_tcp() Logger.debug("keep-alive: OK") 问题暂时解决

wuwenhan2010 avatar Jun 03 '25 21:06 wuwenhan2010

因为这样修改貌似会使upnp不起作用

wuwenhan2010 avatar Jun 03 '25 21:06 wuwenhan2010

环境Windows10,20h2,Python 3.12

wuwenhan2010 avatar Jun 03 '25 21:06 wuwenhan2010

是的,这是 Windows 特有的一个已知 bug,并且很难解决。当 Natter 尝试复用 UDP 端口保活时,程序原有的通信会被中断(仅限 Windows)。并且 STUN 服务器的响应也有可能 “漏到” 应用程序上。

在保活的这一段时间,应用是无法与外界通信的,直至保活流程完成。而如果单纯取消保活,又有端口映射被自动关闭的可能。

由于受制于 Python 使用 Windows Socket 时的表现,这个 bug 不太可能被修复。Linux / macOS / FreeBSD 等没有这类问题,可以优先选择这类系统使用。或者使用 TCP 协议,这在 Windows 上没有问题。

MikeWang000000 avatar Jun 04 '25 07:06 MikeWang000000

是否能创建新线程,使他向公网不断发送数据包以达到保活

wuwenhan2010 avatar Jun 04 '25 09:06 wuwenhan2010

这个不是线程的问题。而是两个UDP连接共用同一个来源端口,即使目的地址不同,在Windows上实际也只有一个连接能用(没法同时复用)。

MikeWang000000 avatar Jun 04 '25 09:06 MikeWang000000

Windows对于socket太严格了

wuwenhan2010 avatar Jun 04 '25 09:06 wuwenhan2010

这主要是两种内核逻辑的问题,类unix或unix都没问题

wuwenhan2010 avatar Jun 04 '25 09:06 wuwenhan2010