TCP如何实现可靠传输
1. ACK机制
每发送一帧TCP报文,发送方都会收到接收方的ACK应答包,告知发送方接收方已经收到完整的报文。ACK信息存储在TCP报文中。
2. 序号机制
每一帧报文中都含有序号,TCP三次握手时发送同步包时会将服务端和客户端的序号进行同步。
3. 重发机制GBN
接收方会以累积响应的方式,来确认收到了那些序号的TCP报文,并向接收方发送对应序号的ACK应答包。如果发送方没有收到接收方返回来的ACK应答包,并且超过了超时时间RTO,发送方会选择序号最小的TCP报文开始重发,后面的报文也会重发,这是GBN(GO BACK N)重发机制。并且超时时间RTO会随着丢包次数成倍增加,RTO = RTO * 2。
4.重排机制
TCP采用的的时GBN模式发送数据,即一次性发送一组TCP序列,一组序列包含多个TCP报文,一组一组发送的TCP报文在网络上并不能按次序从发送方到达接收方,于是出现了重排,即到达接收方会自动按顺序对TCP报文进行排序。
5.窗口机制
发送方和接收方都会维护一个数据帧的序列,发送方的窗口大小由接收方所确定,数据从发送方到达接收方时处于第一个位置就是窗口,窗口可以控制发送速度,以免接收方的缓冲区不够大,同时控制流量避免拥塞。
发送方会根据应答报文中接收方的接收窗口大小来调整发送窗口(拥塞窗口)的大小,而接收窗口的大小并不是固定的,是根据动态算法调整的。通常接收窗口>=发送窗口。
6.流量机制
发送方和接收方的速率不一定相同,所以可能会导致接收方接收缓存区数据满了,会将发送来的数据扔弃。所以接收方每次收到数据之后会将自己剩余窗口大小通知给发送方,发送方会根据对方的窗口大小来判断是否发送数据。如果发送方得知对方窗口大小为0时,会开启一个定时器,当定时到达时会再次发送数据。
7.连接管理
参考https://blog.csdn.net/u010853261/article/details/82085738
8.拥塞控制
涉及到拥塞控制算法:慢启动和快恢复。纵坐标表示发送窗口,横坐标表示发送次数。
KCP如何利用UDP来实现可靠传输
UDP协议报文格式KCP以10%-20%的带宽浪费换取比TCP快30%-40%的传输速度。
1. RTO不翻倍
在前面说到接收方超过超时等待时间之后,会将超时等待时间RTO进行翻倍,当出现多次丢包会将等待时间延长非常快,降低传输速率,所以KCP快速模式下将第二次RTO乘1.5,即RTO = RTO*1.5。
2. 选择性重传
在TCP下,当一组数据中的某个序号丢包之后,接收方会让发送方会将该序号以及后面序号的TCP报文全部重新发送,即全部重传。而KCP则会选择性重传,只重传丢失的TCP报文。
3. 快速重传
当某个序号包n在接收时被跳过了两次,即收到了第n+1、第n+2个包,但第n个包未收到,就会马上通知发送方马上重传第n个包,改善了重传速度。
4. 非延迟ACK
在TCP中使用的时延迟ACK,即发送一序列包后,再返回ACK,增大了频带利用率,但降低了速度。所以在KCP中可以选择是否延迟发送ACK应答包。
5. UNA + ACK
ARQ模式下有两种响应方式1.UNA:此前所有的包都已经收到;2.ACK该编号的包已经收到。光用UNA会导致重传,光用ACK则丢包成本高,TCP是二选一。而KCP使用的是,单独的包使用ACK外,其余的用UNA。
6. 非退让流控制
KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。
KCP源码框架
源码git clone
git clone https://github.com/skywind3000/kcp