拥塞控制域流量控制

2023-11-10

流量控制:也就是管理两端的流量,以免任一方向上因发送过块导致接收端溢出,或者因接收端处理太快而浪费时间的状态。具体包括:
(1)发送端的进程产生数据很慢,时不时的来个1字节数据,那么TCP就会1字节1字节的发送,效率很低。解决办法是建立一个时基的缓冲区,满足特定时间或特定大小后再整体打包发送。
(2)接收端进程消耗数据很慢,所以发送其窗口大小为1的信息,然后进行1字节的传输。解决办法是在接收缓存的一半,或者有足够空间放最大报文长度之前,宣告接收窗口大小为0;或者在对收到的报文段确认之前等待到足够的接收缓存,或者等待到一个时间段。

阻塞控制:TCP从其本身而言,是建立端到端的通信链路,因此也必须基于端到端进行控制,因为网络层本身不提供关于网络阻塞的反馈。阻塞控制就是要使TCP发送数据包的速率有所限制。超时很可能说明网络发生了阻塞,而且运用TCP进行通信的接收方的ACK是累加性的,即它只接收它认定的下一个数据包(假如接收方最近发送的ACK确认包序号为x,当前要接收的Seq序号为y的数据包,如果超前接受到大于y的,则接收方返回序号为x的ACK包),则当发送方收到重复ACK包时,网络也很有可能阻塞。

  TCP的拥塞控制主要原理依赖于一个拥塞窗口(cwnd)来控制,在之前我们还讨论过TCP还有一个对端通告的接收窗口(rwnd)用于流量控制。窗口值的大小就代表能够发送出去的但还没有收到ACK的最大数据报文段,显然窗口越大那么数据发送的速度也就越快,但是也有越可能使得网络出现拥塞,如果窗口值为1,那么就简化为一个停等协议,每发送一个数据,都要等到对方的确认才能发送第二个数据包,显然数据传输效率低下。TCP的拥塞控制算法就是要在这两者之间权衡,选取最好的cwnd值,从而使得网络吞吐量最大化且不产生拥塞。

      由于需要考虑拥塞控制和流量控制两个方面的内容,因此TCP的真正的发送窗口=min(rwnd, cwnd)。但是rwnd是由对端确定的,网络环境对其没有影响,所以在考虑拥塞的时候我们一般不考虑rwnd的值,我们暂时只讨论如何确定cwnd值的大小。关于cwnd的单位,在TCP中是以字节来做单位的,我们假设TCP每次传输都是按照MSS大小来发送数据的,因此你可以认为cwnd按照数据包个数来做单位也可以理解,所以有时我们说cwnd增加1也就是相当于字节数增加1个MSS大小。

      慢启动:最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。具体来说,当新建连接时,cwnd初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就增加1个MSS大小。这样cwnd的值就随着网络往返时间(Round Trip Time,RTT)呈指数级增长,事实上,慢启动的速度一点也不慢,只是它的起点比较低一点而已。我们可以简单计算下:

   开始           --->     cwnd = 1

   经过1个RTT后   --->     cwnd = 2*1 = 2

   经过2个RTT后   --->     cwnd = 2*2= 4

   经过3个RTT后   --->     cwnd = 4*2 = 8

如果带宽为W,那么经过RTT*log2W时间就可以占满带宽。

      拥塞避免:从慢启动可以看到,cwnd可以很快的增长上来,从而最大程度利用网络带宽资源,但是cwnd不能一直这样无限增长下去,一定需要某个限制。TCP使用了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。对于大多数TCP实现来说,ssthresh的值是65536(同样以字节计算)。拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd的大小加1,cwnd的值就随着RTT开始线性增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。
首先来看TCP是如何确定网络进入了拥塞状态的,TCP认为网络拥塞的主要依据是它重传了一个报文段。上面提到过,TCP对每一个报文段都有一个定时器,称为重传定时器(RTO),当RTO超时且还没有得到数据确认,那么TCP就会对该报文段进行重传,当发生超时时,那么出现拥塞的可能性就很大,某个报文段可能在网络中某处丢失,并且后续的报文段也没有了消息,在这种情况下,TCP反应比较“强烈”:

1.把ssthresh降低为cwnd值的一半

2.把cwnd重新设置为1

3.重新进入慢启动过程。

从整体上来讲,TCP拥塞控制窗口变化的原则是AIMD原则,即加法增大、乘法减小。可以看出TCP的该原则可以较好地保证流之间的公平性,因为一旦出现丢包,那么立即减半退避,可以给其他新建的流留有足够的空间,从而保证整个的公平性。

其实TCP还有一种情况会进行重传:那就是收到3个相同的ACK。TCP在收到乱序到达包时就会立即发送ACK,TCP利用3个相同的ACK来判定数据包的丢失,此时进行快速重传,快速重传做的事情有:

1.把ssthresh设置为cwnd的一半

2.把cwnd再设置为ssthresh的值(具体实现有些为ssthresh+3)

3.重新进入拥塞避免阶段。

     后来的“快速恢复”算法是在上述的“快速重传”算法后添加的,当收到3个重复ACK时,TCP最后进入的不是拥塞避免阶段,而是快速恢复阶段。快速重传和快速恢复算法一般同时使用。快速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,只有当“老”数据包离开了网络后,才能向网络中发送一个“新”的数据包,如果发送方收到一个重复的ACK,那么根据TCP的ACK机制就表明有一个数据包离开了网络,于是cwnd加1。如果能够严格按照该原则那么网络中很少会发生拥塞,事实上拥塞控制的目的也就在修正违反该原则的地方。

具体来说快速恢复的主要步骤是:

1.当收到3个重复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh的值加3,然后重传丢失的报文段,加3的原因是因为收到3个重复的ACK,表明有3个“老”的数据包离开了网络。 

2.再收到重复的ACK时,拥塞窗口增加1。

3.当收到新的数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。

快速重传算法首次出现在4.3BSD的Tahoe版本,快速恢复首次出现在4.3BSD的Reno版本,也称之为Reno版的TCP拥塞控制算法。

      可以看出Reno的快速重传算法是针对一个包的重传情况的,然而在实际中,一个重传超时可能导致许多的数据包的重传,因此当多个数据包从一个数据窗口中丢失时并且触发快速重传和快速恢复算法时,问题就产生了。因此NewReno出现了,它在Reno快速恢复的基础上稍加了修改,可以恢复一个窗口内多个包丢失的情况。具体来讲就是:Reno在收到一个新的数据的ACK时就退出了快速恢复状态了,而NewReno需要收到该窗口内所有数据包的确认后才会退出快速恢复状态,从而更一步提高吞吐量。

SACK就是改变TCP的确认机制,最初的TCP只确认当前已连续收到的数据,SACK则把乱序等信息会全部告诉对方,从而减少数据发送方重传的盲目性。比如说序号1,2,3,5,7的数据收到了,那么普通的ACK只会确认序列号4,而SACK会把当前的5,7已经收到的信息在SACK选项里面告知对端,从而提高性能,当使用SACK的时候,NewReno算法可以不使用,因为SACK本身携带的信息就可以使得发送方有足够的信息来知道需要重传哪些包,而不需要重传哪些包。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拥塞控制域流量控制 的相关文章

随机推荐

  • 学期总结-2018年上

    从现在开始 我需要养成一个写作的好习惯 之所以培养这个习惯 是因为 我开始发现我的一个重大缺陷 语言表达能力的欠缺 这种能力 在一般生活中并不会有太大的作用 而且很多时候 大部分人都体会不到其所带来的 破坏 这种破坏 会让你的交际陷入阻塞
  • 不能向服务器考文件,如何往云服务器考文件

    如何往云服务器考文件 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 无法正常使用Cloud init 弹性云服务器获取M
  • 关于python爬虫逆向RPC的基础使用

    makeRequest function a b c d rpc使用的代码 function 防止重复创建websocket if window flagLX else window weiboLX makeRequest var ws n
  • egg初始化搭建swagger项目

    步骤 安装node 安装你喜欢的编辑器 初始化项目 输入安装 egg 命令 输入安装 egg dev 命令 修改 package json 基本目录结构 需手动创建 输入安装 egg sequelize 命令 数据库选择 配置 sequel
  • Android移动开发-调用摄像头进行拍照的实现

    现在Android智能手机的像素都会提供照相的功能 大部分的手机的摄像头的像素都在1000万以上的像素 有的甚至会更高 它们大多都会支持光学变焦 曝光以及快门等等 下面的程序Demo实例示范了使用Camera v2来进行拍照 当用户按下拍照
  • Windows修改MySQL数据库密码(修改或忘记密码)

    今天练习远程访问数据库时 为了方便访问 就想着把数据库密码改为统一的 以后我们也会经常遇到MySQL需要修改密码的情况 比如密码太简单 忘记密码等等 在这里我就借鉴其他人的方法总结几种修改MySQL密码的方法 我就以实际操作修改root密码
  • Android:安卓学习笔记之MVP模式的简单理解和使用

    Android MVP模式的简单理解和使用 MVP模式 1 为什么使用MVP模式 1 1 实例说明 2 一步步让你理解MVP 2 1 MVP实现第一步 将页面拆分为M V P三个模块 2 2 MVP实现第2步 使用接口通信 进一步解耦 2
  • 高并发中的惊群问题

    目录 1 惊群效应是什么 2 惊群效应消耗了什么 3 惊群的几种情况 3 1 accept惊群 新版内核已解决 3 2 epoll create 在 fork 之前创建 3 3 epoll create 在 fork 之后创建 4 Linu
  • caffe-fast-rcnn 错误解决途径

    CAFFE深度学习交流群 532629018 root ubuntu usr local fast rcnn caffe fast rcnn make j16 CXX src caffe syncedmem cpp CXX src caff
  • Altium Designer修改3D视图时PCB板的颜色

    首先切换到PCB文件下 打开3D预览视图 快捷键为数字3 或者依次点击 视图 切换到3维模式 之后点击 拖拽进度条 或从选颜色即可
  • listbox控件用法详解

    http blog sina com cn s blog 61e2b6280100svtp html 1 属性列表 SelectionMode 组件中条目的选择类型 即多选 Multiple 单选 Single Rows 列表框中显示总共多
  • 数据库系统原理实验(实习)报告——单表查询

    一 实验目的 1 掌握select语句的基本语法和查询条件表示方法 2 掌握数据汇总方法 3 掌握group by子句的作用和使用方法 4 掌握having子句的作用和使用方法 5 掌握order by子句的作用和使用方法 二 实验内容与步
  • 数据结构三大算法(案例解析)

    概述 本文讲述数据结构中最常用到的三大算法 分治法 动态规划法和贪心算法 主要从这些算法的经典案例入手来对算法进行分析和理解 分治法 分治法可以通俗的理解为将一条大鱼分成好几块 分别料理每一块鱼肉 然后再组成一道菜 也就是说分治法是将一个大
  • Cadence17.2 > OrCAD Capture CIS > 设计规则检查(Design Rule Check)DRC学习记录详解

    目录 一 Design Rule Check对话框选项详解 1 Design Rule Options选项详解 2 Electrical Rules 电气规则检查 选项详解 3 Physical Rules 物理规则检查 选项详解 4 ER
  • 并发编程中需要谨记的规则(翻)

    并发编程中需要谨记的规则 最小化临界区 Amdahl定律和Gustafson定律都将并行算法中的顺序执行的工作视为性能问题的头号敌人 两个执行代码区段中间的时间需要顺序执行 这就是众所周知的临界值 在图1 16的分析Gustafson定律的
  • [资源]--IOS捷径大全,众多实用小功能

    一 实用工具 1 支付助手3 0 新 扫一扫 微信扫码 微信收款 支付宝扫码 Apple Pay AA付款 查快递 蚂蚁森林 蚂蚁庄园 彩票 股票 运动 淘票票 乘车码 生活缴费 火车票等等 https www icloud com sho
  • 剑指offer 面试题14- I. 剪绳子 面试题14- II. 剪绳子 II

    动态规划 https leetcode cn com problems integer break solution dong tai gui hua zhi xing yong shi da bai 100 c by 动态规划 class
  • Open3D (C++) 计算点云的均值与标准差

    目录 一 算法原理 二 主要函数 三 代码实现 四 结果展示 一 算法原理 计算给定点云数据x y z坐标各字段的均值和标准差 其中标准差为n 1实现 二 主要函数 getMeanStd const std vector lt float
  • 基于Java的连连看游戏设计与实现(含源文件)

    欢迎添加微信互相交流学习哦 项目源码 https gitee com oklongmm biye 毕业设计 论文 任务书 第1页 毕业设计 论文 题目 基于Java的连连看游戏设计与实现 毕业设计 论文 要求及原始数据 资料 1 简述Jav
  • 拥塞控制域流量控制

    流量控制 也就是管理两端的流量 以免任一方向上因发送过块导致接收端溢出 或者因接收端处理太快而浪费时间的状态 具体包括 1 发送端的进程产生数据很慢 时不时的来个1字节数据 那么TCP就会1字节1字节的发送 效率很低 解决办法是建立一个时基