TCP拥塞控制简单理解

1.TCP的控制机制

  • 序号

TCP通过序号可以实现一下几个功能:

1.确认应答处理。发送端收到接收端的确认应答,可以得知某些数据包被接收端接收了

2.顺序控制。接收端可以利用序号对接收到的报文进行排序

3.重发控制。如果发送端没有收到确认应答,那么就会进行数据重发

4.重复控制。如果接收到多次收到同一个序号的报文,则选择不接受该报文

  • 超时重传

超时重传是TCP确保可靠性的一部分机制,它的作用是对丢失的报文进行重发。

超时重传的规则如下:

如果接收端发送了一个报文之后,一定时间后并没有收到确认应答,则说明发送的报文丢失,进行重传。

这个时间间隔不是固定的,而是根据RTT(报文的往返时间)确定的,通常超时时间间隔会设置的比RTT稍微大一些。

  • 连接管理

TCP通过三次握手建立连接、四次挥手断开连接。 

  • TCP以段为单位发送数据

虽然TCP是面向字节流的协议,但这并不意味着它的报文长度没有限制。

TCP的报文长度(段大小)通常为MSS(最大消息长度)。MSS的确认过程如下:

MSS在TCP三次握手时确定。

因为通信的两端可能所处的网络不同,所以MTU也不同(最大传输单元),所以传输层发送的数据最好不要超过MTU,否则就会触发IP层的分片和重组机制(这个机制是不好的)。

所以在TCP三次握手时,通信双方交换自己的MTU,发送端选择两个MTU当中的最小值作为MSS,所以传输层的每一个报文的最大长度不能超过MSS。

  • 滑动窗口

滑动窗口提高了TCP的传输效率和速度。

它的原理如下:

发送端发送一个报文后需要等待确认应答的到来,如果这个时间段内什么也不做那将是一种资源浪费。所以TCP提供了滑动窗口的机制,使得在等待确认应答的事件段内能够发送其他的报文。

  • 流量控制

流量控制可以避免网络资源浪费。流量控制与滑动窗口配合使用。

它的使用机制如下:

上面提到了滑动窗口,它的功能是利用等待确认应答的时间来发送更多的数据。那么发送多少数据就是由流量控制机制来控制的。

在TCP通信中,无论是什么TCP报文,都会带有接收端的接收窗口大小。发送端根据这个接收窗口大小来确认滑动窗口的大小,从而保证发送端发送的数据接收端一定能接收,从而避免网络资源浪费(发送的数据接收端接收不了而丢弃掉,不就是浪费网络资源了么)。

  • 拥塞控制

本篇文章的主题,马上开始介绍。

2.拥塞控制

拥塞控制主要解决网络拥堵的问题。因为在真实的网络通信当中,有非常多的主机在同时使用网络,但是其中的某一主机并不知道其他主机发送了多少数据,如果当前主机一次性发送了海量的数据,则非常有可能造成网络崩溃甚至是瘫痪。

那么TCP就提供了拥塞控制的机制来避免这样的情况发生。 

拥塞控制当中有一个概念叫做拥塞窗口,简单理解成是跟滑动窗口一样的东西。

数据发送的大小取决于拥塞窗口和滑动窗口的最小值。

试想这么一种情况,连接刚建立,那么接受端的接收窗口是非常大的,那么发送端会一次性发接收窗口大小那么多的数据吗?当然不可能啦,突然发送非常大的数据会造成什么影响上面已经介绍过了。

所以拥塞控制当中有一个叫做慢启动的机制,它的作用就是让TCP慢慢的发送数据。它的规则如下:

一开始的拥塞窗口为1MSS,也就是一开始只能发送1MSS数据大小的报文。随后每收到一个确认应答,拥塞窗口的大小就+1。

举个例子,一开始发送一个报文,收到一个确认应答,那么拥塞窗口就扩大为2MSS。随后发送两个报文,收到两个确认应答,然后拥塞窗口扩大为4MSS。随后发送四个报文,收到四个确认应答,然后拥塞窗口扩大为8MSS......以此类推。

从上面的规则来看,发送端能发送的数据呈指数级增长(但是要注意实际发送的数据为min(拥塞窗口,接收端窗口))。

发送的数据越多越容易造成网络拥堵,随机出现丢包的现象,最后触发超时重传。触发超时重传之后,可以得到慢启动阈值,这个阈值就是当前一次性发送的数据大小(假设为8MSS)。

因为发生了超时重传,那么慢启动阈值就会减半,即从8MSS降低为4MSS。然后又开始慢启动发送数据。

这里补充一条规则,即当拥塞窗口的大小超过了慢启动阈值,数据的发送只能呈线性增长。这个过程叫拥塞避免。

当前的慢启动阈值为4MSS,拥塞窗口为1MSS,所以它会重复上面的慢启动过程。直到拥塞窗口大于等于慢启动阈值,然后进入拥塞避免状态,发送的数据大小只能线性地、慢慢地增长。那么随着数据发送的慢慢增多,可能会出现一小部分的丢包现象,这个时候接收端会发送3次重复的确认应答以通知发送端有数据丢包了。

但是因为丢包的数据仅仅是一小部分,所以慢启动阈值又会减半。但是因为是接收到3次重复的确认应答,没有触发超时重传,所以拥塞窗口被设置为慢启动阈值+3。然后开始拥塞避免、发送数据。这个过程叫做高速重传

如果在数据发送的过程中,又接收到了3次重复的确认应答,那么就继续做上面的动作。如果触发了超时重传机制,那么就要重新设置慢启动阈值,慢启动阈值就是触发超时重传的拥塞窗口大小的一半,然后又开始慢启动。

可以画一幅图来描述拥塞控制的过程:

简单的总结这个过程,连接刚建立之后不能直接发送大量数据,而是通过慢启动由少到多的发送数据,最后会因为发送过量数据而导致超时重传,可以得出慢启动阈值应当设置为引发超时重传的拥塞窗口的一半,然后进行慢启动,然后当拥塞窗口超过慢启动阈值的时候进入拥塞避免,随后如果收到了重复的确认应答就会触发高速重传,高速重传会重置慢启动阈值但是不会执行慢启动。

拥塞控制有点像发送端在慢慢吞噬整个网络一样,如果吞噬失败了就从头再来。

3.总结

TCP依靠序号、确认应答、滑动窗口、超时重传、流量控制等手段来确保通信过程的可靠性(可靠性就是确保数据的完整、按序、准确)。

拥塞窗口主要解决网络的问题,但正是因为TCP提供了拥塞控制的机制,即保证网络是正常工作的,所以拥塞控制也是保证可靠性的手段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/79395.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue项目引入antDesignUI组件

快速安装ant-design-vue并配置,vue2.0 antDesign1.7.8 第一步:安装ant-deisgn-vue 1.7.8 npm install ant-design-vue1.7.8 --save第二步:配置package.json文件,将依赖写入后,npm install 安装依赖 "dependenc…

智慧建筑工地平台,通过信息化技术、物联网、人工智能技术,实现对施工全过程的实时监控、数据分析、智能管理和优化调控

智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本&#xf…

Maven官网下载配置新仓库

1.Maven的下载 Maven的官网地址:Maven – Download Apache Maven 点击Download,查找 Files下的版本并下载如下图: 2.Maven的配置 自己在D盘或者E盘创建一个文件夹,作为本地仓库,存放项目依赖。 将下载好的zip文件进行解…

react 生命周期方法

组件的生命周期 每个组件都包含 “生命周期方法”,你可以重写这些方法,以便于在运行过程中特定的阶段执行这些方法。你可以使用此生命周期图谱作为速查表。在下述列表中,常用的生命周期方法会被加粗。其余生命周期函数的使用则相对罕见。 挂…

LLM - 大模型评估指标之 BLEU

目录 一.引言 二.BLEU 简介 1.Simple BLEU 2.Modified BLEU 3.Modified n-gram precision 4.Sentence brevity penalty 三.BLEU 计算 1.计算句子与单个 reference 2.计算句子与多个 reference 四.总结 一.引言 机器翻译的人工评价广泛而昂贵,且人工评估可…

Spark第三课

1.分区规则 1.分区规则 shuffle 1.打乱顺序 2.重新组合 1.分区的规则 默认与MapReduce的规则一致,都是按照哈希值取余进行分配. 一个分区可以多个组,一个组的数据必须一个分区 2. 分组的分区导致数据倾斜怎么解决? 扩容 让分区变多修改分区规则 3.HashMap扩容为什么必须…

Jetpack Compose:探索声明式UI开发的未来

Jetpack Compose:探索声明式UI开发的未来 1. 引言 在移动应用开发领域,用户界面(UI)开发一直是开发过程中的关键挑战之一。传统的UI开发方式往往涉及大量繁琐的布局代码、手动管理状态和事件处理,不仅容易引发错误&a…

linux第三阶段--第三方软件(一)MySQL的概述和二进制安装(官网版)

MySQL介绍及安装 一、MySQL概述 DB2 POSTGRE-SQL 1、关系型数据库与非关系型数据库 RDBMS(relational database management system),既关系型数据库管理系统。 简单来说,关系型数据库,是指采用了二维表格来组织数…

Vue 项目运行 npm install 时,卡在 sill idealTree buildDeps 没有反应

解决方法:切换到淘宝镜像。 以下是之前安装的 xmzs 包,用于控制切换淘宝镜像。 该截图是之前其他项目切换淘宝镜像的截图。 切换镜像后,顺利执行 npm install 。

TDD(测试驱动开发)?

01、前言 很早之前,曾在网络上见到过 TDD 这 3 个大写的英文字母,它是 Test Driven Development 这三个单词的缩写,也就是“测试驱动开发”的意思——听起来很不错的一种理念。 其理念主要是确保两件事: 确保所有的需求都能被照…

Python查找交作业人数

写在前面: 利用Python统计文件数量,能够高效快捷地收集作业! 一、问题:获取test文件夹下的所有文件 二、Python中os.listdir()函数的用法 (一)os.listdir()函数的基本用法 os.listdir()函数的基本语法如…

【Realtek sdk-3.4.14b】RTL8197F+RTL8812F欧洲屏蔽5G天气雷达信道DFS信道120、124、128方法

需求描述 对于欧洲国家来说,默认支持DFS信道,但是有三个信道比较特殊,是天气雷达信道,如下图所示120、124、128,天气雷达信道有个特点就是在信号可以发射之前需要检测静默15min,如果信道自动选择到了天气雷达信道,就会有15min的时间无法连接到WiFi热点,严重影响用户体验…

Java接口压力测试—如何应对并优化Java接口的压力测试

导言 在如今的互联网时代,Java接口压力测试是评估系统性能和可靠性的关键一环。一旦接口不能承受高并发量,用户体验将受到严重影响,甚至可能导致系统崩溃。因此,了解如何进行有效的Java接口压力测试以及如何优化接口性能至关重要…

【数学建模】-- 数学规划模型

概述: 什么是数学规划? 数学建模中的数学规划是指利用数学方法和技巧对问题进行数学建模,并通过数学规划模型求解最优解的过程。数学规划是一种数学优化方法,旨在找到使目标函数达到最大值或最小值的变量取值,同时满足…

代码随想录—力扣算法题:707设计链表.Java版(示例代码与导图详解)

版本说明 当前版本号[20230818]。 版本修改说明20230818初版 目录 文章目录 版本说明目录707.设计链表思路获取链表第index个节点的数值在链表的最前面插入一个节点在链表的最后面插入一个节点在链表第index个节点前面插入一个节点删除链表的第index个节点 单链表角度总结 7…

构建可远程访问的企业内部论坛

文章目录 前言1.cpolar、PHPStudy2.Discuz3.打开PHPStudy,安装网页论坛所需软件4.进行网页运行环境的构建5.运行Discuz网页程序6.使用cpolar建立穿透内网的数据隧道,发布到公网7.对云端保留的空白数据隧道进行配置8.Discuz论坛搭建完毕 前言 企业在发展…

PK Nounique CASCADE DROP INDEX keep index

Explicit Control Over Indexes when Creating, Disabling, or Dropping PK/Unique Constraints (Doc ID 139666.1)​编辑To Bottom PURPOSEIn Oracle 9i, the DBA has an explicit control over how indexes are affectedwhile creating, disabling, or dropping Primary Ke…

分类预测 | MATLAB实现GWO-BiGRU-Attention多输入分类预测

分类预测 | MATLAB实现GWO-BiGRU-Attention多输入分类预测 目录 分类预测 | MATLAB实现GWO-BiGRU-Attention多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.GWO-BiGRU-Attention 数据分类预测程序 2.代码说明:基于灰狼优化算法(GW…

Redis——hash类型详解

概述 Redis本身就是键值对结构,而Redis中的value可以是哈希类型,为了区分这两个键值对,Redis中的键值对是key-value,而value中的哈希键值对则是field-value,其中value必须是字符串 下面介绍一些Redis的hash类型的常用…

归并排序 与 计数排序

目录 1.归并排序 1.1 递归实现归并排序: 1.2 非递归实现归并排序 1.3 归并排序的特性总结: 1.4 外部排序 2.计数排序 2.1 操作步骤: 2.2 计数排序的特性总结: 3. 7种常见比较排序比较 1.归并排序 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种…