可靠性传输
主要是以下机制实现可靠性传输
1:ACK机制
2:重传机制
3:序号机制
4:重排机制
5:窗口机制
ACK机制
停等协议:
就是客户端每发一个包就等待服务端回一个ack
退回N帧协议
客户端比如发送8个包,但是服务端除了第二个包没有收到,其余包都收到了,此时就会重新从第二个包开始重传,3,4,5,6,7,8也会重新开始发送
选择重传
客户端比如发送8个包,但是服务端除了第二个包没有收到,其余包都收到了,此时就会重新从第二个包开始重传,3,4,5,6,7,8不会重新开始发送
重传机制
RTT意思:就是发送方发送包的时间戳与接受到回应的ack之间的时间
利用RTT来现实重传,重传的条件有两个
1:在规定的RTT时间内没有收到ACK
2:包是缺失的
流量控制
恢复数据发送时机:
是客户端每隔一段时间去发送一个探测包,探测服务端的接受缓冲区是否还有空闲。
拥塞控制
采用的是慢开始与快恢复的策略,当开始时,客户端就会发少量的包,从指数型增长,到达一定条件后转为线性发包;当客户端连续接受到三个ACK重复之后就说明已经开始丢包了,此时转入拥塞算法,降低发包的数量,从线性增长发包。
KCP协议设计
发送数据
将数据存储到send_queue队列当中去,然后放入到send_buf,此时如果对这个数据已经进行了ack应答了,将该数据从send_buf中删除;send_queue取出来放到buf中就释放了
接受数据
服务端接受数据时先放入到buf中,进行排好序,将排好序的包放入到队列当中,再有用户态recv去取数据;没有排好序的包继续留在buf中,比如13之前没有12,就继续等待12的到来,来了之后就插入到13之前然后在插入到队列当中。