Open zaiqixiao opened 6 months ago
Natter 的 socket 转发方法内的 UDP buffer 大小目前固定为 8192,如果收到的 UDP 数据包的内容大于这个值,就会被丢弃(丢包)。
可以手动把这个值改大,再试试情况是否有改善:
Gost 的缓冲区大小不太清楚,看起来也是超过了限制。
想问一下您的使用场景?以及 MTU 值是否设置的比较大。
目前主要是UDP协议的游戏服务器比如(饥荒、七日杀),还有N2N。手动改大缓冲区会有什么影响吗?比如cpu利用率会变高?我以为gost缓冲区是natter带参执行的,但是我也稍微翻了一下代码没看到相关的。MTU值我记得代码里面好像是默认1500。使用socket就经常出现:【fwd-socket: socket send thread is exiting: timed out】
我这里暂时没有找到 Gost 配置缓冲值的方法,Natter 也确实没有将缓冲值参数带给 Gost。
Natter socket 转发相关:
self.buff_size
改大几乎没有副作用。这个变量的单位是字节数。只要不是几千倍的离谱值都可以。
关于 Natter 超时,下一行有 self.udp_timeout
,目前的默认值是 60
秒。
可以同时调一调这两个值看看是否有所改善。
以后 Natter 也会考虑将超时时间设置为命令行选项,方便修改。
好的谢谢佬,我先改成32kb试试看。
增大缓冲区确实会有所改善,不过我发现缓冲区设置成1MB跟2MB后性能似乎没有什么改变。我是通过工具不断向UDP端口发送数据,每发送100次总会有10次左右没有返回延迟,不知道是什么原因。每个包是64字节。超时时间我调成了120。我想知道这些数值有没有一个比较推荐的平衡值。或者说有没有更好的方法可以测试性能。
会出现有规律性的超时,buffer size是1MB,超时时间是300。
是否是针对公网的 UDP 端口进行的测试?此时已经过运营商,UDP 可能会受 QoS 策略影响而偶发丢包。
关于性能,-m socket
不是一种高性能的方法,而是一种“有 Python 就能跑”的一种兼容性考虑,适用于对延迟不是很敏感的场景。
性能最高的是 Linux 下的 -m iptables
,并且不存在配置缓冲区的问题,因为是内核直接处理,而不是在应用层复制转发一遍。可惜 Windows 下缺少类似方法。
Windows 下还可以使用 -m socat
,另一种工具。它在 Linux/Unix 上常见,也有移植到 Windows 的版本:
https://sourceforge.net/projects/unix-utils/files/socat/1.7.3.2/
[是针对公网的端口测试。因为我对这几种转发并没有很深刻的认识,不过根据查阅的资料说gost作为协程更适合处理I/O所以一开始是想尝试gost。我会尝试使用socat测试一下。谢谢佬] 不过我在gost的参考方法中有看到一个readBufferSize不知道是不是等同于socket的buffersize呢
是的,不过只适用于gost v3。
如果使用的是 v3 版本,可以改一下这里:
"?ttl=%ds"
改成 "?ttl=%ds&readBufferSize=65535"
或其他值,试试效果。
调整之后遇到一个问题,测试UDP端口时延迟波动比较大,使用gost转发N2N的UDP端口。两台设备之间无法ping通。 补充:防火墙都关闭尝试过。这张截图没关闭。 使用socat的话就正常 还有windows下能否用netsh实现端口转发
netsh 在各版本 Windows 上的功能各不相同;Server 版可以达到类似 Linux iptables 的效果,但是很少有人用到,也就没有做。 一般版本,使用 portproxy 的话只能转发 TCP,是不支持 UDP 的。并且它会独占端口,Natter 不能复用。
gost 转发的问题,只能调参数试试了,比如 gost udp 下的 keepalive
参数等等。不确定它的实际效果如何。
好的谢谢佬
Discussed in https://github.com/MikeWang000000/Natter/discussions/87