从KCP中窥探TCP存在的问题

KCP是一种基于上层协议的(UDP协议)快速可靠协议,在KCP官网中提到跟TCP相比的优势就是降低延时,能够平均降低30%~40%的延时时间且最大延迟降低三倍的传输效果,不过所付出的代价是浪费比TCP10%~20%的带宽代价。

从个人角度来看,可以从三个方面去分析KCP与TCP的所导致的性能问题:

1、计算包超时的策略

2、包重传的策略

3、退流控制策略


计算包超时策略:

TCP计算超时的策略是每超时一次新的RTO=RTO*2,这种策略对于在网络不稳定的情况下影响是很致命的,而KCP在快速模式下是RTO=RTO*1.5,这样在网络不稳的情况下会传输速度就会很差。还有一点很重要的是TCP默认是开启延时ACK的,这样的话RTO就会比真实的大,然而再加上RTO=RTO*2的情况下网络传输速度就会更慢。


包重传策略:

包重传策略方面有两个主要的区别,分别来自于重传判断以及包重传逻辑策略:

(1) 重传判断:

在判断重传方面,KCP在处理包重传的策略是跟TCP(TCP快重传机制)的策略是基本一致的,差别在于TCP需要接收到丢包的后三个包就认为是丢包了重传而KCP只需两次。

(2) 包重传逻辑:

在网络中传输1,2,3,4,5包时,如果包2丢失了且客户端已确认需重传,那么TCP跟KCP的对待方式会不一样,TCP会认为如果包2丢了有可能包3,4,5也有可能丢失,因此TCP会把2,3,4,5包也一并进行重发。而KCP的做法是认为只是由于网络上一刹那的问题导致包2丢了,后续的包还是正常发送过去的(KCP呈现的一种乐观的心态^_^),因此KCP只会传认为丢失的那一个包。

*注意:TCP有SACK选项用来减少这种重复报重传的算法,具体为当服务端确定有丢包了,服务端就会在TCP包头的SACK选项中添加确实的包序号的范围,从而让客户端只传输丢失的包。


退流控制策略:

正常情况下KCP与TCP有着一致的退流避让策略,基本策略为:发送缓存窗口、接收缓存窗口、丢包退让、慢启动,但是KCP可以通过配置去跳过后面两个策略(丢包退让、慢启动),因此KCP可以在网络拥堵的情况下也能进行快速的数据发送(抢网络)

*关于TCP丢包退让以及慢启动可以参看后续的《关于TCP拥塞处理的思考》文章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值