TCP拥塞控制是传输控制协定(英语:Transmission Control Protocol,缩写TCP)避免网路拥塞的算法,是网际网路上主要的一个拥塞控制措施。它使用一套基于线增积减模式的多样化网路拥塞控制方法(包括慢启动和拥塞视窗等模式)来控制拥塞。在网际网路上套用中有相当多的具体实现算法。
基本介绍
- 中文名:TCP拥塞控制
- 外文名:Transmission Control Protocol
- 缩写:TCP
- 领域:计算机
运作方法
TCP使用多种拥塞控制策略来避免雪崩式拥塞。TCP会为每条连线维护一个“拥塞视窗”来限制可能在端对端间传输的未确认分组总数量。这类似TCP流量控制机制中使用的滑动视窗。TCP在一个连线初始化或逾时后使用一种“慢启动”机制来增加拥塞视窗的大小。它的起始值一般为最大分段大小(Maximum segment size,MSS)的两倍,虽然名为“慢启动”,初始值也相当低,但其增长极快:当每个分段得到确认时,拥塞视窗会增加一个MSS,使得在每次往返时间(round-trip time,RTT)内拥塞视窗能高效地双倍增长。
当拥塞视窗超过慢启动阈值(ssthresh)时,算法就会进入一个名为“拥塞避免”的阶段。在拥塞避免阶段,只要未收到重複确认,拥塞视窗则在每次往返时间内线性增加一个MSS大小。
拥塞视窗
在TCP中,拥塞视窗(congestion window)是任何时刻内确定能被传送出去的位元组数的控制因素之一,是阻止传送方至接收方之间的链路变得拥塞的手段。他是由传送方维护,通过估计链路的拥塞程度计算出来的,与由接收方维护的接收视窗大小并不冲突。
当一条连线创建后,每个主机独立维护一个拥塞视窗并设定值为连线所能承受的MSS的最小倍数,之后的变化依靠线增积减机制来控制,这意味如果所有分段到达接收方和确认包準时地回到传送方,拥塞视窗会增加一定数量。该视窗会保持指数增大,直到发生逾时或者超过一个称为“慢启动阈值(ssthresh)”的限值。如果传送方到达这个阈值时,每收到一个新确认包,拥塞视窗只按照线性速度增加自身值的倒数。
当发生逾时的时候,慢启动阈值降为逾时前拥塞视窗的一半大小、拥塞视窗会降为1个MSS,并且重新回到慢启动阶段。
系统管理员可以设定视窗最大限值,或者调整拥塞视窗的增加量,来对TCP调优。
在流量控制中,接收方通过TCP的“视窗”值(Window Size)来告知传送方,由传送方通过对拥塞视窗和接收视窗的大小比较,来确定任何时刻内需要传输的数据量。
慢启动
慢启动(Slow-start)是用于结合其他阶段算法,来避免传送过多数据到网路中而导致网路拥塞,算法在RFC5681中定义。
慢启动初始启动时设定拥塞视窗值(cwnd)为1、2、4或10个MSS。拥塞视窗在每接收到一个确认包时增加,每个RTT内成倍增加,当然实际上并不完全是指数增长,因为接收方会延迟传送确认,通常是每接收两个分段则传送一次确认包。传送速率随着慢启动的进行而增加,直到遇到出现丢失、达到慢启动阈值(ssthresh)、或者接收方的接收视窗进行限制。如果发生丢失,则TCP推断网路出现了拥塞,会试图採取措施来降低网路负载。这些是靠具体使用的TCP拥塞算法来进行测量判断。当达到慢启动阈值(ssthresh)时,慢启动算法就会转换为线性增长的阶段,算法控制每个RTT内拥塞视窗只增加1个分段量。虽然称为“慢启动”,但实际上比拥塞控制阶段的视窗增加更为激进。
对于处理报文丢失这个事件上,不同拥塞控制算法表现有所不同:
- TCP Tahoe
- 对于TCP Tahoe算法,当发生丢失时,会进入“快速重传”机制,慢启动阈值设为之前拥塞视窗值的一半,拥塞视窗值降为初始值,重新进入慢启动阶段。当拥塞视窗值达到慢启动阈值时,每RTT内拥塞视窗增加值则为“MSS除以CWND”的值,所以拥塞视窗按线性速度增加。
- TCP Reno
- TCP Reno算法实现了一个名为“快速恢复”的机制,慢启动阈值设为之前拥塞视窗值的一半,和作为新的拥塞视窗值,并跳过慢启动阶段,直接进入拥塞控制阶段。
慢启动假设分段的未确认是由于网路拥塞造成的,虽然大部分网路的确如此,但也有其他原因,例如一些链路质量差的网路,会导致分段包丢失。在一些网路环境,例如无线网路,慢启动效率并不好。
慢启动对于一些短暂的连线性能并不好,一些较旧的网页浏览器会创建大量连续的短暂连结,通过快速开启和关闭连结来请求获得档案,这使得大多数连结处于慢启动模式,导致网页回响时间差。所以现在新的网页浏览器,会通过向特殊的伺服器,开启一条连结来请求获得全部的档案,而避免频繁新建大量短暂连结。不过这样对一些非请求网站所提供的服务,例如广告跟蹤脚本、社交分享功能脚本、网路分析脚本等,并不适用。
和式增加,积式减少
和式增加,积式减少(additive-increase/multiplicative-decrease,AIMD,这里简称“线增积减”)是一种反馈控制算法,其包含了对拥塞视窗线性增加,和当发生拥塞时对视窗积式减少。多个使用AIMD控制的TCP流最终会收敛到对线路的等量竞争使用。
快速重传
快速重传(Fast retransmit)是对TCP传送方降低等待重发丢失分段用时的一种改进。TCP传送方在每传送一个分段时会启动一个逾时计时器,如果相应的分段确认没在特定时间内被送回,传送方就假设这个分段在网路上丢失了,需要重发。这也是TCP用来估计RTT的测量方法。
重複确认(duplicate cumulative acknowledgements,DupAcks)就是这个阶段的基础,其基于以下过程:如果接收方接收到一个数据分段,就会将该分段的序列号加上数据位元组长的值,作为分段确认的确认号,传送回传送方,表示期望传送方传送下一个序列号的分段。但是如果接收方提前收到更下一个序列号的分段——或者说接收到无序到达的分段,即之前期望确认号对应的分段出现接收丢失——接收方需要立即使用之前的确认号传送分段确认。此时如果传送方收到接收方相同确认号的分段确认超过1次,并且该对应序列号的分段逾时计时器仍没逾时的话,则这就是出现重複确认,需要进入快速重传。
快送重传就是基于以下机制:如果假设重複阈值为3,当传送方收到4次相同确认号的分段确认(第1次收到确认期望序列号,加3次重複的期望序列号确认)时,则可以认为继续传送更高序列号的分段将会被接受方丢弃,而且会无法有序送达。传送方应该忽略逾时计时器的等待重发,立即重发重複分段确认中确认号对应序列号的分段。