----------------------------------------
-----------------------------------------
问题来了:KCP接收端如何拼包,以确保可靠性传输?
转换问题:KCP源码中几个关键的发送接收队列与缓冲的作用是什么?
KCP Send ,对用户的数据根据mss值进行分片,然后将分片后的数据放入snd_queue。
KCP Flush,每次被调用的时候遍历出队snd_queue(条件为snd_nxt < snd_una + cwnd_)。
对每个seg的sn与una编号,cmd = IKCP_CMD_PUSH,进行初始化后,放入snd_buf。
之后立即对current_, segment.resendts进行比较,决定每个元素是否重传发送,
KCP Input,如果cmd为PUSH,则记录每个包的sn进acklist队列。
然后新建一个KcpSegment,将数据考入其中,再放入rcv_buf
紧接着,循环遍历rcv_buf,看队头是不是我们恰恰想要的rcv_nxt,如果是则加入rcv_queue中。
KCP PeekSize,rcv_queue队头元素的frg记录着发送方此次分包的数量,若rcv_queue次数的队列元素个数等于它,则说明所有的分包都已收到。
KCP Recv,如若PeekSize返回大于0,则可以此函数取一个完整的UDP数据包,此函数内部会对rcv_queue内所有元素的数据进行解包merge,