再次打扰了,感谢作者的无私奉献,能用上这样的黑科技真的太好了,目前本人是用在游戏代理上,因是外服游戏,出口路由经常抽风,延迟丢包波动,很是烦恼,用了kcptun后感觉可以稳定连接,因此想详细了解参数并优化一下。仔细看了说明书后,感觉有几个地方不是很懂,想请教一下。
一、关于interval参数,看了下KCP协议说明感觉没有详细说明这个参数的详细作用和设置对应的毫秒后的效果,说明里面只说了:协议内部工作的 interval,单位毫秒,比如 10ms或者 20ms。看了下kcptun预设的mode,normal对应30ms,fast对应20ms,最快的fast3是10ms,想问下这个数值的设置会影响哪个方面的时间,是不是越小越好,比如5ms,甚至更低的1ms。这个是否会影响整个连接的延迟?还是只是设置发包间隔?
二、关于nocomp参数,说明书上写着添加这个参数后是关闭压缩,也就是默认是压缩的,但这个压缩的意思指的是什么?有压缩是不是指数据包会小,传输快一点,但会消耗服务段与客户端的运算资源?而关闭压缩说明书上写着可能会降低延迟,这里的降低延迟具体是啥意思,延迟效果降低(延迟数值变大),还是指延迟数值降低(那这样就是延迟降低了响应速度岂不是更好,对游戏而言延迟越低越好)
三、关于acknodelay参数,在./master/client/main.go中看到这个参数的意思是"flush ack immediately when a packet is received",在下英文太差,谷歌翻一下字面意思是“当接收到分组时立即刷新ack”,这个参数的作用是什么呢?该参数默认是false,经过添加测试发现如果开启该参数,nodelay parameters就会变成0 40 0 0,也就是设置的nodelay、interval、resend、nc全部形同虚设,无法生效。所以没明白这个参数的具体效果。
四、关于sndwnd、rcvwnd的计算,说明书上有写明计算公式,但其中的平均数据包大小avgsize是怎么来的,是可以直接用1k计算还是每个服务器不同对应数值也不同?还有rtt具体指的是哪里到哪里的延迟?是客户端到服务端的ping值吗?也就是本机到VPS的ping值嘛?是直接在本机运行cmd后ping服务器的数值嘛?那这样的话,如果ping值不稳定,是不是可以取平均值?不过看了其他的Issues,好像不是指这个ping值,如果不是,那这个实际rtt怎么获得?
五、关于sockbuf、keepalive参数,同样在./master/client/main.go谷歌翻译字面意思,sockbuf指的是套接字缓冲区大小以字节为单位,keepalive指的是nat存活间隔以秒为单位。sockbuf参数默认为4194304,这个数值是怎么来的?是固定值还是自定义值?如果是自定义的,那设大设小的效果有什么区别?keepalive参数默认为10秒,这个是不是也一样可以自定义?那设置不同值后效果有何区别?
问题有点多,希望有大神费心讲解一下,感谢能进来看完问题的,也希望看完后能费心回复一下,谢谢
贴一下正在优化的参数,客户端的参数
--crypt aes-192
--mode manual
--conn 1
--autoexpire 0
--mtu 650 看了其他Issues好像这个值越小,丢包率越低,不过这个数值设小后的负面影响不知道是啥
--sndwnd 64
--rcvwnd 512
--datashard 10
--parityshard 3
--dscp 46
--nocomp
--nodelay 1
--interval 5 最快的fast3是10,设置为5是不是可以更快
--resend 2
--nc 1
--sockbuf 4194304
--keepalive 10
@xtaci 感谢讲解,Win7好像没有SNMP吧
windows 根本没有sigusr1的信号,不支持snmp
@xtaci 在服务端输入killall -SIGUSR1 kcptunserver,“kcptunserver”是我改好的名字,输入完后并没有显示什么,请问如果打印SNMP信息呢?
搭车问下sockbuf调小后,对数据传输有何实际影响?主要影响延迟还是传输速度?谢谢!
这个问题很简单啊,你想象只有一个Byte的sockbuf,会发生什么情况。
不是很理解呢,buff满了是不是就会开始丢包?
是的
- https://github.com/xtaci/kcp-go/blob/master/sess.go#L511, https://github.com/xtaci/kcp-go/blob/master/kcp.go#L858 interval最小10ms, 是用来限定flush的频率。直接涉及到CPU的使用率,越短占用率越高, 低端CPU根本扛不住,越长发包时间越不精确,但CPU会低。
- 压缩是很tricky的,如果压缩要花一秒时间,不压缩直接传输都只需要0.2秒,谁更快,自己分析吧。
- acknodelay是完全实验性的,默认关闭的,相当于没开以前,收到包后,等interval过了,把收到的全部包一次性ack,开启后,收到一个包回应一个ack. 这个会增加上行包的个数(带宽),但丢包损失(一次丢一组vs一次丢一个ack)更小,在非对称上下行的带宽下,打开acknodelay很不实用。
- rtt就是ping rtt, avgsize是通过SNMP中的BytesSent / OutSegs 或者 BytesReceived/InSegs得到
- sockbuf = socket buffer,4MB是linux/darwin的默认最大值,可以调小,这个值就是延迟带宽积。
keepalive的目的是,让路由器不要删除这个端口映射,可以搜索UDP端口mapping
avgsize是通过SNMP中的BytesSent / OutSegs 或者 BytesReceived/InSegs
具体用什么命令查看的?
Most helpful comment
keepalive的目的是,让路由器不要删除这个端口映射,可以搜索UDP端口mapping