博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《网络协议》TCP 拥塞控制
阅读量:2192 次
发布时间:2019-05-02

本文共 1498 字,大约阅读时间需要 4 分钟。

概述

        TCP 拥塞控制能够提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。拥塞控制主要有几种:慢启动拥塞避免快速重传 以及快速恢复

        拥塞控制的最终受控变量是发送端向网络一次连续写入的数据量(即收到其中第一个数据的确认应答之前的所有数据),称为发送窗口(send window,SWND)。但是发送端往往最终以 TCP 报文段来发送数据,所以 SWND 限定了发送端能够连续发送 TCP 报文段的数量。发送端应该合理的选择 SWND 的大小,若该值太小,会引起网络延迟,若太大,则容易导致网络拥塞。前面中我们知道,接收端可通过其接收通告窗口(RWND)来控制发送端的 SWND 大小,但是发送端应该引入一个拥塞窗口(Congestion Window,CWND)的状态量。实际的 SWND 值就是 RWND 和 CWND 中的较小者。

慢启动

       为了防止网络拥塞,TCP 采用了一种慢启动算法,对发送数据量进行控制。为了调节发送端的数据发送量,引入了拥塞窗口,在慢启动时,将这个拥塞窗口设为 1 个报文段发送数据,之后每收到一次确认应答,拥塞窗口的值就加 1 个报文段。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小进行比较,然后选择较小的值来控制数据量的发送。拥塞窗口是发送端使用的流量控制,而通告窗口则是接收端使用的流量控制。

       慢启动算法步骤如下(cwnd全称Congestion Window):

  1. 初始化 cwnd = 1,表示可以传一个 MSS 大小的数据;
  2. 每当收到一个 ACK,cwnd++,即增加1,呈线性上升;
  3. 每当过了一个 RTT,cwnd = cwnd*2,呈指数让升;
  4.  ssthresh(slow start threshold),是一个上限,当 cwnd >= ssthresh 时,就会进入“拥塞避免算法”(后面会说这个算法);

拥塞避免

       拥塞避免算法是让拥塞窗口缓慢地增大,收到每一轮的确认后,将拥塞窗口的值加1,而不是加倍,这样拥塞窗口的值按照线性规律缓慢增长。在慢启动中,当cwnd >= ssthresh时,就会进入“拥塞避免算法”。一般来说ssthresh的值是65535,单位是字节,当cwnd达到这个值时后,算法如下:

  1. 收到一个 ACK 时,cwnd = cwnd + 1/cwnd;
  2. 当每过一个RTT时,cwnd = cwnd + 1;

快速重传与快速恢复

        快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(重复发送对前面有序部分的确认),而不是等待自己发送数据时才进行捎带确认,也不是累积收到的报文发送累积确认,如果发送方连续收到三个重复确认,就应该立即重传对方未收到的报文段(有收到重复确认,说明后面的报文段都送达了,只有中间丢失的报文段没送达)。

         快恢复算法与快重传算法配合使用:

  1. 当发送方连续收到三个重复确认时,就把慢启动门限 ssthresh 设置为当前拥塞窗口 cwnd 的一半。重传丢失的报文段。设置 cwnd 为 ssthresh 加上3倍的报文段大小;
  2. 每次收到另一个重复的 ACK 时,cwnd 增加 1 个报文段大小并发送 1 个分组;
  3. 当下一个确认新数据的 ACK 达到时,设置 cwnd 为 ssthresh(跟第 1 步一样设置方法)。这个 ACK 应该是在进行重传之后的一个往返时间内对步骤 1 中重传的确认。另外,这个 ACK 也应该是对丢失的分组和收到的第一个重复的 ACK 之间的所以中间报文段的确认。这一步采用的是拥塞避免算法。

参考资料:

《TC/IP 详解》

《》

你可能感兴趣的文章
Java并发指南7:JUC的核心类AQS详解
查看>>
Java并发指南8:AQS中的公平锁与非公平锁,Condtion
查看>>
Java网络编程和NIO详解6:Linux epoll实现原理详解
查看>>
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
查看>>
Java网络编程与NIO详解8:浅析mmap和Direct Buffer
查看>>
Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型
查看>>
Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
查看>>
深入理解JVM虚拟机1:JVM内存的结构与消失的永久代
查看>>
深入理解JVM虚拟机3:垃圾回收器详解
查看>>
深入理解JVM虚拟机4:Java class介绍与解析实践
查看>>
深入理解JVM虚拟机5:虚拟机字节码执行引擎
查看>>
深入理解JVM虚拟机6:深入理解JVM类加载机制
查看>>
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>
深入理解JVM虚拟机9:JVM监控工具与诊断实践
查看>>
深入理解JVM虚拟机10:JVM常用参数以及调优实践
查看>>
深入理解JVM虚拟机11:Java内存异常原理与实践
查看>>
深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
查看>>
深入理解JVM虚拟机13:再谈四种引用及GC实践
查看>>
Spring源码剖析1:Spring概述
查看>>
Spring源码剖析2:初探Spring IOC核心流程
查看>>