KCPTUN参数解释(转)

admin2年前他山之石342

为什么要使用KCP?

高RTT的网络,TCP的三次握手、慢启动是非常影响体验的机制。

150ms RTT,使用BBR拥塞控制且网络0丢包的情况下,慢启动到100Mbps至少需要2s,500Mbps至少5s,到1Gbps至少10s。

如果没有BBR,情况则更为糟糕:至少8s才能到100Mbps。

而KCP的多路复用、非退让流控正好消除了TCP的这两个缺点。

一些原KCPTUN没有的参数解释

  • --iocopybuf

    KCP流与TCP流之间互拷数据的缓冲区大小,默认4096,带宽较大时提高此数值可提高传输速度,特别是发送端

  • --irtobackoff

    超时重传的初始退让,即在“RTO + (RTO >> irtobackoff)”才开始第一次超时重传,启用退让可显著提高带宽利用率,建议置1或2

  • --irtobthresh

    少于多少个数据包时,不应用初始退让,即一个RTO后就立刻重传

  • --noearlyretran

    关闭Early Retransmit,可提高带宽利用率,减少数据包重发

使用

1. 计算参数

  • 计算BDP

    BDP = 带宽 * RTT

    RTT可通过ping测量。

    例如500 Mbps带宽,150ms RTT,那么:

    BDP = 500 / 8 * 1024 * 1024 * 0.15
  • 计算窗口大小

    KCP的窗口以数据包数量表示:

    窗口大小 = BDP / MTU

    如果上下下不对等,需要分别单独计算

2. 调整系统参数

  • 调大发送端qdisc的flow limit

    一般在服务端系统调整,对客户端来说,不一定要调整,例如客户端以下行为主,上行带宽使用较低,可跳过此步

    # interface="eth0" # 改成与KCPTUN通讯所通过的网卡名
    # tc qdisc del dev ${interface} root
    # tc qdisc add dev ${interface} root fq limit 20000 flow_limit 256
  • 把接收端的rmem_max调整为BDP的两倍

    一般在客户端系统调整,对服务端来说,不一定要调整,如果服务端以上行为主,下行带宽使用较低,可跳过此步

    编辑/etc/sysctl.conf,在其中加入:

    net.core.rmem_max=33554432 # 32MB

    然后运行:

    # sysctl -p

    注意不要调整net.core.wmem_max,大带宽下会出现反效果,保持默认值212992即可

3. 运行服务端

请自行按需调整参数(特别是wnd,buf、key):

# server_linux_amd64 \
    --target 127.0.0.1:80 \
    --listen 0.0.0.0:80 \
    --mode manual \
    --nodelay 1 \
    --interval 10 \
    --resend 2 \
    --nc 1 \
    --mtu 1350 \
    --nocomp \
    --crypt salsa20 \
    --datashard 0 \
    --parityshard 0 \
    --sndwnd 发送窗口 \
    --rcvwnd 接收窗口 \
    --sockbuf 至少一个BDP \
    --smuxbuf 至少一个BDP \
    --key 密钥 \
    --iocopybuf 65535 \
    --irtobackoff 1 \
    --irtobthresh 256 \
    --noearlyretran

4. 运行客户端

请自行按需调整参数(特别是wnd,buf、key):

# client_linux_amd64 \
    --remoteaddr server:80 \
    --localaddr :8088 \
    --mode manual \
    --nodelay 1 \
    --interval 10 \
    --resend 2 \
    --nc 1 \
    --mtu 1350 \
    --nocomp \
    --crypt salsa20 \
    --datashard 0 \
    --parityshard 0 \
    --sndwnd 发送窗口 \
    --rcvwnd 接收窗口 \
    --sockbuf 至少一个BDP \
    --smuxbuf 至少一个BDP \
    --key 密钥 \
    --iocopybuf 8192 \
    --irtobackoff 1 \
    --irtobthresh 256 \
    --noearlyretran

5. 根据实际使用调优参数

  • 根据丢包情况,决定是否启用FEC

    上面给的服务端与客户端的两个示例参数是没有启用FEC的,如果丢包率较高,请调整--datashard与--parityshard启用FEC,至于多少合适,根据丢包率、以及反复调整测试确定

  • 调整发送/接收窗口

    为什么还需要调整?一开始不是计算好了吗?

    跑的带宽越大,RTT会越高,所以实际的BDP,会比一开始计算的理论值要大,这个具体值,需自行反复调整测试去确定,记得同时更新rmem_max的值。

    注意窗口不要调得太大,如果超出接收端的带宽,会有反效果。


相关文章

两点之间距离 PHP、JS版(美团技术博客算法)

/**  * 计算两点之间距离 有少许可以忽略的误差  * 两点不能差距太远  * 适用于 附近商家 &...

linux测试硬盘速度(转)

在Linux下,一条简单的名利'dd'就可以帮我们到达这个目的。以下内容是关于如何使用‘dd’命令来测试USB硬盘的读写速度。1. 测试写速度:$ sudo mou...

射线法判断点是否在多边形内(转)

/**  * @description 射线法判断点是否在多边形内部  * @param {Object} p ...

如何用tun2socks更优雅的实现Linux全局代理(转)

tun2sockstun2socks分支有相当多,如下go-tun2socks(Golang版本)badvpn-tun2socks(C版本 内存占用小)安装badvpn安装很简单,官方有binary源...

nginx+php大文件上传参数配置(转)

大文件上传要注意几个环节1,上传文件需要花费较长上传时间和处理执行时间,需要设置nginx上传时间、延攻php执行超时时间2,大文件处理需要占用较大内存,需要增加php内存池,考虑到有多个文件上传处理...

dockerfile详解(转)

什么是dockerfile?Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。docker b...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。