计网-TCP-拥塞控制

  • 1)什么是拥塞?

    在某段时间内,在某网络资源的需求超过了该资源所提供的可用部分,网络的性能就要崩坏,这就是拥塞。

  • 2)为什么要拥塞控制?

    目的是为了防止过多的数据注入到网络中,造成路由器或链路过载。
    拥塞控制是一个全局性的过程,涉及到所有的主机、路由器等于网络传输性能有关的因素。 (与此对应的流量控制是对点对点通信量的控制,是端对端的问题)

  • 3)如何进行拥塞控制?

    TCP发送方维持一个拥塞窗口的状态变量,拥塞窗口的大小取决于网络的拥塞程度,是动态变化的。发送方的发送窗口大小 = min(拥塞窗口,接收方接收窗口)

  • 4)涉及到什么算法?

    • 1、慢开始:刚开始就把大量数据注入网络可能会引起阻塞,从小到大逐渐的增大发送窗口可以避免这个问题 cwnd=1-2-4-8-16指数倍增加

    • 2、拥塞避免:见上,扩大窗口,回cwnd+1,

    • 3、快重传、快恢复:Fast retransmit and recovery,FRR能快速恢复丢失的数据包。

    • 没有 FRR,如果数据包丢失了,TCP 将会使⽤定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。

    • 有了 FRR,如 果接收机接收到⼀个不按顺序的数据段,它会⽴即给发送机发送⼀个重复确认。如果发送机接收 到三个重复确认,它会假定确认件指出的数据段丢失了,并⽴即重传这些丢失的数据段。

    • 有了 FRR,就不会因为重传时要求的暂停被耽误。  当有单独的数据包丢失时,快速重传和恢复 (FRR)能最有效地⼯作。当有多个数据信息包在某⼀段很短的时间内丢失时,它则不能很有效 地⼯作。

    img

    在这里插入图片描述

### TCP拥塞控制算法设与策略详解 #### 1. 概述 TCP协议的核心目标之一是在不可靠网络环境中提供可靠的数据传输服务。为了防止网络过载并提高吞吐量,TCP引入了多种拥塞控制机制。这些机制通过动态调整发送端的流量来适应当前网络状况。 #### 2. 发展历程及主要算法分类 TCP拥塞控制经历了多个阶段的发展,早期版本仅依赖简单的重传超时机制,而现代TCP则采用了更加复杂的反馈驱动方法。目前主流的TCP拥塞控制算法可以分为以下几类[^1]: - **基于丢包的传统算法**: 如TCP Reno, 它利用数据包丢失事件作为网络拥堵的主要信号。 - **基于延迟的新一代算法**: 这些改进型方案尝试结合RTT (Round-Trip Time) 变化等因素综合判断网络状态。 #### 3. 经典算法解析——TCP Reno 作为一种广泛使用的经典代表,TCP Reno采用AIMD(Additive Increase Multiplicative Decrease)[^2],即加性增加/乘法减少原则来进行拥塞管理: - 在**慢启动阶段**, 初始设置`cwnd=1`, 并逐步增大该值直到达到预设阈值`ssthresh`. 此过程中每当接收到一个新的ACK确认消息后,cwnd就会相应递增. ```python cwnd += MSS # 每次成功接收一个ACK后的操作,MSS表示最大报文段大小 ``` - 当进入**拥塞避免模式**之后,则按照线性速率提升窗口尺寸而非指数级扩张. 一旦检测到三重复ACK或者显式的timeout发生时认为出现了链路阻塞情况,此时采取激进措施迅速缩减带宽占用比例: ```python ssthresh = max(cwnd / 2 , 2 *MSS ) cwnd = ssthresh ``` 上述过程体现了典型的AIMD行为特征. 然而,Reno存在一些固有问题比如对高BDP(Bandwidth Delay Product)环境支持较差等问题. #### 4. 新兴技术方向探讨 随着互联规模持续扩大以及新型应用场景不断涌现,单纯依靠packet loss触发反应已无法满足需求.因此近年来涌现出不少创新思路试图弥补传统方法不足之处: - Cubic: 提出了更为灵活的增长曲线模型替代固定步长调节方式; - BBR(Vegas): 主要关注最小化queueing latency同时最大化goodput性能指标; 它们共同特点是更多考虑到了end-to-end路径特性从而做出更精准决策[^3]. --- ### 示例代码片段展示如何模拟简单版Reno逻辑 下面给出一段伪代码用于演示基本原理: ```python class TCPSender: def __init__(self): self.cwnd = 1 # Initial congestion window size self.ssthresh = float('inf') # Slow start threshold initially set very high def on_ack_received(self): if self.cwnd < self.ssthresh: # During slow-start phase self.cwnd += 1 else: # In congestion avoidance mode self.cwnd += 1/self.cwnd def handle_timeout_or_loss_detected(self): global ssthresh self.ssthresh = max(self.cwnd / 2 , 2*MSS ) self.cwnd = self.ssthresh ``` 此段程序展示了简化条件下实现的关键部分处理流程. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值