TCP 滑动窗口以及重传机制
TCP 的滑动窗口和重传机制是其实现可靠数据传输的核心部分。
1. TCP 滑动窗口
滑动窗口(Sliding Window)机制用于控制数据的流动,使得发送方可以在未收到确认(ACK)之前连续发送多个数据包。这种机制不仅提高了网络带宽的利用率,还确保了数据的有序传输。
-
窗口大小:窗口大小指发送方在未收到确认之前,可以连续发送的最大字节数。窗口大小由接收方通过 ACK 包中的窗口字段来通知发送方。发送方依据该字段来调整自己的发送速度。
-
发送窗口:发送窗口表示发送方可以发送但尚未收到确认的数据范围。窗口的左边界是已经收到确认的数据,右边界则是发送方根据接收方窗口大小计算出的最大可发送字节。
-
接收窗口:接收窗口则是接收方能够接受但尚未处理的数据范围。接收方通过窗口大小来告诉发送方它能够接收的数据量,从而防止发送方发送过多数据导致接收方缓存溢出。
-
窗口滑动:当接收到发送的数据并确认之后,窗口的左边界就会向前滑动,从而为新的数据发送腾出空间。窗口的滑动是动态的,根据 ACK 的接收情况实时调整。
2. TCP 重传机制
为了确保可靠的数据传输,TCP 实现了多种重传机制来处理数据包丢失的情况。
-
超时重传:每次发送数据包时,TCP 都会启动一个定时器。如果在指定时间内没有收到对应的 ACK,发送方会认为该数据包可能丢失,并重新发送该数据包。
-
快速重传:当接收方收到一个乱序的数据包时,会重复发送最后一个有序数据的 ACK(即 DupACK)。如果发送方连续收到三个相同的 ACK(称为三个 DupACK),它就会立即重传该 ACK 对应的数据包,而不必等待超时。
-
重传超时时间(RTO):RTO 是由 TCP 根据网络状况动态计算的超时时间。RTO 的计算通常基于往返时间(RTT)和 RTT 的波动情况(RTTVAR)。RTO 越准确,超时重传的效率越高,减少不必要的重传。
-
选择性确认(SACK):SACK 是一种可选的 TCP 扩展,用于在接收方告知发送方它已经成功接收的所有非连续数据段。这可以帮助发送方只重传那些确实丢失的数据段,而不是从丢失点开始的所有数据。
总结
TCP 滑动窗口机制提高了数据传输效率,而重传机制则确保了数据的可靠性。通过这两种机制的结合,TCP 能够在复杂多变的网络环境下,实现高效且可靠的数据传输。