是否nat存活包存在bug
如果不设置存活包,黑山起源大约20s就会卡在半空中,且黑山网络检测工具5彩绘制会中断几秒,然后实体和环境数据包很高,然后正常,但我将存活包设为120时卡顿被大幅延缓了
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
当我调为10时,每次保活都会带来卡顿
我将 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") 问题暂时解决
因为这样修改貌似会使upnp不起作用
环境Windows10,20h2,Python 3.12
是的,这是 Windows 特有的一个已知 bug,并且很难解决。当 Natter 尝试复用 UDP 端口保活时,程序原有的通信会被中断(仅限 Windows)。并且 STUN 服务器的响应也有可能 “漏到” 应用程序上。
在保活的这一段时间,应用是无法与外界通信的,直至保活流程完成。而如果单纯取消保活,又有端口映射被自动关闭的可能。
由于受制于 Python 使用 Windows Socket 时的表现,这个 bug 不太可能被修复。Linux / macOS / FreeBSD 等没有这类问题,可以优先选择这类系统使用。或者使用 TCP 协议,这在 Windows 上没有问题。
是否能创建新线程,使他向公网不断发送数据包以达到保活
这个不是线程的问题。而是两个UDP连接共用同一个来源端口,即使目的地址不同,在Windows上实际也只有一个连接能用(没法同时复用)。
Windows对于socket太严格了
这主要是两种内核逻辑的问题,类unix或unix都没问题