热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TCP实现原理(拥塞控制)

一、拥塞控制原理简介由于IP层不向端系统提供显式的网络拥塞反馈,所以TCP的拥塞控制必须使用端到端的拥塞控制而不是网络辅助的拥塞控制。其所采用的方法是让每一个发送方

一、拥塞控制原理简介

由于IP层不向端系统提供显式的网络拥塞反馈,所以TCP的拥塞控制必须使用端到端的拥塞控制而不是网络辅助的拥塞控制。其所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。如果一个TCP发送方感知到从它到目的地之间的路径上没有什么拥塞,则TCP发送方增加其发送速率;如果发送方感知沿着该路径有拥塞,则发送方就会降低其发送速率。这种方式需要解决三个问题:


  • 一个TCP发送方如何限制它向其连接发送流量的速率?
  • 一个TCP发送方如何感知从它到目的地之间的路径上存在拥塞?
  • 当发送方感知到端到端的拥塞时,采用何种算法来改变其发送速率?

首先分析一下TCP发送方是如何限制其向连接发送流量的:

TCP连接的每一端都是由一个接收缓存、一个发送缓存和几个变量(LastByteRead、rwnd)组成。运行在发送方的TCP拥塞控制机制跟踪一个额外的变量:拥塞窗口(congestion window)。拥塞窗口表示为cwnd,它对一个TCP发送方能向网络中发送流量的速率进行了限制。特别是,在一个发送方中未被确认的数据量不会超过cwnd与rwnd中的最小值,即:

LastByteSent−LastByteAcked<&#61;min∣cwnd,rwnd∣LastByteSent-LastByteAcked<&#61;min|cwnd,rwnd|LastByteSentLastByteAcked<&#61;mincwnd,rwnd

我们假设TCP的接收缓存足够大&#xff08;忽略流量控制的影响&#xff09;&#xff0c;因此在发送方中未被确认的数据仅受限于cwnd。同时假设发送方总是有数据要发送&#xff0c;即在拥塞窗口中的所有报文段要被发送。此时上面的约束限制了发送方中未被确认的数据量&#xff0c;因此间接地限制了发送方的发送速率。

为了理解这一点&#xff0c;我们考虑一个丢包和发送时延均可以忽略不计的连接。此时在每个往返时间&#xff08;RTT&#xff09;的起始点&#xff0c;上面的限制条件允许发送方向该连接发送cwnd个字节的数据。在该RTT结束时发送方接收对数据的确认报文。因此&#xff0c;该发送方的发送速率大概是cwnd/RTT字节/秒。通过调节cwnd的值&#xff0c;发送方因此能调整它向连接发送数据的速率。

接下来考虑TCP发送方是如何感知在它与目的地之间的路径上出现了拥塞&#xff1a;

我们将一个TCP发送方的“丢包事件”定义为&#xff1a;要么出现超时&#xff0c;要么收到来自接收方的3个冗余ACK。当出现过度的拥塞时&#xff0c;在沿着这条路径上的一台&#xff08;或多台&#xff09;路由器的缓存会溢出&#xff0c;引起一个数据报&#xff08;包含一个TCP报文段&#xff09;被丢弃。丢弃的数据报接着会引起发送方的丢包事件&#xff08;要么超时或收到3个冗余ACK&#xff09;&#xff0c;发送方就认为在发送方到接收方的路径上出现了拥塞的指示。

考虑了拥塞检测问题后&#xff0c;我们接下来考虑网络中没有拥塞这种更为乐观的情况&#xff0c;即没有出现丢包事件的情况&#xff1a;

在此情况下&#xff0c;在TCP的发送方将收到对于以前从未确认报文段的确认。TCP将这些确认的到达作为一切正常的指示&#xff0c;即在网络上传输的报文段正被成功地交付给目的地&#xff0c;并使用这个确认来增加窗口的长度&#xff08;及其传输速率&#xff09;。注意如果确认以相当慢的速率到达&#xff08;例如&#xff0c;如果该端到端路径具有高时延或包含一段低宽链路&#xff09;&#xff0c;则该拥塞窗口将以相当慢的速率增加。在另一方面&#xff0c;如果确认以高速率到达&#xff0c;则该拥塞窗口将会更为迅速的增大。

有了通过调节cwnd值以控制发送速率的机制&#xff0c;关键的问题仍然存在&#xff1a;

TCP发送方怎样确定它“最佳”的发送速率呢&#xff1f;如果众多TCP发送方总体上发送太快&#xff0c;它们能够拥塞网络&#xff0c;导致拥塞崩溃。然而&#xff0c;如果TCP发送方过于谨慎、发送太慢、它们不能充分利用网络的带宽&#xff1b;这就是说&#xff0c;TCP发送方能够以更高的速率发送而不会使网路拥塞。那么TCP发送方如何确认它们的发送速率&#xff0c;既使得网络不会拥塞&#xff0c;与此同时又能充分利用所有可用的带宽&#xff1f;TCP通过下列机制解决这些问题&#xff1a;


  • 一个丢失的报文段意味着拥塞&#xff0c;因此当丢失报文段时应当降低TCP发送方的速率。 一个超时事件或四个确认&#xff08;一个初始ACK和三个冗余ACK&#xff09;被解释为报文段的丢失。从拥塞控制的观点看&#xff0c;此时TCP发送方应考虑如何减少它的拥塞窗口长度&#xff0c;即减少发送速率&#xff0c;以应对这种推测的丢包事件。
  • 一个确认报文段指示该网络正在向接收方交付发送方的报文段&#xff0c;因此&#xff0c;当对先前未确认报文段的确认到达时&#xff0c;能够增加发送方的速率。 确认的到达被认为是一切顺理的隐含指示&#xff0c;即报文段正从发送方成功地交付给接收方&#xff0c;因此该网络不拥塞。拥塞窗口长度因此能够增加。
  • 带宽检测。 知道了给定ACK指示源到达目的地路径无拥塞&#xff0c;而丢包事件指示路径拥塞后&#xff0c;TCP调节其传输速率的策略就是增加其速率以响应到达的ACK&#xff0c;而当出现丢包事件时减少传输速率。因此&#xff0c;为了检测出拥塞开始出现的速率&#xff0c;TCP发送方会持续增加它的传输速率&#xff0c;出现了丢包指示&#xff08;探测到了拥塞&#xff0c;此时的速率就是拥塞开始速率&#xff09;后速率后退&#xff0c;进而再次开始探测&#xff0c;查看拥塞开始速率是否发生了变化。注意到网络中没有明确的拥塞状态指令&#xff0c;而是将ACK和丢包事件视为隐式信号&#xff0c;并且每个TCP发送方根据异步于其他TCP发送方的本地信息而行动。

二、拥塞控制算法

TCP拥塞控制算法包括三个主要部分&#xff1a;


  1. 慢启动
  2. 拥塞避免
  3. 快速恢复

其中慢启动和拥塞避免是TCP的强制部分&#xff0c;而快速恢复是推荐部分&#xff0c;对TCP的发送方并非是必须的。


2.1 慢启动

当一条TCP连接开始时&#xff0c;cwnd的值通常设置为一个MSS&#xff08;较小值&#xff09;&#xff0c;这就使得初始发送速率大约为MSS/RTT。由于对于TCP的发送方而言&#xff0c;可用带宽可能比MSS/RTT大得多&#xff0c;TCP发送方希望迅速找到可用带宽的数量。因此&#xff0c;在慢启动状态&#xff0c;cwnd的值以1个MSS开始并且每当运输的报文段首次被确认就增加一个MSS。如下图的例子所示&#xff1a;
在这里插入图片描述
有几种结束指数增长的方式&#xff1a;


  • 如果存在一个由超时指示的丢包事件&#xff08;拥塞&#xff09;&#xff0c;TCP发送方将cwnd设置为1并重新开始慢启动过程。它还将第二个状态变量的值ssthresh&#xff08;“慢启动阈值”的速记&#xff09;设置为cwnd/2&#xff0c;即当检测到拥塞时将ssthresh设置为拥塞窗口值的一半。
  • 第二种方式是直接与ssthresh的值相关联。因为当检测到拥塞时ssthresh设置为cwnd值的一半&#xff0c;每当达到或超过ssthresh的值时&#xff0c;继续使cwnd翻番可能有些鲁莽。因此&#xff0c;当cwnd的值等于ssthresh时&#xff0c;结束慢启动并且TCP转移到拥塞避免模式。
  • 最后一种结束慢启动的方式是&#xff0c;如果检测到3个冗余ACK&#xff0c;这时TCP执行一种快速重传并进入快速恢复状态。

2.2 拥塞避免

一旦进入拥塞避免状态&#xff0c;cwnd的值大约是上次遇到拥塞时的值的一半。因此&#xff0c;TCP不应该再每过一个RTT就将cwnd的值翻番&#xff0c;此时TCP采用了一种较为保守的方法&#xff0c;每个rtt只将cwnd的值增加一个MSS。

在拥塞避免状态下&#xff0c;每个丢包事件&#xff08;由超时或者三个冗余ACK来指示&#xff09;都指示了应该结束拥塞避免的现性增长&#xff1a;


  • 当出现超时时&#xff0c;cwnd的值被设置为1个MSS&#xff0c;同时ssthresh的值被更新为cwnd值的一半
  • 当出现三个冗余ACK时&#xff0c;因为网络能继续从发送方向接收方交付报文段&#xff0c;因此TCP对这种丢包事件的行为&#xff0c;相比于超时应该更“宽容”&#xff1a;此时TCP将cwnd的值减半&#xff0c;将ssthresh的值记录为cwnd值的一半&#xff0c;接下来进入快速恢复状态。

下图指示了出现超时事件时cwnd的变化&#xff1a;
在这里插入图片描述


2.3 快速恢复

发送方一旦收到3个重复确认&#xff0c;就知道现在只是丢失了个别的报文段&#xff0c;于是不启动慢开始算法&#xff0c;而执行快速恢复算法。

快速恢复是TCP推荐的而非必须的构件。一种称为TCP Tahoe的TCP早期版本&#xff0c;不管是发生超时指示的丢包事件&#xff0c;还是发生3个冗余的ACK指示的丢包事件&#xff0c;都无条件地将其拥塞窗口减至1个MSS&#xff0c;并进入慢启动阶段。TCP的较新版本TCP Reno&#xff0c;则引入了快速恢复的机制。

快速恢复有两种实现方式&#xff0c;第一种是发送方将ssthresh值和拥塞窗口cwnd调整为当前窗口的一半&#xff0c;并开始执行拥塞避免算法&#xff1b;第二种实现方式是把快速恢复开始时的拥塞窗口cwnd的值再增大一些&#xff0c;即等于新的ssthresh&#43;3&#xff0c;这是因为既然发送方收到三个重复的确认&#xff0c;就表明有三个数据报文已经离开了网络&#xff1b;这三个报文段不再消耗网络资源而是停留在接收方的接收缓存中&#xff1b;可见现在网络中不是堆积了报文段而是减少了三个报文段&#xff0c;因此可以适当把拥塞窗口扩大一些。

下图演示了Reno版TCP与Tahoe版TCP的拥塞控制窗口的演化情况。在该图中&#xff0c;阈值初始等于8个MSS&#xff0c;在前8个传输回合&#xff0c;Tahoe和Reno采取了相同的动作。拥塞窗口在慢启动阶段以指数速度快速爬升&#xff0c;在第4轮传输时到达了阈值。然后拥塞窗口以线性速度爬升&#xff0c;直到在第8轮传输后出现了3个冗余ACK。注意到该丢包事件发生时&#xff0c;拥塞窗口值为12MSS。于是ssthresh的值被设置为0.5cwnd&#61;6*MSS。在TCP Reno下&#xff0c;拥塞窗口被设置为cwnd&#61;9MSS&#xff0c;然后线性地增长。在TCP Tahoe下&#xff0c;拥塞窗口被设置为1个MSS&#xff0c;然后呈指数增长&#xff0c;直至到达ssthresh值为止&#xff0c;在这个点它开始线性增长。
在这里插入图片描述


推荐阅读
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
author-avatar
深圳市互联网大会
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有