概述
tcp协议-拥塞控制
前言
目的:为了避免发送方无节制地发送数据,从而造成网络拥堵。
流量控制和拥塞控制的区别:
流量控制是作用于接收者的,控制发送者的发送速度从而使接收者来得及接收,防止分组丢失。
拥塞控制是作用于网络的,防止过多的数据注入到网络中,避免网络负载过大。
基础
拥塞现象:
当网络负载较小时,吞吐量基本上随着负载的增长而增长,呈线性相关,响应时间增长缓慢。当负载达到网络容量时,吞吐量呈现出缓慢增长,而响应时间急剧增加,称为Knee。假如负载继续增加,路由器开始丢包,当负载超过一定量时,吞吐量开始急剧下降,称为Cliff。
原因:
网络能够提供的资源不足以满足用户的需求,包括缓存空间、链路带宽容量和中间节点的处理能力…
解决方向:
拥塞虽然是由于网络资源的稀缺引起的,但单纯增加资源并不能避免拥塞的发生。拥塞本身是一个动态问题,它不可能只靠静态的方案来解决,而需要协议能够在网络出现拥塞时保护网络的正常运行。
拥塞控制机制
拥塞控制机制实际上包含拥塞避免和拥塞控制两种策略。前者的目的是使网络运行在Knee四周,避免拥塞的发生;而后者则是使得网络运行在Cliff的左侧区域。前者是一种“预防”措施,维持网络的高吞吐量、低延迟状态,避免进入拥塞;后者是一种“恢复”措施,使网络从拥塞中恢复过来,进入正常的运行状态。
拥塞控制算法
慢开始、拥塞避免、快重传、快恢复。整体过程大约如下:
- 在 TCP 连接建立完毕后,会先使用慢开始算法,指数级逐渐增大拥塞窗口(+1 +2 +4 +8…)。
- 当拥塞窗口达到慢启动门限 ssthresh时,会使用“拥塞避免算法”,线性逐渐增大拥塞窗口。(+1 +1 +1…)
- 当发生超时重传或快速重传时
- 发生超时重传,将 ssthresh 设为 cwnd/2,将 cwnd 设为初始值,然后会再次使用慢开始算法。
- 发生快重传,使用快恢复算法,然后进入拥塞避免阶段。
慢开始
TCP 在刚建立连接完成后,首先是有个慢开始的过程,其体现就是一点一点的提高发送数据包的数量,当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。慢开始算法过程中数据大传输呈指数性增长。
指数性增长就体现在开始增长速率慢,所以叫慢开始。但指数性增长后期增长速率极快,为防止增长过快引起,有一个状态变量慢启动门限 ssthresh (slow start threshold)控制其何时停止慢开始算法。
当 cwnd < ssthresh 时,使用慢启“开始算法”。
当 cwnd >= ssthresh 时,使用“拥塞避免算法”。
拥塞避免
规则:每当收到一个 ACK 时,cwnd 增加 1。
拥塞避免算法就是将原本慢开始算法的指数增长变成了线性增长。就这么一直增长着后,防止网络突然进入拥塞。当触发了重传机制,也就进入了“拥塞发生算法”。
拥塞发生
当触发 TCP 重传机制时,就视为拥塞发生。TCP 的重传包括“超时重传”和“快速重传”,两种重传表示两种不同的网络情况,对应的也有两种拥塞控制手段。
超时重传
当发送方未在规定时间内接收到 ACK 确认包时,就会超时重传。每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。
当发生“超时重传”,就会使用拥塞发生算法,重新进入慢启动阶段。
这个时候,ssthresh 和 cwnd 的值会发生变化:
ssthresh 设为 cwnd/2;
cwnd 重置为初始值;
快速重传
快速重传不以时间为驱动,而是以数据驱动重传。如果接收方收到一个失序的报文段,就即回送一个 ACK 给发送方。快速重传就是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
当发生“快速重传”,TCP 认为这种情况不严重,就会启动快恢复算法,ssthresh 和 cwnd 也会发生变化
cwnd = cwnd/2 ;
ssthresh = cwnd;
进入“快恢复算法”;
快恢复
拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是已经确认收到了 3 个重复的数据包);
重传丢失的数据包;
如果再收到重复的 ACK,那么 cwnd 增加 1(1 代表每个收到的重复的 ACK 包,都已经离开了网络。)
如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入“拥塞避免”状态。
补充
快恢复是拥塞发生后慢启动的优化,其首要目的仍然是降低 cwnd 来减缓拥塞,所以必然会出现 cwnd 从大到小的改变。
快恢复算法会重传丢失的数据包,但如果此时再次发生“快重传”,就不会再使用“快恢复算法”,而会直接进入“慢开始”阶段。
最后
以上就是生动外套为你收集整理的tcp协议-拥塞控制tcp协议-拥塞控制的全部内容,希望文章能够帮你解决tcp协议-拥塞控制tcp协议-拥塞控制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复