当前位置: 首页 > news >正文

异常网络下TCP的可靠服务机制(慢启动、拥塞避免、快重传、快恢复)

目录

  • TCP超时重传
  • 拥塞控制
    • 概述
    • 慢启动和拥塞避免
      • 下面讲解发送端如何判断拥塞发生。
    • 快速重传和快速恢复

本文描述TCP在异常网络下的处理方式 以保证其可靠的数据传输的服务

TCP超时重传

tcp服务能够重传其超时时间内没有收到确认的TCP报文段,tcp模块为每一个报文段都维护一个重传定时器,定时器在第一次TCP报文段发送的时候启动,如果超时事件内没有收到回复。Tcp模块就会重传该报文段并重置定时器

至于下次重传的事件 和最多的重传次数 就是重传策略的选择。
liunx内核有两个重要的内核参数和tcp超时重传相关:
/proc/sys/net/ipv4/tcp_retries1
/proc/sys/net/ipv4/tcp_retries2
前者指定了底层IP接管TCP最少执行的重传次数 ,默认3
后者指定连接放弃前TCP最多可以执行的重传次数 默认15(一般对应13 - 30min)
虽然超时会导致TCP报文段重传,但是tcp报文段的重传可以发生在超时之前,即快速重传。

拥塞控制

概述

拥塞控制的目的是

  • 提高网络利用率
  • 降低丢包率
  • 保证网络资源对每条数据流的公平性

拥塞控制标准文档是RFC 5861 四个部分:

  • 慢启动(slow start)
  • 拥塞避免(congestion avoidance)
  • 快速重传(fast retransmit)
  • 快速恢复(fast recovery)
    拥塞控制算法在liunx上 有多种实现,比如reno算法,vegas算法和cubic算法等。它们或者部分或者全部实现了上面上述四个部分.
    /proc/sys/net/ipv4/tcp_congestion_control 文件指示机械当前所使用的拥塞控制算法
    在这里插入图片描述
    在发送端一次向网络中连续写入的数据量(收到其中第一个数据的确认之前) 我们称为SWND(Send Window 发送窗口) 发送端最终以TCO的报文段来发送内容 所以SWND限定了发送端能发送的TCP报文段的数量。
    TCP报文段的最大长度(数据部分) 被称为SMSS(Sender MAximum Segment Size ,发送者最大段的大小) 其值一般等于MSS
    MSS的值通常是由MTU(Maximum Transmission Unit,最大传输单元)减去IP首部长度(20字节)和TCP首部长度(20字节)得到的。因此,如果MTU值为1500字节,那么MSS的值一般就是1460字节)。
    发送端需要合理的选择SWND的大小 ,如果SWND太小会引起明显的网络延迟 反之如果太大则会导致网络拥塞。
    接收方虽然可以通过RWND来控制发送端的SWND,但是显然不够
    发送端引入了一个称为拥塞窗口的状态变量(CWND) 实际的SWND值 是RWND和CWND里面的较小者
    下图显示了拥塞控制的输入和输出
    在这里插入图片描述

慢启动和拥塞避免

Tcp创建好连接后 CWND的值被初始化为IW(initial Window ) 其大小为2~4个SMSS。但新的Liunx内核提高了该值的初始化,以减少传输滞后。
发送端最多可以发送IW字节的数据 ,此后发送端没收到一个及手段的确认。其CWND就按格式增加


cwnd +=min(N,SMSS)
(读者在其他地方也可以看到了 cwnd是直接加上一个SMSS的值的 这个我不太清 查资料没查到 欢迎指正)

其中的N表示 此次确认中包含之前未被确认的字节数。
这样CWND将会按指数的形式扩大,这就慢启动。
慢启动算法的理由是,TCP模块刚开始发送数据并不知道网络的实际情况,需要一种探测的方式平滑的增加CWND的小事。
如果不是家其他手段 慢启动必然会使得 CWND很快膨胀最终导致网络拥塞。因此TCP拥塞控制汇总顶一个另一个重要的状态变量:
慢启动门限(ssthresh) 当CWND的大小超过该值的时。TCP拥塞控制将进入拥塞避免阶段。


拥塞避免算法是的CWND按照线性的方式增加 从而减缓起扩大.RFC 5681中提到了如下两种实现方式:

  • 每个RTT时间内按照格式从新计算新的CWND,不论RTT事件内收到了多少个确认
  • 没收到一个新的数据确认报文段,就按照下面公式来更新CWND
  • CWND +=SMSS*SMSS/CWND

下图粗略描述了慢启动和拥塞避免发生的时机和区别。 假设ssthresh的大小是16SMSS大小 实际远不止这么大
在这里插入图片描述
以上是发送端在未检测到拥塞时所采取的积极避免拥塞的方法。
下面介绍拥塞发生时(可能在慢启动 也可能在拥塞避免阶段) 拥塞控制的行为。

下面讲解发送端如何判断拥塞发生。

  • 传输超时,或者TCP重传定时器溢出
  • 接受到重复的确认报文段
    拥塞控制对第一种情况仍然使用慢启动和拥塞避免。
    第二种情况使用快速重传和快速恢复(如果真的发生拥塞的话)。
    第二种情况如果发生在第一种情况之后也就是重传定时器溢出,也会被拥塞控制当成第一种情况来对待。
    如果发送端检测到拥塞发生是由于传输超时 它就会执行重传并做出一下调整
    在这里插入图片描述
    其中FlightSize是已经发送但是没有收到确认的字节数。这样调整 CWMD将小于SMSS。必然也小于新的慢启动门限值ssthresh
    拥塞控制一定会再次进入慢启动阶段

快速重传和快速恢复

有时发送端可能接收到重复的确认报文段,如TCP报文段丢失 或者接收端收到乱序的TCP报文段并重排的时候,拥塞控制算法需要判断当收到重复确认的报文。网络是否真的拥塞 或者TCP报文段是否真的丢失。
具体的做法是当发送端连续收到三个重复的确认报文段 就认为是拥塞发生。就会启动快速重传和快速恢复算法来吃处理拥塞
过程如下:

  1. 当收到三个重复的确认报文的时候 按照
    在这里插入图片描述
    来计算ssthresh,然后立刻重传丢失的报文段
    并按照
    在这里插入图片描述
    来设置CWND
  2. 每次收到一个重复的确认的时候 ,设置CWND=CWND+SMSS。 此时发送端可以发送新的TCP报文段。如果新的CWND允许的话
  3. 当收到新的数据确认的时候 设置CWND = ssthresh(ssthresh是新的慢启动的门限值)由第一步计算得到
    快速重传和快速恢复完成之后 拥塞控制将恢复的拥塞避免阶段 这一点由第3 步可以知道

相关文章:

异常网络下TCP的可靠服务机制(慢启动、拥塞避免、快重传、快恢复)

目录 TCP超时重传拥塞控制概述慢启动和拥塞避免下面讲解发送端如何判断拥塞发生。 快速重传和快速恢复 本文描述TCP在异常网络下的处理方式 以保证其可靠的数据传输的服务 TCP超时重传 tcp服务能够重传其超时时间内没有收到确认的TCP报文段,tcp模块为每一个报文段都…...

PL/SQL执行.sql文件

1.编写.sql文件,创建update.sql文件,文件如下: set feedback off set define off --更新表中所有人的年龄 update a set age18; prompt Done. 2.打开plsql选择命令窗口,即选择File->New->Command Window; 打…...

赋能中国制造,大道云行发布智能制造分布式存储解决方案

《中国制造2025》指出,“制造业是国民经济的主体,是立国之本、兴国之器、强国之基。” 智能制造引领产业提质增效 智能制造是一种利用先进的信息技术、自动化技术和智能技术来优化和升级制造业生产过程的方法。它将人工智能、大数据、物联网、机器学习等…...

MySQL Strict Mode is not set for database connection ‘default‘

在使用 DJango 框架执行迁移文件的命令时,可以看到出现如下警告: (ll_env) D:\workspace\workspace-mengll\learning-log>python manage.py migrate System check identified some issues: WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set …...

分享:大数据信用报告查询的价格一般要多少钱?

现在很多人都开始了解自己的大数据信用了,纷纷去查大数据信用报告,由于大数据信用与人行征信有本质的区别,查询方式和价格都不是固定的,本文就为大家详细讲讲大数据信用报告查询的价格一般要多少钱,希望对你有帮助。 大…...

tomcat下载安装配置教程

tomcat下载安装配置教程 我是使用tomcat下载安装及配置教程_tomcat安装-CSDN博客 此贴来进行安装配置,原文21年已经有些许不同。 下载tomcat 官网:http://tomcat.apache.org/ 我们老师让安装8.5以上,所以我直接选择版本9 点击9页面之后…...

GO—变量

Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。 我们从计算机系统的角度来讲,变量就是一段或者多段内存,用于存储数据 1.1 标准格式 var 变量名 变量类型 1 …...

【计算机毕业设计】044学生管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…...

揭秘App访问量背后的秘密:数据统计与分析

在移动互联网时代,App已成为人们日常生活的重要组成部分。对于App运营者来说,了解用户的访问量、行为习惯等数据至关重要。本文将深入探讨如何精准统计App访问量,为运营者提供有价值的数据支持。 一、App访问量统计的重要性 访问量是衡量A…...

Qt 样式表

Qt样式表可以在帮助文档中搜索 "Qt Style Sheets" 在帮助文档中可更详细的查阅相关资料。 通常情况下我们需要知道样式表中的各个样式,需要我们查阅官方文档的相关资料; 可以在帮助文档中搜索 "Qt Style Sheets Reference&quo…...

leetcode hot100 每日温度

在本题中,我们是通过单调栈来解决的,因为我们采用了栈的数据结构,并且,栈内存储的元素是单调的。 本题我们考虑,将气温数组元素的下标存入栈中,首先初始化要把0放入,0是下标的意思。然后我们拿…...

【Java EE初阶二十六】简单的表白墙(二)

2. 后端服务器部分 2.1 服务器分析 2.2 代码编写 2.2.2 前端发起一个ajax请求 2.2.3 服务器读取上述请求,并计算出响应 服务器需要使用 jackson 读取到前端这里的数据,并且进行解析: 代码运行图: 2.2.4 回到前端代码,处理服务器返回的响应…...

【wpf】关于绑定的一点明悟

背景简介 软件功能为,读取一个文件夹下的所有子文件夹,每个文件夹对自动对应生成 一组 “按键四个勾选” 按键点击触发,可以发送与其对应文件夹中的一些内容。这个绑定的过程我在之前的文章有过详细的介绍,非常的简单。 这里回顾…...

叠罗汉游戏

题目描述 农场的N头奶牛喜欢玩叠罗汉游戏,就是几头奶牛1头奶牛接着1头奶牛的站成一柱子形状。不过奶牛的力量不一样,用数值Ci表示第i头奶牛它的上面最多可以站多少头奶牛,问这些奶牛最少可以站成几个柱子形状。 输入格式 输入文件名&#…...

太阳能风吸式杀虫灯是什么

TH-FD1随着农业科技的不断进步,太阳能风吸式杀虫灯作为一种新兴的绿色农业技术,正逐渐走进人们的视野。这种集太阳能和风吸技术于一体的杀虫设备,不仅具有环保节能的特点,还能有效减少农药使用,提高农产品质量&#xf…...

SpringBoot启动扩展应用:干预优化+加快启动时间

一、SpringBoot启动配置原理简述 本内容直接查看分析SpringBoot启动配置原理,传送门: 二、SpringBoot启动过程干预 Spring Boot启动过程中我们可以实现以下干预工作: 修改Spring Boot默认的配置属性。使用ConfigurationProperties和Enable…...

探索Linux世界:初次接触和基本指令(文件操作)

文章目录 1.基本介绍和准备2.基本指令和Linux的基本操作3.几个重要基本指令3.1 ls - 列出文件和目录3.1.1文件的知识3.1.2 .和..文件 3.2pwd - 显示当前工作目录3.2.1路径知识 3.3 cd - 切换目录3.4 touch - 创建文件或更新时间戳3.5mkdir - 创建新目录3.6rm - 删除文件或目录3…...

递归函数(c++题解)

题目描述 对于一个递归函数w(a, b, c)。 如果a < 0 or b < 0 or c < 0就返回值1。 如果a > 20 or b > 20 or c > 20就返回W(20,20,20)。 如果a < b并且b < c 就返回w(a, b, c − 1) w(a, b − 1, c − 1) − w(a, b − 1, c)&#xff0c; 其它别…...

Qt将Unicode转换成UTF8中文

解析字符串&#xff0c;并将里面的Unicode转换成中文 QString unicodeToUtf8(QString unicode) {QString result;for (int i 0; i < unicode.length(); i){QString flag unicode.mid(i,2); if (flag "\\u"){QString s1 unicode.mid(i 2, 4);result.append(s…...

HTTP 的 multipart 类型

上一篇文章讲到 http 的 MIME 类型 http MIME 类型 里有一个 multipart 多部分对象集合类型&#xff0c;这个类型 http 指南里有讲到&#xff1a;MIME 中的 multipart&#xff08;多部分&#xff09;电子邮件报文中包含多个报文&#xff0c;它们合在一起作为单一的复杂报文发送…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...