拥塞窗口

之前学习了滑动窗口,滑动窗口用来根据接收方的能接收数据的缓存大小来对发送方进行流量控制,从而减少网路负担,保证网络的正常运行。但是,在发送端和接收端之间,可能会存在很多中间设备,包括路由器、网关等,这些设备也具有一定的承载数据的上限,也会引起网络拥塞,造成数据的丢失,造成接收端接受数据的失序。为了解决这个问题,引入了拥塞窗口,即在发送端设置一个窗口结构,根据网络的拥塞情况,动态调整该窗口大小,发送端只能发送大小小于滑动窗口和拥塞窗口的数据,在发送端设置的这个窗口就是拥塞窗口。

一、超时重传

我们知道TCP提供的是面向连接的可靠数据传输。面向连接就是在交换数据前,在收发两端要建立连接。可靠主要体现在对于网络中出现的丢包、包乱序等情况,TCP发送端会根据接收端返回的情况,选择重传这些数据。在TCP中,主要通过两种方式来检测丢包或乱序的出现,第一种是发送端设置超时时间,第二种是接收端发送重复ACK包。

设置超时时间是指,TCP发送一个报文段时,设置该报文段的超时时间,如果接收端接收到报文段,会给发送端发送一个ACK确认报文,如果发送端在超时时间前未收到对应的ACK报文,发送端则会选择重发丢失的报文,直到发送端收到非重传数据为止。设置超时时间的核心问题是如何确定RTO(Retransmission Time Out, 重传超时时间),有很多关于这个问题的研究和成果。RTO是动态的,会根据网路拥塞情况动态变化。最核心的是,基本上所有的方法都是通过连接的RTT(Round Trip Time, 往返时间)确定RTO。早期的方法是通过每次得到的RTT样本值重新计算新的TRTO值。公式如下。其中SRTT为每次的迭代更新的RTT,RTT为样本RTT测量值。ubound、lbound、β为常量。

早期的经典方法没有考虑到RTT的变化情况,RTT变化情况更能反映当前的拥塞情况,所以Jacobson提出了标准方法。具体公式这里不想讨论。同时对于我们如何获取样本RTT,也有一些值得探讨的问题。我们一般是通过在发送的报文中设置某些标识,在接收端收到并返回ACK时也会带上这些标识,我们就可测量这段时间为RTT。但是如果在测量RTT时发生超时重传,如果第一个包发生超时,就会重传,接着收到了一个ACK确认报文,但这个确认是对那一次发送的确认呢?可能第一次发送的报文,由于网络拥堵,接收端只是延时收到了,但触发了超时时间,所以这个ACK有可能就是对第一个报文的确认,这就产生了二义性。也就产生了Karn算法。Karn算法包含两个部分,一是发生超时重传时,接受到重传数据的确认信息时不能更新RTT估计值,这样就忽略了二义性的问题。二是采用一个退避指数,每当重传的报文计时器超时时,就让退避指数加倍,即让下一次重发时间加倍,直到接受到非重传数据。

下面来看基于接收端发给发送端的报文,判断网络的拥塞,是否出现丢包或包乱序的问题。一般情况是,当接收端发现数据丢失或数据乱序时,接收端选择发送重复ACK确认报文,向发送端报告数据丢失或乱序。一般来说,小于三个ACK重复报文代表数据乱序,大于等于三个重复ACK代表数据丢失。当发送端观察到这种情况后,不管超时计时器是否超时,都会选择重发丢失或乱序的数据。

二、慢启动和拥塞控制

前面了解了超时重发后,我们开始讨论慢启动和拥塞控制。慢启动顾名思义,是为了进行流量控制,发送端控制发送数据的大小的动作。初始时,发送端发送一个报文段,等收到接收端对该报文段的确认ACK后,发送端就可以发送2个报文段,当收到对这两个报文段的确认ACK后,发送端就可以发送4个报文段,一直按照指数增长下去。这种TCP中使用的发送数据的方式为慢启动(Slow Start)。一般在TCP中,慢启动和拥塞控制同时使用。

下面介绍拥塞控制,拥塞控制也就是在发送端设置一个窗口结构,窗口大小为cwnd,其根据网络的拥塞情况动态变化,也就是根据连接的超时重发情况动态变化。发送端只能发送小于或等于拥塞窗口和滑动窗口大小的数据。初始时cwnd为1,ssthreshold(Start Slow Threshold)为65535。当cwnd <= ssthreshold时,执行慢启动;当cwnd > ssthreshold后,执行拥塞控制。慢启动前面说了可以传输的数据量以指数形式增长。拥塞控制是cwnd线性增长,即要么以1/cwnd,要么以1增长。

1.当出现因超时引起的重传时,执行:

1.ssthreshold = cwnd / 2

2.cwnd = 1

3.进入慢启动

2.当出现发送端接收到三个重复的ACK后发生的重传,执行:

1.cwnd = cwnd / 2

2.ssthreshold = cwnd

3.进入快速恢复算法

快速恢复算法:

1.前面已经更新了cwnd和ssthreshold

2.随后设置cwnd = cwnd + 3 * MSS

3.重传数据

4.再每收到一个重复ACK,cwnd = cwnd + 1

5.直到没收到重复ACK,设置cwnd = ssthreshold

原文地址:https://www.cnblogs.com/glsy/p/8605848.html

时间: 2024-11-13 15:36:57

拥塞窗口的相关文章

TCP/IP可靠的原理 滑动窗口 拥塞窗口

TCP和UDP处在同一层---运输层,但是TCP和UDP最不同的地方是,TCP提供了一种可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个"拨打电话"的过程,等到通信准备结束才开始传输数据,最后结束通话.所以TCP要比UDP可靠的多,UDP是把数据直接发出去,而不管对方是不是在收信,就算是UDP无法送达,也不会产生ICMP差错报文,这一经时重申了很多遍了. 把TCP保证可靠性的简单工作原理摘抄如下 应用数据被分割成TCP认为最适合发送的数据块.这和

慢启动与拥塞窗口

在局域网中,发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止.但是,如果收发双方不在同一个局域网中,那么发送方一直发送可能会出问题,因为中间路由器有可能发生拥塞,拥塞是指一个或者多个交换点的数据报超载而导致时延剧烈增加的现象. 为了解决这个问题,TCP支持一种被称为"慢启动"的算法,该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作.为了控制拥塞,TCP使用了第二个窗口(第一个是控制流量的滑动窗口)限制,即拥塞窗口限制.拥塞窗口是发送方使用

独立双(N)拥塞窗口的TCP单边加速思想

让TCP以流水线方式工作靠谱吗?也许你听说过MPTCP,也许你听过P2P下载是多么的天下人为我而我负天下人.        如果我能将一个TCP流拆分成多个TCP流,理论上来讲传输速度会有很大的提升,因为TCP拥塞控制算法是必须携带公平性收敛特征的(不然paper不会通过...),TCP反馈系统会为每一个加入的流分配一张船票,反馈系统不会管你们几个是不是一伙儿的,它只按人头计数,不会分组,这样就有很多好玩的事情可以做了.        我平时比较喜欢跟一些非工作关系的同行做技术交流,随便找个地方

TCP数据量--滑动窗口、拥塞窗口、慢启动、Negle算法 经受时延的确认等

TCP的数据流大致可以分为两类,交互数据流与成块的数据流.交互数据流就是发送控制命令的数据流,比如relogin,telnet,ftp命令等等:成块数据流是用来发送数据的包,网络上大部分的TCP包都是这种包. 很明显,TCP在传输这两种类型的包时的效率是不一样的,因此为了提高TCP的传输效率,应该对这两种类型的包采用不同的算法. 总之,TCP的传输原则是尽量减少小分组传输的数量. TCP的交互式数据流 ?         经受时延的确认技术 TCP的交互式数据流通常使用"经过时延的确认"

TCP 滑动窗口和 拥塞窗口

转http://coolshell.cn/articles/11609.html 滑动窗口 -- 表征发送端和接收端的接收能力 拥塞窗口-- 表征中间设备的传输能力 TCP滑动窗口 需要说明一下,如果你不了解TCP的滑动窗口这个事,你等于不了解TCP协议.我们都知道,TCP必需要解决的可靠传输以及包乱序(reordering)的问题,所以,TCP必需要知道网络实际的数据处理带宽或是数据处理速度,这样才不会引起网络拥塞,导致丢包. 所以,TCP引入了一些技术和设计来做网络流控,Sliding Wi

TCP的拥塞窗口和快速恢复机制的一些备忘及一点想法

rwnd(窗口,代表接收端的处理能力).cwnd(拥塞窗口,从发送端看当前网络整体承载能力).ssthresh(快速增长切换成慢速增长的界限值) 1.慢启动,是指数增长(对面确认多少个包,就增加多少),并不慢,只是它的起点低,所以慢启动阶段仍需要时间.实际是起点低(1),快增长阶段,每一轮将当前拥塞窗口翻倍.2.拥塞避免,引入了ssthresh(这个是个变量,初始往往是最大值65536,随后续拥塞发生不断调整),控制慢启动阶段区间是在窗口超过ssthresh之后,就开始线性增长(是让cwnd缓慢

TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗

tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击. 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的. 限流可以控制本软件或者应用的流量大小,从而减少对部署在相同物理机的其他应用的影响,减少物理网卡的流量占用. 如果部署在vm上的应用没有限流措施,那么这个应用有可能把整个物理机的网卡流量占满,这样部署在相同物理机的其他应用就不能服务了 参考: 1.https://www.zhihu.com/question/32255109 2.htt

TCP/IP详细说明--滑模、拥塞窗口、慢启动、Negle算法

TCP的数据流大致能够分为两类,交互数据流与成块的数据流. 交互数据流就是发送控制命令的数据流.比方relogin,telnet.ftp命令等等.成块数据流是用来发送数据的包,网络上大部分的TCP包都是这样的包. 非常明显.TCP在传输这两种类型的包时的效率是不一样的,因此为了提高TCP的传输效率,应该对这两种类型的包採用不同的算法. 总之.TCP的传输原则是尽量降低小分组传输的数量. TCP的交互式数据流 ? 经受时延的确认技术 TCP的交互式数据流通常使用"经过时延的确认"技术.通

TCP/IP详细解释--TCP/IP可靠的原则 推拉窗 拥塞窗口

TCP和UDP在同一水平---传输层.但TCP和UDP最不一样的地方.TCP它提供了一个可靠的数据传输服务,TCP是面向连接的,那.使用TCP两台主机通过第一通信"拨打电话"这个过程,等待,直到通信结束就开始准备数据传输,最后,结束通话. 所以TCP比UDP可靠的多,UDP是把数据直接发出去.而无论对方是不是在收信,就算是UDP无法送达.也不会产生ICMP差错报文,这一经时重申了非常多遍了. 把TCP保证可靠性的简单工作原理摘抄例如以下 应用数据被切割成TCP觉得最适合发送的数据块.