TCP 流量控制
为什么需要流量控制:在数据传输过程中,如果发送方发送数据的速度过快,接收方可能来不及接收,就会造成数据的丢失。流量控制的目的就是让发送方的发送速率不要太快,要让接收方来得及接收,从而保证数据传输的可靠性。
实现机制:滑动窗口:
基本原理:发送方和接收方在建立 TCP 连接时,接收方会告知发送方自己的接收窗口大小(rwnd),发送方根据这个值来调整自己的发送窗口大小(swnd),发送窗口内的是可以发送的数据。接收方在接收到数据后,会返回确认报文(ACK),告知发送方哪些数据已经成功接收,发送方根据这些确认信息来移动发送窗口,继续发送后续的数据。
窗口调整过程:例如,接收方告知发送方接收窗口为 400 字节,发送方就将自己的发送窗口设置为 400 字节。发送方每发送一个报文段,接收窗口就会相应地减少,当接收方成功接收并确认了一些数据后,接收窗口会重新变大,发送方的发送窗口也会随之调整。如果接收方的接收能力下降,比如接收缓冲区已满,接收方会在确认报文中减小接收窗口的值,发送方收到后就会相应地减小发送窗口,降低发送速率。
特殊情况及应对:如果接收方的接收窗口变为 0,发送方会停止发送数据,并启动一个持续计时器。当持续计时器超时,发送方会发送一个零窗口探测报文,询问接收方的接收窗口是否已经恢复。接收方收到探测报文后,会返回自己当前的接收窗口值,如果仍然为 0,发送方就重新启动持续计时器;如果不为 0,发送方就可以继续发送数据。
TCP 拥塞控制
为什么需要拥塞控制:网络中的带宽、路由器的缓存等资源都是有限的,如果大量的数据同时涌入网络,就会导致网络拥塞,使网络的性能下降,甚至会导致网络瘫痪。拥塞控制的目的就是防止过多的数据注入网络,使网络中的路由器或链路不致过载。
相关算法:
慢启动:
原理:在连接建立初期,发送方的拥塞窗口(cwnd)初始化为 1 个最大报文段(MSS)大小,然后每经过一个往返时间(RTT),拥塞窗口就加倍,即呈指数级增长。这样可以避免一开始就发送大量的数据,而是先探测一下网络的拥塞程度。
示例:开始时 cwnd = 1,经过 1 个 RTT 后,cwnd = 2;经过 2 个 RTT 后,cwnd = 4;以此类推。
门限限制:当拥塞窗口增长到一定程度(达到慢启动门限 ssthresh)时,就会进入拥塞避免阶段。
拥塞避免:
原理:当拥塞窗口超过慢启动门限 ssthresh 后,进入拥塞避免阶段。在这个阶段,拥塞窗口不再呈指数级增长,而是每经过一个 RTT,拥塞窗口就增加 1 个 MSS 大小,呈线性增长。这样可以避免拥塞窗口增长过快,导致网络拥塞。
目的:使拥塞窗口缓慢地增长,逐渐调整到网络的最佳值,在充分利用网络带宽的同时,避免网络拥塞。
快速重传和快速恢复:
快速重传:当发送方收到 3 个相同的 ACK 时,就认为有数据包丢失,立即进行快速重传,而不是等到重传定时器超时。这样可以减少数据传输的延迟,提高传输效率。
快速恢复:在快速重传之后,不是像传统的拥塞控制算法那样重新进入慢启动阶段,而是将慢启动门限 ssthresh 设置为当前拥塞窗口的一半,然后将拥塞窗口设置为 ssthresh 的值(有些实现为 ssthresh + 3),接着进入拥塞避免阶段。这样可以避免因为个别数据包的丢失而导致拥塞窗口急剧减小,从而提高网络的吞吐量。
总体而言,TCP 的流量控制和拥塞控制是保证 TCP 数据传输可靠性和网络高效性的重要机制,它们相互配合,共同维护了网络的稳定运行。