KCP 定义 KCP是一个快速可靠协议, 能以比TCP浪费10%-20%的带宽的代价, 换取平均延迟降低30%-40%, 且最大延迟降低三倍的效果. 纯算法实现, 不负责底层协议的手法, 需要使用者自己定义下层数据包的发送方式, 用callback的方式提供给KCP. KCP是面相流速设计的, 即从一端到另一端的时间. 可以通过以下策略达到提高流速的效果: RTO不翻倍 TCP超时计算是RTO*2, 如果连续丢包就会增长过快. KCP启动快速模式后只增长1.5. 选择性重传 TCP丢包后会重传从丢的包开始往后的所有数据, KCP是选择性重传, 只传丢失的包. KCP中, 除去单独的ACK包, 所有包都采用UNA.
[1.jpg] kcp源码流程图 总结:UDP收到的包,不断通过kcp_input喂给KCP,KCP会对这部分数据(KCP协议数据)进行解包,重新封装成应用层用户数据,应用层通过kcp_recv获取 应用层通过kcp_send发送数据,KCP会把用户数据拆分kcp数据包,通过kcp_output,以UDP(send)的方式发送。 1.2 KCP的配置模式 这部分KCP文档有介绍,理解KCP协议无需过于关注。 : kcp->rx_minrto = 10; 1.3 KCP为什么存在? KCP主要使用两种策略来决定是否需要重传KCP数据包,超时重传、快速重传、选择重传。
查看官方文档kcp kcp-go是用go实现了kcp协议的一个库,其实kcp类似tcp,协议的实现也很多参考tcp协议的实现,滑动窗口,快速重传,选择性重传,慢启动等。 kcp浅析 kcp是基于udp实现的,所有udp的实现这里不做介绍,kcp做的事情就是怎么封装udp的数据和怎么解析udp的数据,再加各种处理机制,为了重传,拥塞控制,纠错等。 kcp.snd_wnd, kcp.rmt_wnd) 77 if kcp.nocwnd == 0 { 78 cwnd = _imin_(kcp.cwnd, cwnd) 79 89 newseg.sn = kcp.snd_nxt 90 kcp.snd_buf = append(kcp.snd_buf, newseg) 91 kcp.snd_nxt = kcp.mss 198 } 199 if kcp.cwnd < 1 { 200 kcp.cwnd = 1 201 kcp.incr = kcp.mss 202
KCP通过ikcp_recv将数据接收出来,如果被分片发送,将在此自动重组,数据将与发送前保持一致。 KCP为什么存在? KCP KCP协议就是在保留UDP快的基础上,提供可靠的传输,应用层使用更加简单——TCP可靠简单,但是复杂无私,所以速度慢。KCP尽可能保留UDP快的特点下,保证可靠。 KCP工作模式: KCP协议默认模式是一个标准的 ARQ,需要通过配置打开各项加速开关: int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, KCP有正常模式和快速模式两种,通过以下策略达到提高流速的结果: 普通模式/正常模式: ikcp_nodelay(kcp, 0, 40, 0, 0); 极速模式/快速模式: ikcp_nodelay(kcp KCP的ACK是否延迟发送可以调节。
kcp KCP 即 Kotlin Compiler Plugin(Kotlin编译器插件),在 kotlinc 过程中提供 hook 时机,在此期间可以生成代码、修改字节码等。 其中我们很熟悉的kotlin-android-extensions就是一KCP插件,虽然他现在也已经废弃了。 所以当我们打开gradle内的compose的时候,其实也就相当于给kcp添加了个额外的编译插件。然后在kotlinCompiler的过程中修改当前我们写的compose相关的代码。
KCP对这些参数基本都可配,也没用建立/关闭连接的过程。 其实KCP并不神秘,因为TCP的高度自治(很多东西都不可配),满足不了如今各种速度需求。 使用KCP和使用TCP有些不同,所以上手之前需要先了解下KCP如何使用,需要时间成本。 第一步,就是创建一个kcp实例,相当于一个句柄。 int output(const char *buf, int len, ikcpcb *kcp, void *user) 第三步,更新KCP状态。 调用ikcp_send之后,KCP最后会使用上面设置的output函数来将发送数据(KCP自己并不关心如何发送数据)。 先手动预接收数据,然后再调用ikcp_input将裸数据交给KCP,这些数据有可能是KCP控制报文,并不是我们要的数据。
KCP协议:为速度而生的传输利器 详细请看这篇:https://luyuhuang.tech/2020/12/09/kcp.html KCP这个协议说起来还挺有意思,最初是为了解决游戏行业的网络延迟问题而设计的 KCP的设计思路完全不同。它基于UDP协议,但在UDP的基础上实现了自己的可靠传输机制。简单说,KCP就是"用空间换时间"的典型代表。 KCP有几个核心特性让我印象深刻: 快速重传机制:TCP丢包后要等3个重复ACK才重传,KCP可以设置成丢包后立即重传。 KCP支持选择性重传,只重传真正丢失的包。这个特性在网络质量不好的时候特别有用。 无拥塞控制:这个有点激进,TCP会根据网络状况调整发送速度,KCP可以选择关闭拥塞控制,全速发送。 其次是带宽消耗大,为了保证低延迟,KCP会发送更多的冗余数据。我测试过,同样的数据量,KCP的带宽消耗大概是TCP的1.2-1.5倍。
文森特·梵高《麦田群鸦》像素版 (本文基本逻辑:KCP 协议简介 → KCP 协议特性 → KCP 协议基本使用方式 → KCP 协议最佳实践) 1、协议简介 KCP 是一个开源的快速可靠协议,项目地址 3.1、发送端 在发送端应用层通过 kcp_send 发送数据,KCP 会把用户数据拆分 KCP 数据包,通过 kcp_output 再以 UDP 包的方式发送出去。 ikcpcb *kcp = ikcp_create(conv, user); 2)设置回调函数: // KCP 下层协议的输出函数,KCP 需要发送数据时会调用它。 // user 指针为 kcp 对象创建时传入的值,用于区别多个 KCP 对象。 ikcp_update(kcp, millisec); 3.2、接收端 在接收端,UDP 收到的包,不断通过 kcp_input 喂给 KCP,KCP 会对这部分数据(KCP 协议数据)进行解包,重新封装成应用层用户数据
原文作者:xtaci Introduction kcp-go is a Production-Grade Reliable-UDP library for golang. Millions of devices(from low-end MIPS routers to high-end servers) have deployed kcp-go powered program Specification +-----------------+ | SESSION | +-----------------+ | KCP(ARQ) | +------ ) Usage Client: full demo kcpconn, err := kcp.DialWithOptions("192.168.0.1:10000", nil, 10, 3) Server kcp.flush()operation, current time will be queried from system once.
KCP 协议支持,HTTP(S),SOCKS5 代理支持 KCP 协议传输数据, 降低延迟, 提升浏览体验. 自定义底层加密传输,http(s)\sps\socks 代理在 tcp 之上可以通过 tls 标准加密以及 kcp 协议加密 tcp 数据, 除此之外还支持在 tls 和 kcp 之后进行自定义加密, 也就是说自定义加密和 tls|kcp 是可以联合使用的, 内部采用 AES256 加密, 使用的时候只需要自己定义一个密码即可。 底层压缩高效传输,http(s)\sps\socks 代理在 tcp 之上可以通过自定义加密和 tls 标准加密以及 kcp 协议加密 tcp 数据, 在加密之后还可以对数据进行压缩, 也就是说压缩功能和自定义加密和 tls|kcp 是可以联合使用的。
简介 Kcptun是一个非常简单和快速的,基于KCP协议的UDP隧道,它可以将TCP流转换为KCP+UDP流。 而KCP是一个快速可靠协议,能以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果。 Kcptun是KCP协议的一个简单应用,可以用于任意TCP网络程序的传输承载,以提高网络流畅度,降低掉线情况。 /share/kcptun Kcptun 日志文件目录: /var/log/kcptun/ Kcptun 项目地址:https://github.com/xtaci/kcptun(可查询各参数设置) KCP 协议:https://github.com/skywind3000/kcp
那就是 SPI,可以看下各个库的声明: 图片 KGP 会通过 serviceLoader 加载所有的 CommandLineProcessor 和 ComponentRegistrar 参与 KCP 解决 Compose 版本问题 虽然 Compose 会涉及到 KGP 和 AGP,但 AGP 还是很贴心的,提供了 extension 来设置 Compose 与 KCP 的版本,具体可以看 AGP 的 TaskManager 类: image.png 从 TaskManager 来看,AGP 仅仅只是帮我们添加了 compose-compiler 和 KCP 依赖而已,这两个依赖版本号是可以通过 composeIOptions 来配置,如果没配置,则使用 AGP 内置写死的版本(很多人就是因为这个写死的版本导致 compose 配置不起来) 需要注意的是,KCP 的版本最好设置一下,不然,会强制 这里面唯一有关系的是 KCP 版本与 Compose-Compiler 版本,但 KCP 是被 KGP 引用进来的,所以,我们又可以简单的认为是 KGP 与 Compose 有关系,在上述配置的 composeOptions
这里,我主要介绍下外海直播常用的场景,以及基于KCP协议的国外直播服务器。 一、海外直播服务器的常用场景: 1)、主播和观众都在国内 适用于客户和观众都在国内,但需要把直播服务器架在海外的客户。 三、基于KCP协议的海外直播服务器 为了给朋友搭建一个效果较好的海外直播服务器,我特意学习了一遍KCP协议,帮忙写了APP端的SDK。最终效果还是很棒。 我介绍下我开发的流媒体服务的功能: 采用KCP协议作为传输层,具有超强的弱网传输能力和超低的延迟 支持NMS服务之间通过kmp协议进行中继转发 支持推流与播放 SDK版Andorid、IOS全系支持 空一点我拍个视频出来给大家看下效果 貌似只有KCP协议才能达到一个比较好的效果,别的都不太行。 附录:KCP协议 type segment struct { conv uint32 // 发送端与接收端通信时的匹配数字,发送端发送的数据包中此值与接收端的conv值匹配一致时,接收端才会接受此包
比较知名的tcp加速开源方案有:quic、enet、kcp、udt。 kcp的作者是国内优秀开发者,社区也发展良好,kcp的作者和社区开发者对enet、kcp、udt做了性能测试,详情可参见:https://github.com/skywind3000/kcp/wiki/ KCP-Benchmark, 从测试情况可以看到,kcp表现不错,其次是enet,表现最差的是udt。 不过,这里也提出一个问题,原始enet保留了tcp重传的指数避让特性,每次重传间隔还是乘以2,默认rto也较高,这可能是测试中enet表现不如kcp的主要原因,如果对enet代码稍作调整,结果又当如何? 这里,我们先排除传输性能,从其他方面对enet和kcp做一对比(满分5分): [图片] 我们对libenet略微做一些调整——默认rtt从500ms调整成50ms, 去除超时重传的指数避让策略。
win,linux,android,ios,osx等 支持游戏引擎: cocos2d-x, unity3d, ue4等 抽象出Transport概念,以相同的API,相同的用法操作TCP, UDP, KCP 完成对UDP Transport的重构,实现和TCP更加一致,和TCP一样屏蔽数据收发过程对系统信号(如EINTR等),同时KCP Transport的下层输出也复用UDP Transport 2. 重新整理性能测试用例,详见本地传输测试用例(支持TCP, UDP, KCP):https://github.com/yasio/yasio/tree/master/tests/speed 和测试结果(TCP
178.html [common] #frp服务器监听地址,如果是IPV6地址必须用中括号包围 bind_addr = 0.0.0.0 #frp服务器监听端口 bind_port = 7000 #kcp 的udp监听端口,如果不设那就不启用 #kcp_bind_port = 7000 #指定使用的协议,默认tcp,可选kcp #protocol = kcp #如果要使用vitual host,就必须设置
frp支持使用kcp作为底层的通讯协议,而kcp默认就是基于udp协议,废话不多说,赶紧试一试! 步骤(假设kcp的端口为7000): 在服务端原来的[common]配置中加入kcp_bind_port = 7000,使其支持udp 在客户端原来的[common]处加入protocol = kcp即可
<service> <id>kcp</id> <name>kcp</name> <description>这个服务用来将ss使用kcp协议加速</description> <executable>client_windows_amd64</executable> <arguments>-c kcp-config.json</arguments> <logmode
Lookaside Buffer 快表,可理解为页表缓冲或地址变换快速缓存 QJM Quorum Journal Manager HDFS NameNode的HA Gossip 去中心化的谣言协议 KCP KCP是为流速而设计,而TCP是为流量设计。 https://github.com/skywind3000/kcp window.
编译的时候可能出现的问题解决方法: #只拿一种常见的错误做例子,有时候可能会出现很多种这样的提示 lib/kcp/crypt.go:14:2: cannot find package "golang.org keyPath #域名代理https代理监听端口 httpsProxyPort #域名代理http代理监听端口 httpProxyPort #web api免验证IP地址 authip #客户端与服务端连接方式kcp npc) start|stop|restart|status 若有其他参数可加其他参数 (nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数 11、KCP 协议支持 KCP是一个快速可靠协议,能以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,在弱网环境下对性能能有一定的提升。 可在app.conf中修改bridgeType为kcp。 当服务端为kcp时,客户端连接时也需要加上参数-type=kcp。