tcp的效率性和公平性

实际上tcp并没有什么效率性和公平性,虽然从协议的实现来看,任何连接一直在努力做到高效率和高公平。任何稳定的系统都要有一个收敛中心,tcp的速率却没有收敛性,即
使在稳定传输期间,其速率-时间曲线也是锯齿形的,不管锯齿再细,它终究不是直线,甚至锯齿也不平滑。这是为何呢?其根本原因在于tcp是端到端的协议,它对中间经过的
ip链路一无所知,可是ip链路的路由器们却对数据包有生死大权。并且,很多协议栈的实现中并没有很好的前向或者后向的拥塞报告,比如源端抑制报告等,其实只要实现前向
报告即可,因为对端会因此收缩其接收窗口,即“通告窗口”,这样就间接的限制了源端的速率,如果是后向的报告,比如源抑制的icmp报文,那么就是直接限制了发送速率。
只要接收端有足够的接收空间,发送端就会尽可能的满足接收端的需要。
     虽然后来的tcp实现了慢启动和拥塞避免以及再后来的快速重传/恢复,但是数据发送速率仍然是“试探”性地增加,毕竟没有谁会告诉tcp网络容量上限,tcp毕竟是位于
ip的上层的,只能无条件接受ip的尽力而为无流控服务。试探性的,以不同的增长曲线增加发送速率看起来使用了一些策略,比如是指数增加还是线性增加,但是无论哪种方
式,无节制增加速率的结果就是丢包的发生,为了达到最佳状态,每个连接确实是在无节制地增加速率的,当丢包发生后,速率陡然下降,然后再重复之前的过程,于是速率-
时间曲线就呈现了锯齿状。为何要陡然下降速率呢?这里面有公平性的原因,乘的特性是加特性的叠加,自己增长速率只让自己受惠,因此很慢,当自己降低速率时是让大家
受惠,因此需要让出更多的带宽给别的连接,这就是公平性,平均下来人人为我我为人人,大家受惠差不多的。虽然已经比较公平了,但是这仅仅是理想情况,并且这样的效
率是很低的,试想,达到最大速率只是一瞬间的事,只要收到ack,速率继续增加就丢包了,然后就降到了很低的速率,继续为了一瞬间的光荣付出十年的代价,真的是普遍贫
穷,不患寡而患不均的公平。
     tcp的拥塞窗口和超时间隔受到rtt的影响,rtt却和通信两端距离成正比,rtt越大,说明越不易达,可是tcp并不总是把这种不易达归为距离远。tcp在收到一个ack(或者
说一个rtt)后会增加拥塞窗口,所以越不易达的链接拥塞窗口增加的越慢,其发送速率进而就慢,因此本来距离越远的连接速率显得越慢,针对这个,其实还有不同的声音,拥
塞窗口增加速率慢仅仅会导致速率增加到最大值变得慢,平均速度并不会有多少变化,不要把迅速到达峰值速率当成什么好事,因为接着就要降到很低了,距离远的连接速率
因此也不会比距离近的更慢,还有别的情况,比如两个连接距离一样,由于限速导致连接A的rtt大于连接B,那么连接A的拥塞窗口就会缓慢增长,就好像它知道自己被限制了
一样,不过无论怎样,只要tcp有误判,那就会导致不公,显然,距离远和被距离近被限速都会导致rtt的增加,然而结果即使相同,也会显得不公平,rtt越小的,速率越快。
     实际上,越不易达的速率就越慢,这不知道是公平还是不公平,其公平性在于不易达说明有障碍,加快速率只会增加障碍,不公平性在于,有些不易达并不是障碍引发的
,而是客观上的,比如一百个100米的千兆网络之间的传输可能比不上直连的10兆网络,比如rtt是距离远导致的,并不是遇到了诸如拥塞,限速之类的问题。另外,经过的ip
层设备越多,这种不公平的因素越容易被引入而且越多的被引入。比如说,经过路由器的连接就可能受到三层设备的三层策略的“待遇”,ie.限速,而直连的一个连接就是端
到端的四层连接,速率完全取决于接收端的窗口,这就是说,经过路由器的tcp连接实际上是打了折扣的tcp连接,可是网络分层模型导致通往外网tcp连接都是要经过路由器的。
     因此,基于当今tcp拥塞控制的架构,tcp的改进空间在于两点,第一就是效率,第二就是公平性,对于效率而言,那就是尽量减少超时丢包,避免进入慢启动阶段,尽量
平滑化速率-时间曲线,尽量用快速重传来处理丢包,鉴于此,很多路由器作了配合,那就是实现了RED--随机提前检测,路由器肯定知道自己快要满载了,于是需要想一个办法
提醒一下各个链接降一下速率,很多系统都没有源段抑制,因此必然需要一种间接的方式,那就是随机丢弃一些包(也是为了公平)而放过其它的包,这样tcp接收端肯定会收到
不按序的报文,于是会回复冗余ack,发送端随即进入快速重传/恢复阶段,细化了锯齿,不像超时重传那样,速率一下子下降到了很低很低,BIC方式的流控可以参考一下,细
化了窗口增长的方式,本质上采用的是二分搜索法逐步逼近稳定速率值,然后在这个稳定值附近做小范围的锯齿震荡而不是像传统拥塞控制那样总是采用拥塞避免时的一个固
定阀值来控制乘性减。对于公平性,那就是提供rtt类型,提高采样准确率,另外加入加权参数来调整发送端拥塞窗口。
     针对未来的tcp拥塞控制架构,其本身就是一个完美的数学函数,那就是一个值是一堆自变量的和,其有最大值,并且在当函数到达最大值时,所有的自变量相等,并且
曲线收敛到最大值的点,这就是完全的高效率和完全的公平。



你可能感兴趣的:(tcp,网络,路由器)