目录
1、TCP重传机制
TCP 针对数据包丢失的情况,会用重传机制解决。
超时重传
就是在发送数据时,设定一个定时器,当超过指定的时间还没有收到对方的 ACK 确认应答报文,就会重发该数据。
RTT往返时延是数据包的往返时间,超时重传时间的值应该略大于报文往返 RTT 的值。
快速重传
不以时间为驱动,而是以数据驱动重传。
快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
比如A给B发了1、2、3、4、5个报文,B收到1后应答2表示希望收到2,但是2丢失了,后面B收到3、4、5时都返回2,A收到了三个 Ack = 2 的确认,知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2。
【它依然面临着另外一个问题。发送方并不清楚这连续的 ACK2 是接收方收到哪个报文而回复的,是重传一个,还是重传所有的报文。】
选择性确认
在 TCP 头部「选项」字段里加一个 SACK数据,它可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
2、滑动窗口
我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。这种方式的效率比较低。
所以TCP引入了窗口这个概念,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。窗口实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。而且还会有累计应答,只要发送方收到了 ACK xx 确认应答,就意味着 xx 之前的所有数据「接收方」都收到了,这样即使之前有应答丢失了也没事。
3、流量控制
发送方不能无脑的发数据给接收方,要考虑接收方处理能力。如果一直无脑的发数据给对方,但对方处理不过来,导致网络流量的无端的浪费。TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量。
- TCP流量控制的主要机制是通过滑动窗口实现的。发送方根据接收方的窗口大小和网络情况动态调整自己的发送窗口大小。
4、拥塞控制
流量控制是避免「发送方」的数据填满「接收方」的缓存
拥塞控制是避免「发送方」的数据填满整个网络
拥塞窗口cwnd是发送方根据网络的拥塞程度而动态维护的一个的变量。
发送窗口的值 是拥塞窗口和接收窗口中的最小值。
拥塞控制三个阶段:慢启动-》拥塞避免-》拥塞发生
1、慢启动
有个ssthresh慢启动门限的变量
TCP 在刚建立连接完成后,首先是有个慢启动的过程,一点一点的提高发送数据包的数量,发包的个数是指数性的增长,也就是拥塞窗口1、2、4、8这样。
当 拥塞窗口cwnd 超过 ssthresh慢启动门限 时,开始「拥塞避免算法」。
2、拥塞避免
进入拥塞避免算法后,每当收到一个 ACK 时,拥塞窗口cwnd 增加 1,也就是变成了线性增长。所以还是增长阶段,只是增长速度缓慢了一些。
3、拥塞发生
一直增长后,网络就会慢慢进入拥塞的状况,于是就会出现丢包现象,需要对丢失的数据包进行重传。
我们知道,重传一般也就超时重传和快速重传。
- 当发生了「超时重传」,则就会使用拥塞发生算法。
ssthresh慢启动门限 设为 拥塞窗口的一半,拥塞窗口重置为 1(初始值),然后重新进入慢启动阶段。
这种方式太激进,反应也很强烈,会造成网络卡顿。 - 当发生了「快速重传」,使用快速恢复算法。
快速恢复算法是认为,你还能收到 3 个重复 ACK 说明网络也不那么糟糕。此时慢启动门限和拥塞窗口都设为原拥塞窗口的一半,然后重新进入拥塞避免阶段;
TCP拥塞控制是传输控制协议(TCP)中用于防止网络拥塞的一种机制。当网络中的流量过多时,可能会导致数据包丢失和延迟增加,拥塞控制的目的是避免这种情况的发生。TCP拥塞控制主要基于以下四个算法:
慢启动(Slow Start):
慢启动是TCP开始发送数据时的初始阶段,此时拥塞窗口(Congestion Window, cwnd)从1个最大报文段(MSS)开始,每收到一个确认(ACK),cwnd 就增长1个MSS,直到达到一个阈值(ssthresh),之后切换到拥塞避免算法。
拥塞避免(Congestion Avoidance):
当cwnd超过ssthresh后,拥塞避免算法开始工作。此时,cwnd的增长速率会减慢,每经过一个往返时间(RTT),cwnd增长1个MSS。这种增长方式是线性的,而不是指数级的。
快重传(Fast Retransmit):
当接收方检测到失序的报文段时,它会立即发送重复ACK(Duplicate ACK),而不是等待自己的数据发送时才进行确认。当发送方接收到三个相同的重复ACK时,会立即重传该报文段,而不是等待重传计时器到期。
快恢复(Fast Recovery):
快恢复是与快重传配合使用的算法。当发送方接收到三个重复ACK时,会将ssthresh设置为当前cwnd的一半,并将cwnd设置为ssthresh加3个MSS,然后进入拥塞避免状态,而不是慢启动。
选择性确认(Selective Acknowledgments, SACK):
SACK是TCP的一个选项,允许接收方明确告诉发送方哪些数据已经被成功接收,哪些需要重传。这可以减少不必要的重传,提高网络效率。
延迟确认(Delayed Acknowledgments):
延迟确认是接收方为了减少发送ACK的数量而采取的一种策略,它会等待一段时间或直到收到一定数量的数据后再发送ACK。
窗口缩放(Window Scaling):
窗口缩放允许TCP窗口大小超过64KB的限制,这对于高速网络来说是非常有用的,可以显著提高传输效率。
拥塞窗口全开(Congestion Window Full, CWnd Full):
当cwnd达到最大窗口大小时,TCP会根据网络的反馈来调整数据的发送速率,以避免网络拥塞。
TCP拥塞控制的这些算法共同工作,以确保网络中的流量得到合理分配,减少数据包丢失,提高网络的整体性能和稳定性。然而,拥塞控制算法的选择和调整通常依赖于具体的网络环境和应用需求。
拥塞窗口全开(Congestion Window Full,简称CWND Full)并不是一个标准的TCP拥塞控制算法,而是对TCP拥塞窗口(Congestion Window,简称CWND)在达到最大值时行为的一种描述。在TCP拥塞控制中,CWND是一个重要的参数,用于控制发送端可以连续发送的数据量,而不受接收端接收能力的限制。
以下是CWND全开的一些概念和行为:
CWND增长:在TCP连接建立初期,CWND从1个最大报文段(MSS)开始,随着数据的成功传输,CWND会逐渐增长。
慢启动阶段:CWND按照指数方式增长,直到达到慢启动阈值(ssthresh),此时进入拥塞避免阶段。
拥塞避免阶段:CWND的增长速度会减慢,通常每经过一个往返时间(RTT),CWND增加1个MSS,增长方式为线性增长。
达到最大值:当CWND增长到一个预设的最大值(例如,由操作系统或网络环境决定的值)时,CWND就被认为是"全开"的。此时,CWND不再增长,发送端将根据这个窗口大小来控制数据的发送速率。
拥塞信号:在CWND全开的情况下,如果发生丢包或其他拥塞信号,TCP会采取措施减少CWND的大小,以避免进一步的拥塞。这通常涉及到将ssthresh设置为当前CWND的一半,并将CWND重置为1个MSS,然后重新进入慢启动阶段。
自适应调整:在某些情况下,TCP可能会使用自适应算法来调整CWND的最大值,以更好地适应网络条件。例如,使用自适应拥塞控制算法(如Vegas)的TCP变种会根据网络反馈来调整CWND的增长和减少策略。
网络环境影响:CWND全开的行为会受到网络环境的影响,例如带宽、延迟、丢包率等。在高带宽、低延迟的网络环境中,CWND可能会增长到较大值,而在拥塞严重的网络中,CWND的增长可能会受到限制。
CWND全开是一个动态的过程,它依赖于网络条件和TCP拥塞控制算法的实现。正确地管理CWND的大小对于优化网络性能和避免拥塞至关重要。