udp数据包传输快,但是相对于tcp来说不可靠;而tcp可靠,但是传输速度相比udp没有那么快。所以有些需求需要中和它们的优缺点来中和一下,就出现了一些中间件,比较有名的KCP和QUIC。
1 kcp介绍
KCP是一个快速可靠协议,能以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以callback的方式提供给KCP。连时钟都需要外部传递进来,内部不会有任何一次系统调用。本文传输协议之考虑UDP的情况。
TCP协议的可靠与无私让使用TCP开发更为简单,同时他的这种设计也导致慢的特点。UDP协议简单,所以它更快。但是,UDP毕竟不可靠的,应用层收到的数据可能是缺失,乱序的。KCP协议就是再保留UDP快的基础上,提供可靠的传输,应用层使用更加简单。
其它差别,TCP是以字节流的形式,UDP以数据包的形式很多人以为,udp是不可靠的,所以sendto(1000),接受端recvfrom(1000),可能会收到900。这个是错误的。所谓数据报文,就是说UDP是有界的,sendto(300),sendto(500);接受到,recvfrom(1000),recvfrom(1000),那么可能会收到300,500或者其中一个或者都没有收到。
UDP应用层发送的数据,再接受缓存足够的情况下,要么收到全的,要么收不到。
快速重传会统计之前被跳过包的次数,然后进行重传
TCP慢启动,使得带宽浪费
2 kcp使用方式
1. 创建 KCP 对象:
// 初始化 kcp 对象,conv 为一个表示会话编号的整数,和 tcp 的 conv 一样,通信双
// 方需保证 conv 相同,相互的数据包才能够被认可,user 是一个给回调函数的指针
ikcpcb *kcp = ikcp_create(conv, user);
2. 设置传输回调函数(如 UDP 的 send 函数):
// KCP 的下层协议输出函数,KCP 需要发送数据时会调用它
// buf/len 表示缓存和长度
// user 指针为 kcp 对象创建时传入的值,用于区别多个 KCP 对象
int udp_output(const char