流量控制:
- 目标:流量控制主要解决的是发送方和接收方之间处理能力的不匹配问题。它的目的是确保发送方不会发送数据过快,以至于接收方无法及时接收并处理这些数据,从而避免数据包在网络中堆积和丢失。
- 实现方式:在TCP协议中,流量控制主要通过使用滑动窗口机制来实现。接收方会告知发送方其当前能够接收的数据量(即接收窗口大小),发送方根据这个信息调整自己的发送速率。
流量控制: 流量控制主要关注的是发送方和接收方之间的数据传输速率。它确保发送方不会发送数据过快,以至于接收方来不及处理。流量控制的目的是防止接收方的缓冲区溢出,这通常通过动态调整接收窗口的大小来实现。接收方通过TCP报文的确认(ACK)来告知发送方其缓冲区的可用空间(接收窗口大小),发送方根据这个信息来调整发送速率。如果接收方的缓冲区满了,它会发送一个窗口大小为0的ACK,这时发送方会停止发送新的数据,直到接收方处理完数据并更新窗口大小。
如下,
(1)三次握手开始时:
A声明win=3,请求SYN;
B回复win=3,回复请求SYN,确认ACK;
A回复win=3,确认ACK。
(2)握手一旦建立好:
A连续发送3个数据给B,同时每一个数据里还在声明自己的窗口任然win=3,即A没接收到数据。
(3)B的3个win已经被占满
(4)当CPU取走一个窗口数据,空出1个:
B又给A发去win=1的信号
(5)A继续发来1个数据填充空白窗口
拥塞控制:
- 目标:拥塞控制着眼于整个网络资源的管理,而非单个连接。它是为了防止过多的数据同时涌入网络,导致中间节点(如路由器)的缓冲区溢出,进而引发网络性能急剧下降甚至崩溃的问题。
- 实现方式:TCP采用多种拥塞控制算法,包括慢开始、拥塞避免、快重传和快恢复等策略。发送方维护一个称为“拥塞窗口”的状态变量,根据网络反馈动态调整这个窗口的大小以适应网络状况。例如,在建立连接或检测到丢包时,TCP会启动慢开始算法逐渐增加发送速率;而在收到三个重复确认后,会触发快重传和快恢复算法。
拥塞控制: 拥塞控制则是为了防止网络中的数据包过多,导致网络拥塞。当网络中的路由器或链路负载过重时,可能会出现丢包现象。拥塞控制通过调整发送方的发送速率来避免这种情况。TCP协议中的拥塞控制算法包括慢开始(Slow Start)、拥塞避免(Congestion Avoidance)、快重传(Fast Retransmit)和快恢复(Fast Recovery)等策略。这些策略共同工作,使得发送方在网络出现拥塞迹象时能够减少发送速率,而在网络状况良好时逐渐增加发送速率。
cwnd
(Congestion Window)
是TCP(传输控制协议)中的一个重要概念,它代表拥塞窗口的大小,用于控制发送方在任何给定时间可以发送到网络上的数据量。拥塞窗口的主要目的是防止网络拥塞,确保数据包不会过多地涌入网络,从而避免网络资源过载。
拥塞窗口cwnd
的产生和调整遵循TCP的拥塞控制算法,这些算法包括慢启动(Slow Start)、拥塞避免(Congestion Avoidance)、快速重传(Fast Retransmit)和快速恢复(Fast Recovery)。
ssthresh
在TCP拥塞控制中通常被称为“慢启动阈值”(Slow Start Threshold)。这个术语描述了拥塞窗口(cwnd)在慢启动阶段增长到某个特定值时,TCP将从慢启动算法切换到拥塞避免算法的点。当拥塞窗口达到或超过这个阈值时,TCP将开始以更保守的方式增长窗口,即从指数增长(慢启动)变为线性增长(拥塞避免),以避免网络拥塞。在网络出现拥塞迹象时,如超时重传或连续收到三个重复的确认ACK,ssthresh
会被设置为当前拥塞窗口的一半,这是为了迅速减少发送到网络中的数据量,给网络一个恢复的机会。
-
初始值:在TCP连接建立时,
ssthresh
通常被设置为一个较大的值,例如65535字节(这是在TCP Reno版本中常见的默认值),这允许TCP在网络中快速地探测可用的带宽。 -
动态调整:当网络出现拥塞迹象时(例如,通过超时重传或连续收到三个重复的确认ACK),
ssthresh
会被设置为当前拥塞窗口(cwnd)的一半。这样做的目的是迅速减少发送到网络中的数据量,给网络一个“喘息”的机会,以便处理积压的数据包。
慢启动(Slow Start)(指数增长):
第一个包,2^0=1;第二个包,2^2=4;第三个包,2^3=8;第四个包,2^4=16(ssthresh=16)
一切顺利,数据包直接飙到慢启动阈值(如果ssthresh=65535字节,中间可能早就网络拥塞了)
拥塞避免(Congestion Avoidance)(线性增长):
16,17,18,19,20,21,22,23,24,网络超时cwnd
慢启动(Slow Start)
(一夜回到解放前,同时ssthresh被更新为拥塞窗口的一半:cwnd/2)
第一个包,2^0=1;第二个包,2^2=4;第三个包,2^3=8;ssthresh=12
拥塞避免(Congestion Avoidance)(线性增长)