异常网络下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报文段是否真的丢失。
具体的做法是当发送端连续收到三个重复的确认报文段 就认为是拥塞发生。就会启动快速重传和快速恢复算法来吃处理拥塞
过程如下:
- 当收到三个重复的确认报文的时候 按照

来计算ssthresh,然后立刻重传丢失的报文段
并按照

来设置CWND - 每次收到一个重复的确认的时候 ,设置CWND=CWND+SMSS。 此时发送端可以发送新的TCP报文段。如果新的CWND允许的话
- 当收到新的数据确认的时候 设置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文件,帮助大学选题。赠送开题报告模板ÿ…...
揭秘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随着农业科技的不断进步,太阳能风吸式杀虫灯作为一种新兴的绿色农业技术,正逐渐走进人们的视野。这种集太阳能和风吸技术于一体的杀虫设备,不仅具有环保节能的特点,还能有效减少农药使用,提高农产品质量…...
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), 其它别…...
Qt将Unicode转换成UTF8中文
解析字符串,并将里面的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 多部分对象集合类型,这个类型 http 指南里有讲到:MIME 中的 multipart(多部分)电子邮件报文中包含多个报文,它们合在一起作为单一的复杂报文发送…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
