文章目录
- 拥塞控制
- 慢启动
- 提高网络利用率的规范
- Nagle算法
- 延迟确认应答
- 捎带应答
拥塞控制
有了TCP的窗口控制,收发主机之间即使不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。然而,如果在通信刚开始时就发送大量数据,也可能会引发其他问题。
一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。TCP拥塞控制的主要目标是在网络中保持合理的数据流量,以避免过度拥塞引发的丢包、延迟和传输性能下降。
以下是TCP拥塞控制中常用的算法和技术:
- 慢启动(Slow Start):在TCP连接刚建立时,发送方将初始拥塞窗口设置为一个较小的值,然后随着时间的推移逐渐增加拥塞窗口的大小。这种方式可以避免在网络中突然注入大量数据引起的拥塞。
- 拥塞避免(Congestion Avoidance):一旦慢启动阶段结束,TCP发送方会进入拥塞避免阶段。在该阶段,发送方根据网络的反馈信息来调整拥塞窗口的大小,使得数据的发送速率适应当前网络的拥塞程度。
- 快重传(Fast Retransmit):当TCP发送方接收到重复的确认信息(ACK)时,它会推断某个数据包可能丢失,并立即进行重传,而不必等待超时重传定时器到期。
- 快恢复(Fast Recovery):在快重传的基础上,TCP发送方进入快恢复状态,继续发送数据,而不是回退到慢启动阶段。这可以减少连接的停顿时间,并加速恢复。
- 拥塞检测(Congestion Detection):TCP发送方通过监视网络的延迟和丢包情况来检测网络的拥塞程度。当发送方认为网络出现拥塞时,它会相应地调整发送速率,以减少对网络负载的贡献。
这些算法和技术共同组成了TCP拥塞控制的基本原理,通过动态地调整数据的发送速率和窗口大小,TCP可以在网络中实现拥塞的自我调节,从而确保网络的稳定性和公平性。
慢启动
首先,为了在发送端调节所要发送数据的量,定义了一个叫做“拥塞窗口”的概念。于是在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段(1MSS)(连接建立以后即刻从1MSS开始进行慢启动的话,通过卫星通信等手段提高通信吞吐量所耗的时间会比较长。为此,有时也会将慢启动的初始值设置大于1MSS的值。具体来说,MSS的值小于1095字节时最大为4MSS,小于2190字节时最大为4390字节,超过2190字节时最大值大于2MSS。以太网的标准MSS值为1460字节,因此慢启动的初始值从4380字节(3MSS)开始就可以。) 发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照它们当中较小那个值,发送比其还要小的数据量。
如果重发采用超时机制,那么拥塞窗口的初始值可以设置为1以后再进行慢启动修正。有了上述这些机制,就可以有效地减少通信开始时连续发包(连续发包的情况也叫“爆发”(Burst)。慢启动正是减少爆发等网络拥堵情况的一种机制。) 导致的网络拥堵,还可以避免网络拥塞情况的发生。
不过,随着包的每次往返,拥塞窗口也会以1、2、4等指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生。为了防止这些,引入了慢启动阀值的概念。只要拥塞窗口的值超出这个阀值,在每收到一次确认应答时,只允许以下面这种比例放大拥塞窗口:
拥塞窗口越大,确认应答的数目也会增加。不过随着每收到一个确认应答,其涨幅也会逐渐减少,甚至小过比一个数据段还要小的字节数。因此,拥塞窗口的大小会呈直线上升的趋势。
TCP的通信开始时,并没有设置相应的慢启动阀值(与窗口的最大值相同。) 。而是在超时重发时,才会设置为当时拥塞窗口一半的大小。
由重复确认应答而触发的高速重发与超时重发机制的处理多少有些不同。因为前者要求至少3次的确认应答数据段到达对方主机后才会触发,相比后者网络的拥堵要轻一些。
而由重复确认应答进行高速重发控制时,慢启动阀值的大小被设置为当时窗口大小的一半(严格来说,是设置为“实际已发送但未收到确认应答的数据量”的一半。) 。然后将窗口的大小设置为该慢启动阀值+3个数据段的大小。
有了这样一种控制,TCP的拥塞窗口如上图所示发生变化。由于窗口的大小会直接影响数据被转发时的吞吐量,所以一般情况下,窗口越大,越会形成高吞吐量的通信。
当TCP通信开始以后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生吞吐量也会急速下降。于是会再次进入吞吐量慢慢上升的过程。因此所谓TCP的吞吐量的特点就好像是在逐步占领网络带宽的感觉。
提高网络利用率的规范
Nagle算法
Nagle算法是一种用于优化网络通信的算法,主要用于减少小数据包的传输次数,提高网络传输的效率。
在计算机网络中,当应用程序通过网络发送数据时,通常会将数据划分为小的数据包进行传输。每个数据包都需要经过一定的时间和网络资源来传输。当需要传输大量小数据包时,传输每个数据包都会引入一定的延迟和开销,这可能会导致网络性能下降。
Nagle算法的目标是通过减少小数据包的传输次数来提高网络传输效率。该算法的原理是,在发送数据包之前,首先将数据缓存起来,等待一小段时间,看是否有更多的数据需要发送。如果在该时间段内没有更多数据到达,那么Nagle算法会将缓存的数据一次性发送出去;如果在该时间段内有更多数据到达,Nagle算法会将这些数据合并为一个大的数据包一起发送。
Nagle算法通过减少传输的数据包数量来减少网络开销,提高传输效率。它特别适用于一些需要频繁发送小数据包的应用场景,如Telnet、SSH等交互式应用,以及一些低带宽的网络环境。
需要注意的是,Nagle算法会引入一定的延迟,因为它需要等待一小段时间来检查是否有更多的数据到达。在某些实时性要求较高的应用场景下,可以通过禁用Nagle算法来减少延迟,但这可能会导致网络效率下降。
延迟确认应答
延迟确认应答(Delayed Acknowledgment)是一种优化TCP传输性能的机制,通过延迟发送ACK确认报文来减少网络中的报文流量和减少发送方的开销。
在TCP通信中,接收方通常需要向发送方发送ACK确认报文来确认已经接收到的数据。通常情况下,每接收到一个数据包,接收方都会立即发送一个ACK报文进行确认。这种立即发送ACK的方式可以确保可靠传输和快速反馈,但也会增加网络中的报文流量,特别是在高速网络和大流量传输时。
为了减少ACK报文的数量,TCP引入了延迟确认机制。
- 在没有收到2×最大段长度的数据为止不做确认应答(根据操作系统的不同,有时也有不论数据大小,只要收到两个包就即刻返回确认应答的情况。)
- 其他情况下,最大延迟0.5秒发送确认应答(如果延迟多于0.5秒可能会导致发送端重发数据。) (很多操作系统设置为0.2秒左右(这个时间越小、CPU的负荷会越高,性能也下降。反之,这个时间越长,越有可能触发发送主机的重发处理,而窗口为只有1个数据段的时候,性能也会下降。) )
如果在这段时间内没有接收到其他数据,接收方就会发送一个累积ACK,确认之前接收到的所有数据。
延迟确认的优势在于减少了ACK报文的数量,从而降低了网络中的报文流量。尤其在一些交互式应用中,可以显著减少网络开销和延迟,提高传输性能。
然而,需要注意的是,延迟确认也可能引入一定的延迟。如果发送方在等待ACK确认时,没有接收到ACK报文,它会认为数据丢失,并进行重传。这会导致一定的传输延迟。因此,延迟确认的使用需要权衡延迟和网络开销之间的关系,根据具体应用场景进行配置。
捎带应答
捎带应答(SACK, Selective Acknowledgment)是一种TCP拓展功能,用于改进丢包重传的效率。它允许接收方在一个ACK报文中同时确认多个不连续的数据段的接收情况,从而减少重传的次数。
在传统的TCP协议中,当接收方收到一个有序的、连续的数据段时,它会向发送方发送一个ACK报文进行确认。如果接收方收到的数据段不连续,例如有一些数据段丢失,它会发送一个重复ACK来指示发送方需要重传丢失的数据段。发送方收到重复ACK后会认为数据丢失,并进行重传操作。
TCP捎带应答通过在ACK报文中携带了额外的信息,使接收方能够一次性确认多个不连续的数据段的接收情况。接收方会在ACK报文中使用SACK选项,指示已成功接收的数据段的范围。发送方收到这样的ACK报文后,可以根据SACK选项中的信息,只重传丢失的数据段,而不必重传已经成功接收的数据段。
TCP捎带应答的优势在于减少了不必要的重传,提高了网络传输的效率。通过允许接收方一次性确认多个不连续的数据段,TCP可以更加精确地识别出丢失的数据段,并有针对性地进行重传,而不是简单地重传全部数据段。
需要注意的是,TCP捎带应答需要在发送方和接收方之间共同支持和启用。如果其中一方不支持捎带应答,TCP会退回到传统的ACK确认方式。此外,TCP捎带应答使用了TCP报文的选项字段,会增加报文的大小,可能会影响网络传输的效率,特别是在一些低带宽的环境中。