TCP拥塞控制简单理解

news2025/1/13 10:09:28

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提供了拥塞控制的机制,即保证网络是正常工作的,所以拥塞控制也是保证可靠性的手段。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MT32F006】MT32F006之定时器延时

本文最后修改时间:2023年03月30日 一、本节简介 本文介绍如何使用MT32F006的定时器做us、ms级的延时。 二、实验平台 库版本:V1.0.0 编译软件:MDK5.37 硬件平台:MT32F006开发板(主芯片MT32F006) 仿真器…

【C语言】每日一题(找到所有数组中消失的数字)

找到所有数组中消失的数字,链接奉上。 这里简单说一下,因为还没有接触到动态内存,数据结构,所以知识有限,也是尽力而为,结合题库的评论区找到了适合我的解法,以后有机会,会补上各种…

麻辣烫数据可视化,麻辣烫市场将持续蓬勃发展

麻辣烫,这道源自中国的美食,早已成为人们生活中不可或缺的一部分。它独特的香辣口味,让人忍不住每每流连忘返。与人们的关系,简直如同挚友一般。每当寒冷的冬日或疲惫的时刻,麻辣烫总是悄然走进人们的心房,…

Winload.efi丢失或损坏怎么办?

Winload.efi是一个EFI(或可扩展固件接口)文件。可执行的EFI文件适用于基于计算机系统的UEFI,并将文件加载到计算机引导加载程序的执行任务。它们包含有关操作系统引导过程应如何进行的重要数据。因此,Winload.efi文件对于成功启动…

大数据Flink学习圣经:一本书实现大数据Flink自由

学习目标:三栖合一架构师 本文是《大数据Flink学习圣经》 V1版本,是 《尼恩 大数据 面试宝典》姊妹篇。 这里特别说明一下:《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来, 已经汇集了 好几百题,大量的大厂面试…

第一章 初识Linux(含VMware安装Ubuntu、CentOS、Windows、FinalShell、快照)

目录 一、 课程的介绍  1.为什么要学习Linux  2.课程的安排  3.如何学习Linux 二、操作系统概述  1.学习目标  2.计算机的硬件和软件  3.什么是操作系统  4.常见的操作系统  5.本小节的总结 三、初识Linux  1.学习目标  2.Linux的诞生  3.Linux的内核  …

CentOS下MySQL的彻底卸载的几种方法

这里我为大家详细讲解下“CentOS下MySQL的彻底卸载的几种方法”的完整攻略。 一、关闭MySQL服务 在开始操作之前,需要先关闭MySQL服务。可以使用以下命令来关闭MySQL服务: systemctl stop mysqld 或者 service mysqld stop 二、使用yum命令卸载MySQL…

Oracle的学习心得和知识总结(二十七)|Oracle数据库数据库回放功能之论文一翻译及学习

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

Kotlin开发笔记:集合和逆变协变

Kotlin开发笔记:集合和逆变协变 Kotlin中的集合 基本的集合类型 Kotlin中的集合类型和Java差不多,不过有些在名称上可能有出入,下面是Kotlin中的一些基本集合类型: 类型介绍Pair两个值的元组Triple三个值的元组Array经过索引的…

word内怎么快速选择图片

前一阵子想把图片中央对齐,这就需要一点一点向下划那个滚轮,非常麻烦。 新建个文档演示下: 这样的内容一共有三页。太乱?不我觉得我平时看文献得时候脑子里就是上面这个情况,很有代入感。 选择选择,在左侧出…

QGraphicsView 实例3地图浏览器

主要介绍Graphics View框架&#xff0c;实现地图的浏览、放大、缩小&#xff0c;以及显示各个位置的视图、场景和地图坐标 效果图: mapwidget.h #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QLabel> #include <QMouseEvent> #include <QGraphicsView&…

vue实现文件上传,前后端

前端封装el-upload组件&#xff0c;父组件传值dialogVisible&#xff08;用于显示el-dialog&#xff09;&#xff0c;子组件接收&#xff0c;并且关闭的时候返回一个值&#xff08;用于隐藏el-dialog&#xff09;,最多上传五个文件&#xff0c;文件格式为.jpg\pdf\png <tem…

Redis缓存问题(穿透, 击穿, 雪崩, 污染, 一致性)

目录 1.什么是Redis缓存问题&#xff1f; 2.缓存穿透 3.缓存击穿 4.缓存雪崩 5.缓存污染&#xff08;或满了&#xff09; 5.1 最大缓存设置多大 5.2 缓存淘汰策略 6.数据库和缓存一致性 6.1 4种相关模式 6.2 方案&#xff1a;队列重试机制 6.3 方案&#xff1a;异步更新缓…

Lnton羚通关于Optimization在【PyTorch】中的基础知识

OPTIMIZING MODEL PARAMETERS &#xff08;模型参数优化&#xff09; 现在我们有了模型和数据&#xff0c;是时候通过优化数据上的参数来训练了&#xff0c;验证和测试我们的模型。训练一个模型是一个迭代的过程&#xff0c;在每次迭代中&#xff0c;模型会对输出进行猜测&…

mqtt开关实现

这个项目的主要需求其实并不复杂&#xff0c;只是需要让用户可以在小程序上控制预约后的自习室座位的灯和柜子等的开关。这里的关键是需要通过一个网络应用来转发用户对智能硬件的控制请求。 物联网应用的主要几个难点及对应的思路如下&#xff1a; 通信数据量小、通信环境不…

优酷视频码率、爱奇艺视频码率、B站视频码率、抖音视频码率对比

优酷视频码率、爱奇艺视频码率与YouTube视频码率对比 优酷视频码率&#xff1a; 优酷的视频码率可以根据视频质量、分辨率和内容类型而变化。一般而言&#xff0c;优酷提供了不同的码率选项&#xff0c;包括较低的标清&#xff08;SD&#xff09;码率和较高的高清&#xff08;…

[Openwrt-21.02]MT7981 增加 USB RNDIS功能支持操作说明

环境说明 ubuntu18.04编译环境,openwrt-21.02版本,MT7981开发板 openwrt配置项 make menuconfig配置 ​​ ​​​​​​ 配置后.config配置 CONFIG_PACKAGE_kmod-usb-core=y CONFIG_PACKAGE_kmod-usb-ehci=y CONFIG_PACKAGE_kmod-usb-net=y CONFIG_PACKAGE_kmod-usb-net-…

centOS7.6虚拟机设置桥接方式联网

1、虚拟机设置 设置添加进来的虚拟机&#xff0c;选择“网络适配器”&#xff0c;网络连接方式选择“桥接模式”。点击确定。 2、虚拟网络编辑器设置 VMware中选择编辑中的“虚拟机网络编辑器”&#xff0c;选中桥接模式&#xff0c;“已桥接至”选择当前本机电脑的网络信息。…

百度云BOS云存储的图片如何在访问时,同时进行格式转换、缩放等处理

前言 之前做了一个图片格式转换和压缩的服务&#xff0c;结果太占内存。后来查到在访问图片链接时&#xff0c;支持进行图片压缩和格式转换&#xff0c;本来想着先格式转换、压缩图片再上传到BOS&#xff0c;现在变成了上传后&#xff0c;访问时进行压缩和格式转换。想了想&am…

【java】为什么文件上传要转成Base64?

文章目录 1 前言2 multipart/form-data上传3 Base64上传3.1 Base64编码原理3.2 Base64编码的作用 4 总结 1 前言 最近在开发中遇到文件上传采用Base64的方式上传&#xff0c;记得以前刚开始学http上传文件的时候&#xff0c;都是通过content-type为multipart/form-data方式直接…