改则网站建设,wordpress quizzin,创建网站的代码,wordpress最新视频教程什么是KCPKCP是一种网络传输协议(A Fast and Reliable ARQ Protocol)#xff0c;可以视它为TCP的代替品#xff0c;但是它运行于用户空间#xff0c;它不管底层的发送与接收#xff0c;只是个纯算法实现可靠传输#xff0c;它的特点是牺牲带宽来降低延迟。因为TCP协议的大…什么是KCPKCP是一种网络传输协议(A Fast and Reliable ARQ Protocol)可以视它为TCP的代替品但是它运行于用户空间它不管底层的发送与接收只是个纯算法实现可靠传输它的特点是牺牲带宽来降低延迟。因为TCP协议的大公无私经常牺牲自己速度来减少网络拥塞它是从大局上考虑的。而KCP是自私的它只顾自己的传输效率从不管整个网络的拥塞情况。举个例子TCP检测到丢包的时候首先想到的是网络拥塞了要放慢自己的速度别让网络更糟而KCP想到的赶紧重传别耽误事。TCP的特点是可靠传输(累积确认、超时重传、选择确认)、流量控制(滑动窗口)、拥塞控制(慢开始、拥塞避免、快重传、快恢复)、面向连接。KCP对这些参数基本都可配也没用建立/关闭连接的过程。其实KCP并不神秘因为TCP的高度自治(很多东西都不可配)满足不了如今各种速度需求。而KCP就是基于UDP协议再将一些TCP经典的机制移植过来变成参数可配。在这种怎么使用KCP只有两个文件分别是ikcp.c和ikcp.h代码行数1300左右。使用KCP和使用TCP有些不同所以上手之前需要先了解下KCP如何使用需要时间成本。第一步就是创建一个kcp实例相当于一个句柄。ikcpcb* ikcp_create(IUINT32 conv, void *user)第二步设置发送数据的接口底层用哪种socket都没问题只要能把数据发送出去建议使用UDP比较简单。int output(const char *buf, int len, ikcpcb *kcp, void *user)第三步更新KCP状态。KCP运行于用户空间所以需要手动去更新每个实例的状态其实主要就是检测哪些数据包该重传了。void ikcp_update(ikcpcb *kcp, IUINT32 current)第四步发送数据。调用ikcp_send之后KCP最后会使用上面设置的output函数来将发送数据(KCP自己并不关心如何发送数据)。int ikcp_send(ikcpcb *kcp, const char *buffer, int len)第五步预接收数据。先手动预接收数据然后再调用ikcp_input将裸数据交给KCP这些数据有可能是KCP控制报文并不是我们要的数据。int ikcp_input(ikcpcb *kcp, const char *data, long size)第六步接收数据。此时收到的数据才是真正的数据重组操作在调用ikcp_recv之前就完成了。int ikcp_recv(ikcpcb *kcp, char *buffer, int len)总体上还是容易理解的以前我们是直接使用各种socket和对端通信各种功能由自己控制。现在是在socket之上使用了一个中间件KCP帮忙实现快速可靠传输功能。注意一下KCP有模式的区分不同模式下的速度表现不一样建议把参数配好之后再使用否则使用的都是默认的参数。快在哪里没用使用任何系统调用接口无需建立/关闭连接(就KCP本身来说)很多影响速度的参数都可配使用场景丢包率高的网络环境下KCP的优点才会显示出来。如果不丢包那么TCP和KCP的效率不会差别很大可能就是少了连接建立/关闭而已。一般来讲在公网上传输的都可以使用特别是对实时性要求较高的程序如LOL。有何缺点学习成本据说有些运营商对UDP有限制?