网上申请个人营业执照网站,wordpress看访问量,做西服的网站,网站安全建设的重要性文章目录 什么是拥塞控制拥塞控制算法慢启动拥塞避免快速恢复 TCP拥塞控制状态机 什么是拥塞控制
拥塞控制是一种 确保网络中的数据包以可持续的速率传输 的机制#xff0c;避免因为数据包太多而超过网络当前的承载能力#xff0c;导致网络性能下降#xff0c;甚至产生大量… 文章目录 什么是拥塞控制拥塞控制算法慢启动拥塞避免快速恢复 TCP拥塞控制状态机 什么是拥塞控制
拥塞控制是一种 确保网络中的数据包以可持续的速率传输 的机制避免因为数据包太多而超过网络当前的承载能力导致网络性能下降甚至产生大量的丢包现象。
TCP 使用 端到端拥塞控制 而不是网络辅助的拥塞控制因为 IP 层不向端系统提供显式的网络拥塞反馈。TCP 采用的方法是让每一个发送方根据 所感知到的网络拥塞程度 来限制向连接发送流量的速率。
运行在发送方的 TCP 拥塞控制机制需要跟踪一个额外的变量——拥塞窗口congestion window发送方未确认的数据量不会超过 cwnd(拥塞窗口) 与 rwnd(接收窗口) 中的最小值。
# SND 为发送缓冲区, NEXT 下一个写入的字节编号, UNA 第一个已发送但未确认的字节编号
# NEXT - UNA 等于已发送但未确认的字节范围
SND.NEXT - SND.UNA min(cwnd, rwnd)发送方如何感知网络的拥塞程度
TCP 发送方通过检测丢包事件感知网络的拥塞程度丢包事件包括
出现定时器超时收到来自接收方的三个重复的 ACK
TCP 将 ACK 确认报文作为数据正常到达接收方的标志使用 ACK 报文来增加拥塞窗口的长度与之相对的一个丢失的报文段意味着网络拥塞应当降低 TCP 发送方的速率。 接下来将介绍 TCP 拥塞控制算法包含了三部分
慢启动拥塞避免快速恢复
拥塞控制算法
慢启动
慢启动slow-start状态cwnd 从 1 个 MSS 开始每当传输传输的 TCP 段首次被确认cwnd 就增加一个 MSS。TCP 发送速率起始慢但在慢启动阶段以 指数增长。
慢启动过程 以及 cwnd 随请求-应答轮次的变化关系如下图所示 初始时发送方的拥塞窗口为 1个 MSS第一轮交互后随着第一个 TCP 段顺利收到 ACK 确认标志cwnd 增加到 2MSS第二轮请求应答后TCP 发送方收到两个 ACK 确认标志cwnd 从 2 MSS 增加到 4 MSS第三轮次交互后拥塞窗口 cwnd 会变为上一轮此拥塞窗口的两倍。这说明了慢启动是以指数增长的方式增加拥塞窗口大小。 当出现下列三种情况之一时慢启动阶段结束
当拥塞窗口 cwnd 超过慢启动阈值 ssthresh就会进入 拥塞避免阶段ssthresh 一般为 65535 字节。存在超时导致的丢包事件TCP 发送方将慢启动阈值 ssthresh 设置为当前拥塞窗口 cwnd 的一半随后将拥塞窗口设置为 1MSS重新开始慢启动过程。检测到 3 个冗余的 ACKTCP 执行快速重传拥塞控制进入 快速恢复 阶段。
拥塞避免
进入拥塞避免算法后它的规则是每当收到一个 ACK 时cwnd 增加 MSS cwnd ⋅ MSS \frac{\text{MSS}}{\text{cwnd}}\cdot{\text{MSS}} cwndMSS⋅MSS 字节即每收到 cwnd MSS \frac{\text{cwnd}}{\text{MSS}} MSScwnd 个 ACK 确认段拥塞窗口增加 1 MSS。
下图是 cwnd 从慢启动阶段进入拥塞避免阶段后的变化曲线 慢启动阈值 ssthresh 等于 8MSS第三轮请求后cwnd 变为 8MSS 大于等于 ssthresh进入拥塞避免阶段第 4 轮请求发送方可以发送 8个大小为 1MSS 的 TCP 段。如果顺利发送方会收到 8 个 ACK 确认段此时 cwnd 会增加 1 MSS cwnd 8 MSS ⋅ 8 MSS 1 MSS \frac{1\text{MSS}}{\text{cwnd}8\text{MSS}}\cdot{8}\text{MSS}1 \text{MSS} cwnd8MSS1MSS⋅8MSS1MSS。因此在第 4 轮请求过后拥塞窗口增加到 9MSS。同理第 5 轮请求发送方可以发送 9MSS 的 TCP 段收到 9 个 ACK 后拥塞窗口增加到 10MSS。 上面的函数图像清晰地展示了从慢启动阶段进入拥塞避免阶段后拥塞窗口变成了线性增长。
当出现如下情况之一时拥塞避免阶段结束
存在超时导致的丢包事件TCP 发送方将慢启动阈值 ssthresh 设置为当前拥塞窗口 cwnd 的一半随后将拥塞窗口设置为 1MSS从 拥塞避免 转换为 慢启动阶段。检测到 3 个冗余的 ACKTCP 执行快速重传由 拥塞避免阶段 进入 快速恢复阶段。
下图为出现超时丢包时拥塞窗口的变化情况 拥塞窗口 cwnd 在达到 12MSS 后出现超时未收到 ACK 确认的情况。状态变量变更情况
慢启动阈值由原先的 8MSS 更新为当前拥塞窗口大小的一半即 cwnd 12 MSS 2 6 MSS \frac{\text{cwnd}12 \text{MSS}}{2}6\text{MSS} 2cwnd12MSS6MSS拥塞窗口设置为 1MSS重新进入慢启动阶段 快速恢复
快速重传和快速恢复算法一般同时使用快速恢复算法认为 能收到 3 个重复的 ACK 说明网络并不糟糕没必要像 RTO 超时时一样直接将 cwnd 锐减至 1MSS。
进入快速恢复阶段前cwnd 和 ssthresh 会被更新
cwnd cwnd/2即新的拥塞窗口设置为原先的一半大小ssthresh cwnd设置慢启动阈值等于拥塞窗口大小 进入快速恢复阶段后执行如下步骤
拥塞窗口 cwnd ssthresh 3 (3 的意思确认有 3 个数据包被收到)重传丢失的数据包如果再收到重复的 ACK那么 cwnd 增加 1MSS这一步的目的是 尽快将丢失的数据包发送给接收方。如果收到新数据的 ACK 将 cwnd 设置为第一步中的 ssthresh。原因是 ACK 确认了新的数据说明 重传丢失的数据成功TCP 累积确认机制保证恢复过程结束可以恢复到之前的状态。随后连接进入 拥塞避免状态。 下面为快速恢复阶段拥塞窗口大小变化示意图 从图中我们可以看到几个关键的节点
第 7 轮结束后cwnd 为 12MSS。第 8 轮发送的消息中出现了消息丢失接收方收到大于 [下一个期望序号] 的 TCP 段于是检测到字节流存在缺口。接收方对 已经接收的最后一个按序字节数据进行反复确认。 当 TCP 发送方收到三个重复的 ACK 后会将 ssthresh 设置为 cwnd 2 12 MSS 2 6 MSS \frac{\text{cwnd}}{2}\frac{12\text{MSS}}{2}6\text{MSS} 2cwnd212MSS6MSScwnd 设置为 ssthresh 3 MSS 9 MSS \text{ssthresh} 3\text{MSS}9\text{MSS} ssthresh3MSS9MSS。这就是为什么第 8 轮后cwnd 变为 9MSS 的原因。随后TCP 发送方又接收到了两个重复的 ACK 段cwnd 从 9MSS 增加为 11 MSS在第 11 轮后TCP 发送方接收到了新的 ACK 段将 cwnd 设置为 ssthresh6MSS进入 拥塞避免阶段。 TCP拥塞控制状态机
最后贴上一张我在学习《计算机网络自顶向下》时看到的 TCP 拥塞控制状态机供朋友们参考 感谢大家的阅读如果您对本博客有任何建议和疑问欢迎在评论区里提出我们一起讨论共同进步