TCP拥塞控制原理

TCP拥塞控制原理TCP拥塞控制原理:TCP使用的是端到端的拥塞控制而不是网络辅助的拥塞控制,因为IP曾不想端系统提供显示的网络拥塞反馈。TCP采用的方法是让每一个发送方根据所感知到的网络拥塞的程度,来限制其能向连接发送流量的速率。这种方法有三个问题: 一个TCP发送方是如何限制向连接发送流量的速率? 一个TCP发送方是如何感知它到目的地之间的路径上存在拥塞的呢?

大家好,又见面了,我是你们的朋友全栈君。

TCP拥塞控制原理:


TCP使用的是端到端的拥塞控制而不是网络辅助的拥塞控制,因为IP层不向端系统提供显示的网络拥塞反馈。

TCP采用的方法是让每一个发送方根据所感知到的网络拥塞的程度,来限制其能向连接发送流量的速率。


这种方法有三个问题:
  <1>一个TCP发送方是如何限制向连接发送流量的速率?
  <2>一个TCP发送方是如何感知它到目的地之间的路径上存在拥塞的呢?
  <3>当发送方感知网络拥塞时,采用什么算法来改变其发送速率的?


对于问题<1>:

  TCP连接的每一端都由一个接收缓存,一个发送缓存和几个变量(LastByteRead,RcvWindow等)组成。TCP拥塞控制机制让连接的每一端都记录一个额外的变量,即拥塞窗口(congestion window)。拥塞窗口表示为congwin,他能限制一个TCP发送方向网络中发送流量的速率。特别是在一个发送方中从未被确认的数据量不会超过congwin与RcvWindow中的最小值,即:LastByteSent-LastByteAcked <= min{congwin, RcvWindow};

上面约束了发送方中未被确认的数量,因此间接地限制了发送方的发送速率。

拥塞窗口(congestion window)指某一源端数据流在一个RTT内可以最多发送的数据包数。发送端根据网络拥塞程度所预设的一个大小值,这个值就是拥塞窗口。


对于问题<2>:

  我们定义一个TCP发送方的“丢包事件”为:要么出现超时,要么收到来自接收方的3个冗余ACK。

当出现过度拥塞时,这条路径上一台(或多台)路由器的缓存会溢出,导致数据报(包含一个TCP报文段)被丢弃。丢弃的数据包会引起发送方的丢失事件(要么超时,要么收到3个冗余ACK),发送方就此认为在源到目的的路径上出现了拥塞指示。


对于问题<3>:

  TCP拥塞控制算法(TCP congestion control algorithm),包含三个部分:1、加性增(additive-increase)、乘性减(multiplicative-decrease)。2、慢启动(slow start)。3、对超时事件做出反应


1、加性增、乘性减(additive-increase multiplicative-decrease,AIMD
  TCP拥塞控制的思想:当出现丢包事件时,让发送方降低其发送速率(通过减小拥塞窗口congwin的大小)。

(因为:通过该相同的拥塞路由器的其他TCP连接也很可能出现丢包事件,所以他们也可能会减小其congwin的值来降低发送速率,因此该整体作用是让所有通过这一拥塞路由器路径的源降低他们向网络发送数据的速率,从而减轻了拥塞路由器的拥塞程度)


但是当出现丢包事件后,TCP发送方应将其拥塞窗口减少多少呢?
  TCP采用一种“乘性减”的方法,即每发生一次丢包事件,就将当前的congwin值减半。但是不能降低到低于1个MSS。


那么当网络无拥塞的时候,即对前面的还没有确认的数据有ACK到达时,他应该怎样来扩大其发送速率?

   增大发送速率的基本原理是:如果没有检测到拥塞,则可能有可用(未使用的)宽带可被该TCP连接使用。这种情况下TCP缓慢地拥塞窗口的长度,谨慎地探测端到端路径上的额外的可用宽带。TCP发送方是这样做的,即每次它接收到一个确认后就把congwin增大一点,其目标是在每个往返时延内congwin增加一个MSS。
总而言之,当TCP发送方感受到端到端路径无拥塞时就加性地增加其发送速率,当察觉到路径拥塞时(通过丢包事件)就乘性地减小其发送速率,因此被称为加性增、乘性减算法


TCP拥塞控制协议的线性增长阶段被称为避免拥塞(congestion avoidance)。congwin值重复地经历一种升降循环,即重复地线性增长,然后又突然降至其当前值的一半(当发生丢包事件时),这种循环是的长寿命TCP连接的congwin变化呈锯齿形状。


             
TCP拥塞控制原理

2、慢启动(slow start,SS):
  当一个TCP连接开始时congwin的值初始设置为1一个MSS,这就使得初始发送速率大约为:MSS/RTT。


  TCP发送方初始阶段不是线性地增加其发送率,而是以指数的速度增加,即每过一个RTT将congwin值翻倍。TCP发送方继续以指数速度增加其发送速率,知道发生一个丢包事件为止,此时congwin将被降为一半,然后再线性地增长,这个被称为慢启动(slow start,SS)的初始化阶段。在慢启动阶段,每过一个RTT,congwin的值将有效地增加一倍。


3、对超时事件做出反应:

  TCP拥塞控制对因超时而检测到的丢包事件做出的反应与因受到3个冗余ACK而检测到的丢包事件做出的反应是不同的。收到3个冗余ACK后,TCP将拥塞窗口减小一半,然后先行地增长。但是超时事件发生时TCP发送方进入一个慢启动阶段,即他将拥塞窗口设置为1MSS,然后窗口以指数速度增长。拥塞窗口持续以指数速率增长,直到congwin达到超时事件前窗口值得一半为止。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152756.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL数据库管理工具_mysql数据库管理工具有哪些

    MySQL数据库管理工具_mysql数据库管理工具有哪些SQLyog管理工具MySQL管理工具通过SQLyog连接MySQL使用SQlyog工具创建数据库MySQL管理工具除了使用命令行来操作MySQL数据库之外,还可以使用图形化管理工具来管理数据。SQLyog是一款简洁高效,功能强大的MySQL数据库管理工具。使用SQLyog可以快速直观地让用户完成对数据库的操作。该工具可从SQLyog官网(http://www.webyog.com/cn/)下载。SQLyog安装过程比较容易,这里不多说。通过SQLyog连接MySQL启动MySQL服务后

    2022年8月22日
    6
  • redis 击穿 穿透_redis穿透击穿雪崩

    redis 击穿 穿透_redis穿透击穿雪崩本文分享自华为云社区《【高并发】什么是缓存穿透?击穿?雪崩?如何解决?》,作者:冰河。缓存穿透首先,我们来说说缓存穿透。什么是缓存穿透呢?缓存穿透问题在一定程度上与缓存命中率有关。如果我们的缓存设计的不合理,缓存的命中率非常低,那么,数据访问的绝大部分压力都会集中在后端数据库层面。什么是缓存穿透?如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。我们可以使用下图来表示缓存穿透的现象。造成缓

    2022年9月14日
    2
  • GSLB相关知识点

    GSLB相关知识点摘要GSLB是GlobalServerLoadBalance的缩写,即全局负载均衡。本文首先介绍了什么是负载均衡SLB,以及为什么要使用SLB。接着引出全局负载均衡GSLB的概念和作用。为此介绍了其基于DNS进行解析和分配负载的实现,包括DNS的原理简介、应用部署中的基本概念、分配负载的决策条件等内容。以外,本文还简单介绍了通过HTTP和IP…

    2022年6月13日
    44
  • orange软件使用[通俗易懂]

    orange做数据分析契机实验手册目录orange软件部分界面展示小试牛刀:数据导入和展示小试牛刀:散点图绘制总结契机今天在上大数据时代实验课,作为一名软件工程专业的大三学生,在上这节公选课之前就决定这节课做完这个学期所有的实验报告,可以说“有亿点”不屑;尤其当老师说Python很麻烦的时候,我更是震惊了,因为我接触过这么多编程语言,Python真的很友好了,很傻瓜,但是当老师打开实验手册的时候,我真香了!!!下面先来看看手册的目录:实验手册目录为什么会真香呢,因为目录里这些有好多机器学习算法!

    2022年4月4日
    677
  • 关于allow_url_fopen的设置与服务器的安全

    关于allow_url_fopen的设置与服务器的安全allow_url_fopen与安全以及PHPlibcurl  allow_url_fopen=ON常常会给服务器和管理员带来麻烦,但是经常性(至少我这样认为)的我们需要远程读取某个东西,如果设置allow_url_fopen=OFF将其关闭,我们就没有办法远程读取。  幸好我们有一个很好的PHP模块–curl。下面我就以一个例子说说我用curl远程读取的方法:  第一,allow_url_fopen=ON的情况下:<?php$str=file_get_contents(“http:

    2022年7月16日
    17
  • tar压缩和解压文件或文件夹

    1. 使用tar压缩文件tar-zcvftest.tar.gz./test/该命令表示压缩当前文件夹下的文件夹test,压缩后缀名为test.tar.gz如果不需要压缩成gz,只需要后缀为tar格式的,那么输入如下命令:tar-cvftest.tar./test/ 2. 使用tar解压文件tar-xzvftest.tar.gz  该命令表示把后缀为….

    2022年4月3日
    88

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号