TCP拥塞控制算法初步介绍
TCP拥塞控制算法初步介绍
写得较为浅显,若有错误的地方还请指正.
一、TCP拥塞控制:
-
让发送方自己感知网络的拥塞程度并限制其能向链接发送流量的速率.
-
限制方法:设置
LastByteSent - LastByteAcked <= min{cwnd, rwnd}
即已发送而未被确认的流量小于等于两个窗口长
其中,cwnd为拥塞窗口. rwnd为接收窗口(空闲空间),在cwnd最小的情况下,发送速率为cwnd/rtt(因为cwnd是一次发送的最大量)
-
感知拥塞:将
超时或收到来自接收方的三个冗余ACK
,判断为丢包事件, 将丢包事件判断为网络拥塞的指示. -
自计时:当无拥塞时,逐渐增大cwnd窗口, 以更好地利用资源. cwnd窗口的增长速度取决于确认信息到达的速率, 到达的越快增长的越快.
-
确定合适发送速率:
- 丢失报文段代表拥塞, 会减少发送速率
- 确认报文段代表正常送达, 不拥塞就有的加, 会增加发送速率
- 在不断的增减中探测当前合适的速率
二、TCP拥塞控制算法
1.慢启动
TCP刚启动之时,cwnd设置为较小于最大报文段长度(MSS)的值, 则初始发送速率约为MSS/RTT. 慢启动步骤的概况如下:
- 初始时,cwnd设置为约为MSS, TCP向网络发送一个报文段并等待确认
- 收到第一个确认时, 发送方将cwnd增加一个MSS(两个报文段)
- 收到每一个确认时,就会发送两个MSS, 这样使得TCP发送速率起始很慢,但是在慢启动阶段以指数增长.
- 停止增长的情况:
- 当发生超时指示的丢包事件 (拥塞)时, cwnd设置为1,重新开始慢启动过程, 并设置ssthresh(慢启动阈值)为cwnd/2, 即:当检测到拥塞时将ssthresh设置为拥塞窗口值的一半
- 当到达ssthresh值时,停止翻倍,转移为拥塞避免状态
- 检测到三个冗余ACK时, TCP执行快速重传并进入快速回复状态
2.拥塞避免
由于通过翻倍增加容易超出阈值,所以采用更保守的增长方法:
-
每个RTT只将cwnd增大一个MSS(从翻倍变为加一), 可以通过每个新的ACK是的cwnd增长MSS^2/cwnd
-
停止增长的情况:
-
超时事件发生时, cwnd设为一个MSS, ssthresh设置为cwnd的一半,并重新慢启动
-
检测到三个冗余ACK时,ssthresh值为cwnd/2, 然后cwnd值减半加3.进入快速恢复状态
为什么要加3?
可以认为拥塞控制此时只是转换到了快速恢复状态,而先前的三个冗余ACK没有一笔勾销.所以快速恢复状态要对先前的三个冗余ACK进行反应,即 +3MSS.
也就是说,这三个ack也被判定到快速恢复状态里去了
-
3.快速回复(推荐,非必须)
- 每收到一个冗余ACK则cwnd增加一个MSS
为什么收到了冗余ACK反而要增加MSS:
快速恢复速率,快速重传,不必等待超时
快速重传的基本思想是,当发送方收到多个对同一报文段的冗余ACK时,它假定该报文段已经丢失,并快速重传该报文段,而不必等待超时。在快速重传后,TCP可以采取快速恢复(Fast Recovery)的算法,其中拥塞窗口(cwnd)会被增加,以便更快地将发送速率恢复到一个较高的水平。
这样做的原因是:
- 快速适应网络状况: 快速重传和快速恢复的机制允许TCP更快地适应网络状况,而不必等待超时。增加拥塞窗口有助于快速恢复到较高的发送速率。
- 减少数据传输的中断时间: 通过在收到冗余ACK时进行快速重传和快速恢复,TCP可以减少数据传输的中断时间,提高网络的利用率。
我们发现:
超时后就重新慢启动,三个冗余ACK就快速重传,超出阈值了就拥塞避免状态
posted on 2024-02-07 12:07 Fg0_MURAMASA 阅读(25) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步