慢启动定义
慢启动,是传输控制协议使用的一种拥塞控制机制。慢启动也叫做指数增长期。慢启动是指每次TCP接收窗口收到确认时都会增长。增加的大小就是已确认段的数目。这种情况一直保持到要么没有收到一些段,要么窗口大小到达预先定义的阈值。如果发生丢失事件,TCP就认为这是网络阻塞,就会采取措施减轻网络拥挤。一旦发生丢失事件或者到达阈值,TCP就会进入线性增长阶段。这时,每经过一个RTT窗口增长一个段。
慢启动解析
发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。现在,TCP需要支持一种被称为“慢启动(slowstart)”的算法。该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestionwindow),记为cwnd。当与另一个网络的主机建立TC P连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(c w n d以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。发送方开始时发送一个报文段,然后等待A C K。当收到该AC K时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的A C K时,拥塞窗口就增加为4。这是一种指数增加的关系。
下面我就观察一段慢启动的报文,
No. Time Source Destination Protocol Length Info
28196357.263885000 146.11.2.87 147.128.6.103 TCP 66 60432→35461 [SYN] Seq=0 Win=65535Len=0 MSS=1460 WS=128 SACK_PERM=1
28197 357.302364000 147.128.6.103 146.11.2.87 TCP 66 35461→60432[SYN, ACK] Seq=0 Ack=1 Win=49640 Len=0 MSS=1460 WS=1 SACK_PERM=1 服务器初始:window size=49640
28198357.302646000 146.11.2.87 147.128.6.103 TCP 54 60432→35461 [ACK] Seq=1 Ack=1 Win=4194304Len=0
28199357.306459000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes 此时拥塞窗口(cwnd)为2,因为收到了一个ack 客户端:发送seq1, next seq 1461
28200357.306490000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes 客户端: 发送seq1461, next seq 2921 然后停止,等待2921的ack.
28201357.343904000 147.128.6.103 146.11.2.87 TCP 60 35461→60432[ACK] Seq=1 Ack=1461 Win=48180 Len=0
28202357.344034000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=2921Win=46720 Len=0
28203 357.344348000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes 此时拥塞窗口(cwnd)为2+2=4,因为收到了2 ack, 客户端:可以发送8个segment
28204357.344383000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28205357.344396000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28206357.344412000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes 客户端发送四个segment后停止,因为达到了拥塞窗口大小
28207357.348952000 147.128.6.103 146.11.2.87 TCP 60 [TCP Window Update] 35461→60432[ACK] Seq=1 Ack=2921 Win=49640 Len=0
28209357.383284000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=5841Win=46720 Len=0
28210357.383404000 147.128.6.103 146.11.2.87 TCP 60 35461→60432[ACK] Seq=1 Ack=8761 Win=43800 Len=0 虽然只受到两条ack分节,但是却确认了四个分节(8761-2921)/1460=4
28211357.383950000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes 此时拥塞窗口(cwnd)为4+4=8,因为收到了4 个ack, 客户端:可以发送8个segment
28212 357.383979000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28213357.383992000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28214357.384026000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28215357.384038000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28216357.384058000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28217 357.384069000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28218357.384081000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes 客户端发送八个分节后停止,因为达到了拥塞窗口的大小。
28221357.422673000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=11681Win=48180 Len=0
28222357.422803000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=14601Win=45260 Len=0 收到4个分节的ack
28223357.423293000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes 此时拥塞窗口(cwnd)为8+4=12,因为收到了 4 个ack, 客户端:可以发送8个segment
28224357.423323000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes 因为还是4个发出的分节没有确认。
28225357.423337000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=17521Win=49640 Len=0
28226357.423387000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28227357.423404000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28228 357.423415000 147.128.6.103 146.11.2.87 TCP 60 35461→60432[ACK] Seq=1 Ack=20441 Win=46720 Len=0
28229357.423456000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28230357.423469000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28231357.423532000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28232357.423563000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28233357.424046000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28234357.424084000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28235357.424096000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28236357.424107000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28237357.424119000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28238357.424131000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28239357.424143000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28240 357.424155000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28241357.462125000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=23361Win=43800 Len=0
28242357.462554000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=26281Win=48180 Len=0
28243357.462646000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28244 357.462675000 147.128.6.103 146.11.2.87 TCP 60 35461→60432[ACK] Seq=1 Ack=29201 Win=45260 Len=0
28245357.462719000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28246357.462735000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28247357.462760000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28248357.463316000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28249357.463353000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28250357.463365000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=32121Win=49640 Len=0
28251 357.463418000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28252357.463433000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28253357.463445000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28254357.463457000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=35041Win=46720 Len=0
28255357.463496000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28256357.463509000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28257357.463520000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28258 357.464025000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28259357.464063000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=37961Win=43800 Len=0
28260357.464113000 147.128.6.103 146.11.2.87 TCP 60 35461→60432[ACK] Seq=1 Ack=40881 Win=48180 Len=0
28261357.464151000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=43801Win=45260 Len=0
28262 357.464186000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28263357.464200000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28264357.464212000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28265357.464223000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28266357.464234000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28267 357.464246000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28268357.464257000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28269357.464851000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28270357.464865000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28271357.464876000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28272357.464888000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28273357.464899000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28274357.464933000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28275357.464945000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28276357.464957000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28277357.464968000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28278357.464980000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28279357.464992000 146.11.2.87 147.128.6.103 FTP-DATA 1514 [TCP Window Full] FTP Data: 1460 bytes
28280357.501415000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=46721Win=49640 Len=0
28281357.501974000 147.128.6.103 146.11.2.87 TCP 60 35461→60432[ACK] Seq=1 Ack=49641 Win=46720 Len=0
28282357.502025000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28283357.502054000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28284357.502075000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28285357.502089000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=52561Win=43800 Len=0
28286357.502112000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28287 357.502125000 146.11.2.87 147.128.6.103 FTP-DATA 1514 [TCP Window Full] FTP Data: 1460 bytes
28288357.502137000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=55481Win=48180 Len=0
28289 357.502193000 147.128.6.103 146.11.2.87 TCP 60 35461→60432[ACK] Seq=1 Ack=58401 Win=45260 Len=0
28290357.502604000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28291357.502666000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28292357.502681000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=61321Win=49640 Len=0
28293357.502760000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28294357.502777000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28295357.502788000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28296357.502800000 147.128.6.103 146.11.2.87 TCP 60 35461→60432[ACK] Seq=1 Ack=64241 Win=46720 Len=0
28297357.503125000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28298 357.503142000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28299357.503154000 147.128.6.103 146.11.2.87 TCP 60 35461→60432 [ACK] Seq=1 Ack=67161Win=48180 Len=0
28300357.503254000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28301357.503270000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes
28302357.503282000 146.11.2.87 147.128.6.103 FTP-DATA 1514 FTP Data: 1460 bytes