滑动窗口主要管理数据流动的速率,对单个连接较好,拥塞控制则防止网络出现过载,对提高整体的网络通畅较好。下面详细解析两者的原理和作用。
1. TCP 滑动窗口算法
TCP 使用滑动窗口机制来控制数据的发送和接收,以实现流量控制,避免接收方被数据淹没。该算法的核心是让发送方根据接收方的接收能力来调整数据发送速率。
a) 基本概念
- 发送窗口:发送方可以连续发送的数据量,由 TCP 头部的
Window
字段确定,是接收方能够处理的最大数据量。 - 接收窗口:接收方能够处理的最大数据量,告诉发送方当前自己能接收多少数据。
- 已确认区间:发送方已发送并收到确认的数据部分。
- 未确认区间:发送方已发送但还未收到确认的数据部分,仍在等待 ACK。
- 可发送区间:发送方可以发送的新的数据,这个区间是由接收窗口决定的。
b) 滑动窗口的工作机制
滑动窗口通过控制数据发送的字节数量来实现流量控制。当发送方发送了数据,它可以在未收到 ACK 的情况下继续发送数据,只要这些数据在窗口大小内:
- 发送数据:发送方根据接收方的窗口大小,持续发送数据。
- 等待确认:接收方收到数据后,返回 ACK 确认已接收的数据。
- 窗口滑动:当接收方确认某些数据后,窗口就向前滑动,允许发送更多数据。
c) 窗口调整
- 接收方可以在任何时候调整窗口大小。如果接收方缓存满了,它会将窗口大小设置为 0,告诉发送方停止发送;当接收方有更多空间时,会增大窗口。
d) 流量控制
滑动窗口机制的主要作用是流量控制,确保发送方不会因为过快发送数据而导致接收方处理不过来。这种机制对于防止接收方过载和避免数据丢失至关重要。
2. TCP 拥塞控制算法
拥塞控制的主要目的是防止网络拥塞,即避免由于过多的数据流导致网络资源(如带宽、路由器缓冲区等)耗尽。TCP 使用四种核心算法来动态调整数据发送速率,以适应网络的拥塞情况。
a) 拥塞窗口( cwnd)
拥塞窗口是 TCP 的一个动态变量,表示网络上当前可安全发送的数据量。发送方根据拥塞窗口的大小来调整发送数据的速率,避免网络出现拥塞。
b) 四大拥塞控制算法
1) 慢启动
- 目的:防止网络初期拥塞,逐步增加数据发送速率。
- 工作原理:每当一个新的连接建立时,TCP 会以较小的拥塞窗口开始发送数据(通常是 1 个 MSS,最大报文段),然后每次成功收到 ACK,窗口大小就会指数级增长(每收到一个 ACK,拥塞窗口大小加倍)。
- 慢启动门限(ssthresh):当拥塞窗口增长到达一定阈值(ssthresh)时,TCP 就会停止慢启动阶段,进入拥塞避免阶段。
2) 拥塞避免
- 目的:防止网络拥塞加剧,窗口增速从指数级变为线性。
- 工作原理:在进入拥塞避免阶段后,每收到一个 ACK,窗口大小只增加一个 MSS(线性增长),确保不会因为过快增长导致拥塞。
3) 快速重传
- 目的:在发生数据包丢失时快速重传丢失的数据包。
- 工作原理:当发送方收到三个重复的 ACK 时,认为有数据包丢失,立即重传丢失的数据包,而不等待超时。
4) 快速恢复
- 目的:避免慢启动重新开始,提升恢复效率。
- 工作原理:与快速重传配合,重传丢失的数据包后,不进入慢启动,而是根据网络状况直接调整拥塞窗口大小。
c) 拥塞控制的过程
拥塞控制过程包括以下四个阶段:
- 慢启动阶段:窗口从一个小值(通常 1 个 MSS)开始,指数级增长,直到达到慢启动门限(ssthresh)。
- 拥塞避免阶段:当窗口大小超过 ssthresh 后,窗口以线性速度增长,防止拥塞。
- 快速重传阶段:检测到数据包丢失时,快速重传丢失的数据包,尽量减少等待时间。
- 快速恢复阶段:快速恢复后,窗口不会回到 1,而是调整到适当大小,继续线性增长。
3. 滑动窗口与拥塞控制的区别与联系
- 滑动窗口主要用于流量控制,防止发送方发送数据太快导致接收方无法处理,更多是关注接收方的处理能力。
- 拥塞控制则是用于防止网络拥塞,通过调整拥塞窗口的大小,动态调整发送速率,更多是关注网络的承载能力。
两者可以结合起来使用:滑动窗口控制的是接收方的接收能力,而拥塞窗口控制的是网络的可承载能力。实际的发送窗口是滑动窗口和拥塞窗口的最小值,确保既不超过接收方能力,也不让网络过载。
4. 总结
- TCP 滑动窗口算法通过动态调整窗口大小,确保发送方不会超过接收方的处理能力,避免过多数据导致接收方处理过载,实现流量控制。
- TCP 拥塞控制算法通过动态调整拥塞窗口,防止网络拥塞。包括慢启动、拥塞避免、快速重传和快速恢复四种机制,分别用于不同的网络状态和阶段。
- 两者共同作用,确保 TCP 在传输数据时既能高效利用网络资源,又能保证数据可靠传输。