在前面的内容中讲到了 TCP 为运行在不同主机上的两个进程之间提供了可靠传输服务,TCP 的另一个关键部分就是其拥塞控制机制,它必须使用端到端拥塞控制而不是使用网络辅助的拥塞控制,因为 IP 层不向端系统提供显示的网络拥塞反馈。
TCP 所采用的方式是让每一个发送方根据所感知到的网络拥塞程度来限制其能连接发送流量的速率。如果一个 TCP 发送方感知从它到目的地之间的路径上没什么拥塞,则 TCP 发送方增加其发送速率,如果发送方感知到沿着该路径有拥塞,则发送方就会降低其发送速率。但是这种方法提出了三个问题:
- 一个
TCP发送方如何限制它像其连接发送流量的速率呢? - 第二,一个
TCP发送方如何感知发送方如何感知它从它到目的地之间的路径上存在拥塞呢? - 当发送方感知到端到端的拥塞时,采用何种算法来改变其发送速率呢?
TCP 连接的每一端都是一个接收缓存、一个发送缓存和几个变量组成。运行在发送方的 TCP 拥塞控制机制跟踪一个额外的变量,即 拥塞窗口,它对一个 TCP 发送方可能向网络中的发送流量的速率进行了限制。
在网络出现拥堵时i,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪,TCP 为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。
慢启动
首先,为了在发送端调节所要发送数据的量,定义了一个叫作 拥塞窗口 的概念,于是在慢启动的时候,将这个拥塞窗口的大小设置为 1 个数据段 1MSS 发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加一。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照它们当中较小的那个值,发送比其还要小的数据量。
MSS 是指最大报文段长度,连接建立以后即刻从 1MSS 开始进行慢启动的话,通过卫星通信等手段提高吞吐量所耗的时间会比较长。为此,有时也会将慢启动的初始值设置为大于 1MSS 的值。
在上图中,最初将发送端的窗口设置为1,每收到一个确认应答,窗口的值会增加1个段。
如果重发采用超时机制,那么拥塞窗口的初始值设置为 1 以后再进行慢启动修正,有了这些机制,就可以减少通信开始时连续发包导致的网络拥堵,还可以避免网络拥塞情况的发生。
随着包的每次往返,拥塞窗口也会以1、2、4等指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生,为了防止这些,引入了慢启动阈值的概念,只要拥塞窗口的值超过这个阈值,在每次收到一次确认应答时,值运行一下这种比例放大拥塞窗口:
一个数据段的字节数 / 拥塞窗口(字节) * 一个数据段字节数
拥塞窗口越大,确认应答的数目也会增加,不过随着每收到一个确认应答,其涨幅也会逐渐减少,甚至小过比一个数据段还要小的字节数,因此拥塞窗口的大小会呈直线上升的趋势。
TCP 的通信开始时,并没有设置相应的慢启动阈值,而是在超时重发时,才会设置为当时拥塞窗口一半的大小。
由重复确认应答而触发的高速重发与超时重发机制的处理多少有些不同,因为前者要求至少三次的确认应答数据段到达对方主机后才会触发,相比后者网络的拥堵要轻一些。而由重复确认应答进行高速重发控制时,慢启动阈值的带下被设置为当时窗口大小的一半,然后将窗口的大小设置为该慢启动阈值 +3 个数据段的大小。
有了这样一种控制,TCP 的拥塞窗口如上图所示,由于窗口的大小会直接影响数据被转发时的吞吐量,所以一般情况下,窗口越大,越会形成高吞吐量的通信。当 TCP 通信开始开始以后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生吞吐量也会急速下降。于是会再次进入吞吐量慢慢上升的过程,因此所谓 TCP 的吞吐量的特定就好像是逐步占领网络带宽的感觉。
总结
TCP的拥塞控制机制包括以下几个关键算法:
- 慢启动(Slow Start):在建立TCP连接时,发送方将初始发送速率设置为一个较小的值,然后随着每次收到确认回复,将发送速率逐渐增加。这样可以在连接建立初期,逐渐探测网络的可用带宽,并避免发送大量数据造成网络拥塞;
- 拥塞避免(Congestion Avoidance):在慢启动阶段之后,发送方进入拥塞避免阶段。在这个阶段,发送方会以较慢的速率递增发送窗口的大小,以避免过快地发送过多的数据,导致网络拥塞。发送方根据网络的反馈信息动态调整发送速率,以保持网络的稳定性;
- 快速重传(Fast Retransmit):当发送方连续收到相同的确认回复时,可以认为发生了数据包丢失。为了快速恢复丢失的数据包,发送方不必等待超时,而是立即进行重传,提高了数据传输的效率;
- 快速恢复(Fast Recovery):在进行快速重传后,发送方进入快速恢复阶段。在快速恢复阶段,发送方会将拥塞窗口的大小减半,并逐渐增加拥塞窗口的大小,直到网络再次稳定。这样可以有效避免因数据包丢失导致的数据发送速率降低;
通过这些算法,TCP的拥塞控制机制可以根据网络的状态和性能动态调整数据发送速率,以避免网络拥塞,并保持网络的稳定性和高效性。
拥塞控制对于网络良好运行是必不可少的,没有拥塞控制,网络很容易出现死锁的,使得端到端之间很少或没有数据能被传输。
当 TCP 连接的路径上判断不拥塞时,其传输速率就加性增,当出现丢包时,其传输速率就乘性减,这种机制也致力于做到每一个通过拥塞链路的 TCP 连接能平等地共享该链路带宽。
参考文献
- 书籍:
计算机网络自顶向下方法原书第七版; - 书籍:
图解 TCP;
不写了,不写了,专心体波