博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP超时重传、滑动窗口、拥塞控制、快重传和快恢复
阅读量:4926 次
发布时间:2019-06-11

本文共 1699 字,大约阅读时间需要 5 分钟。

TCP超时重传

  原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。

  影响超时重传机制协议效率的一个关键参数是重传超时时间RTO,Retransmission TimeOut)。RTO的值被设置过大过小都会对协议造成不利影响。
  (1)RTO设长了,重发就慢,没有效率,性能差。
  (2)RTO设短了,重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
  连接往返时间(RTT,Round Trip Time),指发送端从发送TCP包开始到接收它的立即响应所消耗的时间。

TCP滑动窗口

作用:(1)提供TCP的可靠性;(2)提供TCP的流控特性

TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。

发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
接收端可以根据自己的状况通告窗口大小,从而控制发送端的接收,进行流量控制。

TCP拥塞控制

  拥塞控制是一个全局性的过程; 流量控制是点对点通信量的控制

  TCP拥塞控制4个核心算法:慢开始(slow start)、拥塞避免(Congestion Avoidance)、快速重传(fast retransmit)、快速回复(fast recovery)
  拥塞窗口(cwnd,congestion window),其大小取决于网络的拥塞程度,并且动态地在变化。
  
  慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。

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

当cwnd < ssthresh时,使用慢开始算法。
当cwnd > ssthresh时,改用拥塞避免算法。
当cwnd = ssthresh时,慢开始与拥塞避免算法任意。

拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送发的拥塞窗口cwnd加1,而不是加倍。

无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。如下图:

拥塞控制的具体过程如下:
(1)TCP连接初始化,将拥塞窗口设置为1
(2)执行慢开始算法,cwnd按指数规律增长,直到cwnd=ssthresh时,开始执行拥塞避免算法,cwnd按线性规律增长
(3)当网络发生拥塞,把ssthresh值更新为拥塞前ssthresh值的一半,cwnd重新设置为1,按照步骤(2)执行

快重传和快恢复

  快速重传(Fast retransmit)要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),而不要等到自己发送数据时捎带确认。

  快重传算法规定,发送方只要一连收到3个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计数器时间到期。
  
  
  
  快速恢复(Fast Recovery)
  (1)当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。
(2)由于发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

发送方窗口的上限值 = Min [ rwnd, cwnd ]当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值。

转载于:https://www.cnblogs.com/yangjiannr/p/7391342.html

你可能感兴趣的文章
Python Ethical Hacking - MAC Address & How to Change(3)
查看>>
生成验证码
查看>>
深入理解计算机系统 第2章 信息的表示和处理
查看>>
JS中数据结构之链表
查看>>
Tomcat 配置文件 (server.xml)详解--转载
查看>>
Golang理解-字符串拼接的几种方式
查看>>
Linux系统-RPM库顺坏
查看>>
Golang理解-错误处理策略
查看>>
运维职责
查看>>
Golang理解-集合
查看>>
element中使用表单验证rules 需要注意
查看>>
AnyChatSDK 实现视频通话
查看>>
Gerrit error when Change-Id in commit messages are missing
查看>>
【面试题】实现一个队列数据结构,并使用这个队列实现一个生产者消费者模式...
查看>>
第二阶段团队冲刺第二天站立会议
查看>>
隐式激活Activity
查看>>
DAG
查看>>
使用MVVM框架时,如何处理在页面动态渲染完之后需要发生的事件呢?
查看>>
StringBuilder与StringBuffer的区别
查看>>
String、StringBuffer、StringBuilder
查看>>