TCP的拥塞控制——慢启动/拥塞避免/快重传/快恢复/NewReno/SACK的拥控/积极队列管理和ECN

tcp的拥塞控制

1. 拥塞

即对资源的需求超过了可用的资源。若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随负荷的增大而下降。

   拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。(拥塞窗口 cwnd)

    流量控制:指点对点通信量的控制,是端到端正的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。(流量窗口 rwnd)

    发送窗口=min(cwnd,rwnd)

    拥塞控制代价:需要获得网络内部流量分布的信息。在实施拥塞控制之前,还需要在结点之间交换信息和各种命令,以便选择控制的策略和实施控制。这样就产生了额外的开销。拥塞控制还需要将一些资源分配给各个用户单独使用,使得网络资源不能更好地实现共享。

2. 几种拥塞控制方法

a、慢启动( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )和快恢复( fast recovery )。

b、为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量(如何设置ssthresh)。慢开始门限ssthresh的用法如下:

    当 cwnd < ssthresh 时,使用上述的慢开始算法。

    当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

    当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。

    i、慢启动:所发送报文段数量从1开始指数式增长,每次报文段被确认,cwnd增加1个MSS(每当初始阶段或重传超时,进入慢启动阶段);

    ii、拥塞避免:当超过慢启动门限(ssthresh)时,则改为当所有报文被确认后,cwnd才增加1个MSS;

c、TCP确认网络进入拥塞依据:重传报文没有被确认且RTO超时,重传且判定出现网络拥塞。(每个报文对应一个RTO(Tetransmission Timeout))

3. 当出现网络拥塞时,tcp的反应

正常反应:i、ssthresh门限降至一半;ii、cwnd设置为1;iii、重新进入慢启动阶段;

快速重传的条件是收到3个相同ACK。因为tcp收到乱序到达包时就会立即发送ACK,3个相同ACK判定数据包的丢失。快速重传的操作:i、把ssthresh设置为cwnd的一半;ii、cwnd再设置为ssthresh+3;iii、重新进入拥塞避免阶段。

快速恢复(与快速重传结合使用)的条件同上,其步骤:i、将最初ssthresh的值设为cwnd的一半,cwnd设为ssthresh(减半后的值)+3;ii、再收到重复ACK时,cwnd增加1;iii、当收到新的ACK时,把cwnd恢复到最初ssthresh值。因为新ACK确认了新报文,说明重复的ACK数据都已收到,判定恢复过程结束,重新进入拥塞避免状态。

4.对标准算法的改进——NewReno和SACK的TCP拥塞控制

i、NewReno(快速恢复算法又叫Reno算法,NewReno是对Reno的改进)

快速恢复带来的一个问题,当一个传输窗口出现多个数据包丢失时,一旦其中一个包重传成功,发送方就会接收到一个好的ACK(好的ACK称为局部ACK),于是快速恢复阶段中cwnd窗口的暂时膨胀就会停止,而事实上丢失的其他数据包可能并未完成重传。

上述现象带来的影响是,一旦拥塞窗口停止膨胀,并将其减小至特定值,则可能导致在重传计时器超时之前,传输通道一直处于空闲状态。(解释这种情况:tcp需要通过三个(或重复阈值)重复ACK包作为信号才能触发快速重传。假设网络中没有足够的数据包在传输,那么就不可能因丢包而触发快速重传,最终导致重传计时器超时,引发慢启动操作,从而严重影响网络吞吐性能。)

上述问题的解决方法:对快速恢复做出改进,记录上一个数据传输窗口的最高序列号。仅当接收到序列号不小于恢复点的ACK,才停止快速恢复阶段。

ii、SACK的TCP拥塞控制

tcp引入SACK与选择性重复之后,发送方能够更好地确定发送哪个数据段来填补接收方的空缺。

采用SACK机制后,发送方可以知晓多个数据段的丢失情况。因为这些数据都在有效窗口内,理论上可以即时重传。如果采用即时重传,会在较短时间内向网络中注入大量数据,削弱拥塞控制效果。

上述采用SACK机制即时重传问题的解决方法:传统tcp是将拥塞管理和选择重传机制结合,而SACK TCP强调拥塞管理和选择的分离。实现分离的方法是,除了维护窗口,tcp还负责记录注入网络的数据量,其被称为管道(pipe)变量,这是对在外数据的估计值。管道变量以字节为单位,记录传输和重传情况。只要不等式cwnd-pipe>=SMSS,则在任何时候SACK TCP均可发送数据。其中cwnd仍被用来限定可传输至网络中的数据量,但除了窗口本身,网络中数据量的估计值也被记录了。

5.积极队列管理和ECN(explicit congestion notification)

tcp能够推断出拥塞产生的唯一方法就是发生丢包现象。通常路由器(最有可能产生拥塞)不会通知连接两端的方机,tcp即将产生拥塞。

应用FIFO和尾部丢弃(此两者是路由器出现拥塞时一般所采取的措施)以外的调度算法和缓存管理策略被认为是积极的,路由器用来管理队列的相应方法称为积极队列管理(AQM)机制。

ECN机制主要在IP层进行操作,也可以应用于tcp协议之外的其他传输层协议。其大概的工作机理:接收端的路由器通过对IP报文的CE标识置位,告知接收方出现拥塞,接收方通过ACK报文(将ECN回显位字段置位),告知发方,调整发送速率(在下次发送报文中会将CWR字段置位)。

6.与tcp拥塞控制相关的攻击

i、ACK分割攻击:将原有的确认字节范围拆分成多个ACK信号并返回给发送端。由于tcp拥塞是基于ACK数据包的到达进行操作 的(而不是依据ACK信号中的ACK字段),于是导致发送端的cwnd会比正常情况更快速地增长。

解决方法:可通过计算每个ack确认的数据量(而不是一个数据包的到达)来判断是否为真的ACK。

ii、重复ACK欺骗攻击:可以使发送端在快速恢复阶段增长它的拥塞窗口。

解决方法:利用时间戳选项,或者限制在恢复阶段的在外数据值。

iii、乐观响应攻击:对那些还没有到达的报文段产生ACK。

解决方法:可定义一个可累加的随机数,使得发送数据段大小可随时间动态改变,以此来更好地匹配数据段和它对应的ACK。当发现得到的ACK和数据段不匹配时,发送端就可以采取相应的行动。

参考博文:https://blog.csdn.net/yusiguyuan/article/details/22847787

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值