欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

TCP慢启动算法 慢启动定义 有大用

慢启动定义

慢启动,是传输控制协议使用的一种阻塞控制机制。慢启动也叫做指数增长期。慢启动是指每次TCP接收窗口收到确认时都会增长。增加的大小就是已确认段的数目。这种情况一直保持到要么没有收到一些段,要么窗口大小到达预先定义的阈值。如果发生丢失事件,TCP就认为这是网络阻塞,就会采取措施减轻网络拥挤。一旦发生丢失事件或者到达阈值,TCP就会进入线性增长阶段。这时,每经过一个RTT窗口增长一个段。

慢启动解析

 发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。
一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。
现在,TCP需要支持一种被称为“慢启动(slow start)”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。当与另一个网络的主机建立T C P连接时,拥塞窗口被初始化为 1个报文段(即另一端通告的报文
段大小)。每收到一个ACK,拥塞窗口就增加一个报文段( c w n d以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥
塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。发送方开始时发送一个报文段,然后等待 A C K。当收到该A C K时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的 A C K时,拥塞窗口就增加为4。这是一种指数增加的关系。

在某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组。这就通知发送方它的拥塞窗口开得过大。当我们在下一章讨论 T C P的超时和重传机制时,将会看到它们是怎样对拥塞窗口起作用的。现在,我们来观察一个实际中的慢启动。


慢速网络例子


下图表示的是将从主机sun发送到主机vangogh.cs.berkeley.edu的数据。这些数据将通过一个慢的SLIP链路,该链路是TCP连接上的瓶颈(我们已经在时间系列上去掉了连接建立的过程)。

我们观察到发送方发送一个长度为5 1 2字节的报文段,然后等待ACK。该ACK在716 ms后收到。这个时间是一个往返时间的指示。于是拥塞窗口增加了 2个报文段,且又发送了两个报
文段。当收到报文段5的ACK后,拥塞窗口增加为3。此时尽管可发送多达3个报文段,可是在下一个ACK收到之前,只发送了2个报文段。

 

正常网络例子

在一个正常的网络,服务端在公网,客户端是一台虚拟机,通过客户端223.226.200.34,每次发送大小为102400大小数据到服务端223.226.200.200,循环次数是1000次。双方的网络良好,最开始的时候可以达到客户端每发送一个数据,服务端就发送一次ack,如下:

复制代码    
17:11:42.437707 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 1:1025, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961746], length 1024
17:11:42.437721 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 1025, win 33, options [nop,nop,TS val 972961748 ecr 2003558], length 0
17:11:42.437805 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 1025:2485, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961746], length 1460
17:11:42.437816 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 2485, win 38, options [nop,nop,TS val 972961748 ecr 2003558], length 0
....
17:11:42.468767 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 24025:25461, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961753], length 1436
17:11:42.468780 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 25461, win 83, options [nop,nop,TS val 972961756 ecr 2003558], length 0
   
复制代码    


大家可以看到两个报文之间的时间差不超过50ms左右,一般是20ms。

但是后来,可能是由于一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。导致服务端不能及时响应,确认数据,如下:

复制代码    
17:11:42.468965 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [.], seq 25461:26897, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961753], length 1436
17:11:42.469200 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 26897:28333, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961753], length 1436
......
17:11:42.478755 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 52745:54181, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961756], length 1436
17:11:42.507104 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 54181, win 27, options [nop,nop,TS val 972961766 ecr 2003558], length 0
17:11:42.516476 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 54181:55617, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961766], length 1436
17:11:42.516597 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 55617:57053, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961766], length 1436
......
17:11:42.517263 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 64233:65669, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961766], length 1436
17:11:42.517437 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 65669:67105, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961766], length 1436
17:11:42.555104 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 67105, win 2, options [nop,nop,TS val 972961778 ecr 2003558], length 0
17:11:47.457101 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 67105:68129, ack 1, win 64240, options [nop,nop,TS val 2003608 ecr 972961778], length 1024
17:11:47.457116 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 68129, win 0, options [nop,nop,TS val 972963003 ecr 2003608], length 0
   
复制代码    


可以看到这里客户端连续发送数据到服务端的这些报文里,每两个报文之间的时间差比较大,基本都达到100ms以上的差距,所以可以确定是由于服务器发送ack报文过迟,发送方才会根据拥塞窗口大小,连续发送多个报文段。

另外,这里的服务端代码中是自己的程序,并没有read数据,所以会见到win越来越小。直到最后win为0,无法接收任何数据。

参考资料:TCP/IP详解卷一


来自  https://www.cnblogs.com/ggjucheng/archive/2012/02/02/2335994.html


当一个网络面对的负载超过了它的处理能力时,拥塞就会发生。Internet也不例外。
理论上,通过使用一条从物理学中套用过来的法则:分组守恒法则,拥塞现象就可以得到控制。它的基本思想是,只有当一个老的分组离开之后才允许向网络注入一个新的分组。TCP企图通过动态的维护窗口的大小来实现这个目标。
管理拥塞的第一步是检测用色。在过去,检测拥塞是非常困难的。由于丢失分组而引起的超时可能有两种情况:(1)传输线路有噪声;(2)在一台用色的路由器上分组被丢弃。要区分这两种情形是很困难的。但是现在由于线路传输可靠性增加,我们认为Internet上大部分的传输超时都是由于拥塞引起的。


 Internet的方案,首先意识到存在的两个潜在的问题:网络容量和接收方的容量,然后单独处理每一个问题。为此,每个发送方维护两个窗口:第一个是接收方的准许窗口,第二个是拥塞窗口(congestion window) 。每个窗口反映了发送方可以传递的字节数量。最终允许发送的字节数量是两个窗口的最小值。


当一个连接建立起来的时候,发送方将拥塞窗口初始化为该连接上当前使用的最大数据段长度。然后,它发送一个最大的数据段。如果该数据段在定时器过期之前被确认,则它将拥塞窗口增加一个数据段的字节数,从而使拥塞窗口变成两倍的最大数据段长度,然后发送两个数据段。如果这两个数据段中的每一个都被确认了,则拥塞窗口再增加两个最大数据段长度。当拥塞窗口达到n个数据段的时候,如果有n个数据段都被及时确认的话,拥塞窗口增加这n个数据段对应的字节数。实际上,每一批被确认的突发数据段都会使拥塞窗口加倍。


拥塞窗口一直呈指数增长,知道发生超时,或者到达接收方窗口的大小。这里的思想是,如果一定大小的突发数据,比如说1024, 2048和4096字节,都被正常地传送过去,但是,8192字节的突发数据却发生超时,则拥塞窗口应该被设置为4096以避免拥塞。但是拥塞窗口保持在4096上,则无论接收方准许窗口有多大,发送方都不会发送超过4096字节的突发数据。这个算法被称为慢启动算法(slow start),但是它实际上一点也不慢(Jacobson, 1988)。它是指数量级的,所有的TCP实现都要求支持该算法。


 除了接收方准许窗口和拥塞窗口以外,它还使用了第三个参数: 一个阀值(threshold),初始时该参数为64KB。当一次超时发生的时候,阀值被设置为当前拥塞窗口的一半,而拥塞窗口被重置为一个最大数据段。然后使用慢启动算法来决定网络的处理能力,不过当增长到阀值的时候便停止。从这个点开始,每一此成功的传输都会使拥塞窗口线性地增长(即每次突发数据仅增长一个最大数据段),而不是成倍地增长。实际上,这个算法是在猜测,将拥塞窗口减小一半可能是可以接受的,然后再从这点开始慢慢地往上增长。


  如果不再发生超时的话,则拥塞窗口将继续线性增长,知道达到接收方准许窗口的大小。在这个点上,它将停止增长,而且,只要不再发生超时并且接收方的窗口大小不改变大小,则拥塞窗口保持不变。顺便提一下,如果一个ICMP SOURCE QUENCH分组到来并且被传递给TCP,则这个时间将被当作超时一样来对待。


来自  https://blog.csdn.net/jrunw/article/details/56835585


普通分类: