一、简介
KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。
二、相关概念
MTU:最大传输单元。即每次发送的最大数据
RTO:Retransmission TimeOut,重传超时时间。
cwnd:congestion window,拥塞窗口,表示发送方可发送多少个KCP数据包。与接收方窗口有关,与网络状况(拥塞控制)有关,与发送窗口大小有关。
rwnd:receiver window,接收方窗口大小,表示接收方还可接收多少个KCP数据包。
snd_nxt:下一个即将发送的kcp数据包序列号
snd_una:下一个待确认的序列号
RTT(Round-Trip Time): 往返时延。在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。
MSS:(Maximum Segment Size,最大报文长度。
拥塞窗口:指某一源端数据流在一个RTT内可以最多发送的数据包数, 拥塞窗口(cwnd)会随着网络状态的变化而变化。
接收窗口:rcv_nxt(待接收消息序号),rcv_nxt + rcv_wnd(接收窗口大小)
快速重传机制:假如开启KCP的快速重传机制,并且设置了当重复的ACK个数大于resend时候,直接进行重传。 当发送端发送了1,2,3,4,5五个包,然后收到远端的ACK:1,3,4,5。当收到ACK3时,KCP知道2被跳过1次,当收到ACK4的时候,KCP知道2被跳过2次,当次数大于等于设置的resend的值的时候,不用等到超时,可直接重传2号包。这就是KCP的快速重传机制。
拥塞窗口:指某一源端数据流在一个RTT内可以最多发送的数据包数, 拥塞窗口(cwnd)会随着网络状态的变化而变化。
慢启动机制:慢启动也就是控制拥塞窗口从0开始增长,在每收到一个报文段确认后,把拥塞窗口加1。是为了防止拥塞窗口过大引起网络阻塞,还需要设置一个慢机制的的门限(ssthresh即拥塞窗口的阈值)。当拥塞窗口增长到阈值以后,就减慢增长速度,缓慢增长。
三、kcp源码工作流程图
1.首先通过ikcp_create创建一个kcp传输对象,创建时需要传入会话ID和用户ID,conv为一个表示会话编号的整数,用来标记本次传输会话。用户ID,用户ID作用不大,估计就是标记一下KCP对象是由哪个用户创建,可以传入用户对象,方便内部使用,没有用到可以传0.
2.设置回调函数,kcp→output,kcp数据封装好以后,需要发送到网络上时会调用该接口,如果使用的是UDP传输,就是调用系统接口sendto