网络编程5——TCP协议的五大效率机制:滑动窗口+流量控制+拥塞控制+延时应答+捎带应答

news/2024/5/19 3:24:25/文章来源:https://blog.csdn.net/The_emperoor_man/article/details/131622370

文章目录

  • 前言
  • 一、TCP协议段与机制
    • TCP协议的特点
    • TCP报头结构
    • TCP协议的机制与特性
  • 二、TCP协议的 滑动窗口机制
  • 三、TCP协议的 流量控制机制
  • 四、TCP协议的 拥塞控制机制
  • 五、TCP协议的 延时应答机制
  • 六、TCP协议的 捎带应答机制
  • 总结


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下!

本文讲解了TCP在保证安全可靠的前提下,提高效率的五大机制。


一、TCP协议段与机制

TCP协议的特点

特点说明
有连接刻意保存对端的相关信息
可靠传输尽全力将数据传输过去不是百分百成功,自己会知道数据传输是否成功
面向字节流以一个字节为基本单位(一个数据可以分成几份 多次发多次收)
有接收缓冲区,也有发送缓冲区接收缓冲区:接收方用一个特殊的数据结构来组织接收到的数据,使用数据就从接收缓冲区拿,然后接收缓冲区就会删除已经拿走的数据。
发送缓冲区:发送方将要发送的数据存入发送缓冲区,等发送缓冲区满了,才会集中发送一次,可能会导致BUG(数据写到了发送缓冲区而没有发送出去),因此代码中发送数据时尽量刷新缓冲区
大小不受限对于要传输的数据大小没有要求
全双工一条通信路径,双向通信。(可以同时发送和接收数据)

TCP报头结构

在这里插入图片描述

6位标志位
在这里插入图片描述


TCP协议的机制与特性

TCP的协议段格式,比UDP的协议段格式复杂一万倍!😵😵
所以他的机制与功能也比UDP更加强大!!😇😇

TCP对数据传输提供的管控机制,主要体现在两个方面: 安全和效率
这些机制和多线程的设计原则类似: 保证数据传输安全的前提下,尽可能的提高传输效率

TCP协议的机制与特性
1️⃣确认应答
2️⃣超时重传
3️⃣连接管理
4️⃣滑动窗口
5️⃣流量控制
6️⃣拥塞控制
7️⃣延时应答
8️⃣捎带应答
9️⃣面向字节流
🔟异常处理

  • 1️⃣-5️⃣是TCP协议保证数据传输安全的 安全机制 TCP协议的三大安全机制
  • 6️⃣-8️⃣是TCP协议提高传输效率的 效率机制
  • 9️⃣-🔟是TCP协议的 两大特性 TCP协议的两大特性

二、TCP协议的 滑动窗口机制

TCP协议中确认应答机制,对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送下一个数据段。
这样做有一个比较大的缺点,就是性能较差。

在这里插入图片描述

如上图,如果在数据往返的时间较长的时候,等待数据送达后,还要再等待ACK,这一来一返的时间就浪费了,后面要发送的数据全都得等着排队,效率就不高。


因此为了在保证可靠传输的前提下尽可能的提高效率,就引入了 滑动窗口机制

在这里插入图片描述

如上图,规定可以批量传输数据(同时发送多个数据段)。
相当于有一个窗口,窗口里的数据都可以同时发送,这些数据段的大小加在一起等于窗口大小。


假设窗口大小为4000个字节,每条数据段的大小为1000字节。

同时发送4个数据段,然后等待ACK,等到了一个呢,就可以证明有1个大小为1000个字节的数据段,送到了,那么此时就是只有3个数据段,3000个字节大小的数据在发送中。

但是窗口大小为4000个字节,所以我还可以再同时发送1000个字节的数据。窗口向下移动,再发送一个数据大小为1000字节的数据段。

这就是滑动窗口的原理: 规定一个窗口可以同时发送多少数据,当有ACK返回,确定有多少数据送到了,就再发送多少数据,从而达到了提高效率的目的。 规当传输速度足够快时,那么窗口就变成了滑动,因此叫做窗口滑动。


那么如果发生了丢包怎么办?

第一种情况:ACK丢包了

在这里插入图片描述

如上图,前三个ACK都丢包了,那也毫无影响,只要第四个ACK送达了,就没啥,因为ACK中的确认序号就是告诉他,确实序号之前的字节都收到了,因此只要最后一个ACK没丢就没事。

如果是最后一个包丢了,或者是最后几个都丢了,那就会触发超时重传机制。TCP安全第一位


第二种情况:数据丢包了

此时采取的策略为:只重传丢了的数据,不丢的数据不重传。
这个策略也称之为快速重传。

在这里插入图片描述

如上图,第二个数据段丢了,那么 后续所有应答报文中的确认序号就会一直是1001(即索要1001及以后的数据), 不会因为2001-3000送达而改变,会一直保持到1001以后的数据送到。

在这里插入图片描述

主机B当中会有一个接收缓冲区,采用特定的数据结构去组织这些收到的数据, 当1001-2000的数据送达时, 会自动排序调整位置。然后ACK中的确认序号就继续变为4001。

使用数据会从缓冲区当中拿数据,但是如果传输速度太快,那么缓冲区也会满。
如果缓冲区满了,你再发送过来数据,不会阻塞等待而是将你发来的数据直接丢掉,这就造成了效率浪费。


这就引出了另外两个个效率机制:流量控制机制与拥塞控制机制。


三、TCP协议的 流量控制机制

流量控制机制也对保证可靠传输有一定作用。

窗口滑动机制,提高了效率。但是接收缓冲区的空间也有限,如果接收缓冲区满了,那么再传输数据也是丢包,此时还不如传的慢一点。

所以啊就有了流量控制机制。

流量控制机制: 让报文中携带一个"窗口大小"这样的字段,来进行流量控制,只有ACK标志位为1时,即ACK报文才会生效

"窗口大小"的作用:建议发送方的滑动窗口大小(建议不是一定,但是作用也很大)

接收缓冲区满了,即"窗口大小"为0: 发送方暂停发送,每隔一段时间发一个窗口探测报文,如果"窗口大小"不是0了,就继续发送。


四、TCP协议的 拥塞控制机制

一条数据由一台设备发送到另一台设备中,这中间序列经过一系列的中间节点(很多个交换机和路由器)。

如果传输路径上的任何一个节点的发送能力遇到瓶颈(收发数据太多等问题),那么对经过这个节点的数据的传输速率都会产生明显的影响。
即数据传输的快不快,取决于整体路径上最慢的节点(木桶效应)。

拥塞控制: 衡量中间节点(传输路径上发送方与接收方之外的节点)的传输能力,得出一个拥塞窗口大小 ,来避免因为个别节点拉跨而带来的效率浪费。

因为网络环境复杂,每次传输可能走的路径都不同,且各个节点的传输能力也不是一成不变的(用户多时,可能就慢,用户少时,可能就快)。
因此拥塞窗口的计算方法是实验法:通过实验的方式,找到一个合适的发送速率,实现动态平衡。

拥塞窗口的计算方法:
1️⃣:开始时,以一个小速率来传输数据。
2️⃣:如果没有发送丢包,慢慢加快这个速率。
3️⃣:如果出现丢包,立即把速率再减小。
4️⃣:重复2️⃣3️⃣。

感兴趣的朋友可以去搜一下具体的计算方法。

“窗口大小” 取 流量控制(衡量接收方的处理能力) 拥塞控制(衡量中间节点的处理能力) 这两个中最小的那一个。


五、TCP协议的 延时应答机制

延时应答机制:将确认应答机制中的ACK应答报文,延时发送。

为什么延时发送ACK会提高效率呢?

TCP中决定传输效率的关键元素是"窗口大小"。
"窗口大小"取决与流量控制与拥塞控制。
而流量控制就取决于接收方的接收缓冲区。


这里咱们要搞清楚一个事情:
发送方一直发送数据(一直生产),而应用程序一直从接收方的接收缓冲区中读取数据(一直消费)。


如果立刻返回ACK,那么ACK的"窗口大小"假设为n
如果稍微等一会会,那么等的这一会,应用程序就会在这一会中消费一些数据,因此再返回ACK,那么"窗口大小"就大概率会比n大。


所以通过延时一会发送ACK,使得ACK中的"窗口大小"变大一点,传输速率也就快一点。

不是所有的包都可以延迟应答

  • 数量限制:每隔N个包就应答一次(操作系统不同N也各有差异)
  • 时间限制:超过最大延迟时间就应答一次

六、TCP协议的 捎带应答机制

捎带应答机制是基于延时应答机制开发的。

一般客户端服务器模型都是一问一答的形式。 即客户端发送一个请求request,服务器返回一个响应response。

正常流程:

1️⃣客户端向服务器发送一个request。
2️⃣服务器收到reques,并返回一个应答报文ACK
3️⃣服务器返回一个response
4️⃣客户端收到response,并返回一个应答报文

基于延时应答于捎带应答机制:

1️⃣客户端向服务器发送一个request。
2️⃣服务器收到reques(延时应答,让ACK暂缓发送)
3️⃣服务器返回一个 (response+ACK)报文 (如果response在ACK发送前就计算完毕,那么就会触发捎带应答机制,把response与ACK合并)
4️⃣客户端收到(response+ACK)报文,并返回一个应答报文

四次挥手有可能是三次挥手也与上述流程相同。

发送一个一定比发送两个快,所以效率得到了提高。


总结

以上就是今天要讲的内容,本文分享了TCP协议的五大效率机制,讲述了TCP在保证安全可靠的前提下是如何提高效率的,尽管如此,TCP的效率仍然没有UDP快,保证安全可靠必然会牺牲一部分效率。

路漫漫不止修身,也养性。

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

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

相关文章

QT事件处理

设计一个闹钟&#xff0c;定时播报内容。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTimerEvent> #include <QDateTime> #include <QMessageBox> #include <QTextToSpeech> #include <QDebug> namespa…

41. 同时在线人数问题

文章目录 题目需求思路一实现一学习链接题目来源 题目需求 现有各直播间的用户访问记录表&#xff08;live_events&#xff09;如下。 表中每行数据表达的信息为&#xff1a;一个用户何时进入了一个直播间&#xff0c;又在何时离开了该直播间。 现要求统计各直播间最大同时在…

21-注册中心与配置中心Nacos

已经使用过了Spring cloud提供的Geteway、openFeign。 1、注册中心与配置中心 1.1、注册中心 相当于通讯录,让应用之间相互认识。 用途: 实例的健康检查。 路由转发:为了控制成本,会对机器做动态扩容,此时IP就不固定了。 远程调用。 1.2、配置中心 动态修改线上的配…

Java 匿名对象

一、简介 1.1.含义 没有名字的对象 。以常规的创建对象的方法&#xff1a; AtomicInteger atomicInteger new AtomicInteger(100000);格式&#xff1a; 类名 变量名 new 类名(); 这样就完成了对象的创建。注意&#xff1a;&#xff08;&#xff09;内可以无参数&#xff0c…

Zabbix 的使用 续

Zabbix 的使用 续 一、部署 zabbix 代理服务器1.1 环境准备1.2 设置 zabbix 的下载源&#xff0c;安装 zabbix-proxy1.3 部署数据库&#xff0c;要求 MySQL 5.7 或 Mariadb 10.5 及以上版本1.4 导入数据库信息1.5 修改 zabbix-proxy 配置文件1.6 启动 zabbix-proxy1.7 在所有主…

ARM day10 (IIC协议接收温湿传感器数据)

iic.h #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" /* 通过程序模拟实现I2C总线的时序和协议* GPIOF ---> AHB4* I2C1_SCL ---> PF14* I2C1_SDA ---> PF15** */#define SET_SDA_OUT do{…

vue 多环境打包指令配置及编译

1.创建多环境: 在根目录创建.env.xxx文件,如下为例(我创建了两个) 文件内容主要包括&#xff1a; # 页面标题 VUE_APP_TITLE "标题"# 生产环境配置 ENV production# DNA检测仓储管理系统/生产环境 VUE_APP_BASE_API https://xxxxxx 2.设置: 修改根目录下的package…

行业追踪,2023-07-10,汽车零部件如期调整,需要耐心等待第二波

自动复盘 2023-07-10 成交额超过 100 亿 排名靠前&#xff0c;macd柱由绿转红 成交量要大于均线 有必要给每个行业加一个上级的归类&#xff0c;这样更能体现主流方向 rps 有时候比较滞后&#xff0c;但不少是欲杨先抑&#xff0c; 应该持续跟踪&#xff0c;等 macd 反转时参与…

【MATLAB第53期】基于MATLAB的TSK模糊神经网络时间序列预测模型,含短期预测未来功能

【MATLAB第53期】基于MATLAB的TSK模糊神经网络时间序列预测模型&#xff0c;含短期预测未来功能 一、效果展示 二、数据设置 数据采用一列数据滑动窗口设置为5 &#xff0c;可自行设置70%训练30%测试预测未来值为10 &#xff0c;可自行设置&#xff0c;控制10以内 三、模型…

欧科云链联合大湾区警方共话区块链安全

为了应对日益严峻的区块链衍生犯罪&#xff0c;日前欧科云链联合粤港澳大湾区警务人员在深圳开展了为期一天的三地警务研讨会&#xff0c;期间获得包括香港商报、澳门日报、澳门法治报、澳门商报、香港雅虎财经等多家港澳权威媒体的报道&#xff0c;引发三地警务机关的高度关注…

开发实例:实现一个时间轮算法

时间轮算法是一种比较常见的时间计数器算法&#xff0c;它主要用于定时器的处理。在Java开发中&#xff0c;我们可以使用这种算法来实现非常高效且精准的定时器功能。下面&#xff0c;我将为大家介绍一个基于时间轮算法的定时器实现方法。 1、定义时间轮的数据结构 首先&…

【JAVA】JAVA与C++的区别与联系

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言两方介绍CJAVA 不同|Java不支持指针、模板、指针重载、联合等||支持析构函数||条件编译和包含||螺纹支架||默认参数||转到语句||多重继承||异常处理||方法重载和操作符重载|…

Stable Diffusion - 图像控制插件 ControlNet (OpenPose) 配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131591887 论文&#xff1a;Adding Conditional Control to Text-to-Image Diffusion Models ControlNet 是神经网络结构&#xff0c;用于控制预…

【Linux从入门到放弃】进程状态的理解以及什么是僵尸进程和孤儿进程?

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《Linux从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 文…

JavaScrpt_11 Web API 事件流、委托事件、其它事件、元素尺寸与位置

JavaScrpt_11 Web API 事件流、委托事件、其它事件、元素尺寸与位置 前言一、事件流1. 捕获和冒泡2. 阻止冒泡 二、委托事件三、其它事件1. 页面加载事件 2. 元素滚动事件 3. 页面尺寸事件 四、元素尺寸与位置 前言 进一步学习 事件进阶&#xff0c;实现更多交互的网页特效&…

今天分享:智能ai绘画软件哪个好

在一个遥远的未来&#xff0c;艺术界经历了一场革命性的变革。艺术家们不再依赖传统的画笔和颜料&#xff0c;而是转向了ai绘画工具&#xff0c;这是一种集人工智能和创造力于一身的技术。在这个世界中&#xff0c;我有幸遇到了一个与众不同的艺术家&#xff0c;他的名字叫亚历…

第四十三章Java匿名对象

经过前面的学习&#xff0c;我们知道创建对象的标准格式如下&#xff1a; 类名称 对象名 new 类名称(); 每次 new 都相当于开辟了一个新的对象&#xff0c;并开辟了一个新的物理内存空间。如果一个对象只需要使用唯一的一次&#xff0c;就可以使用匿名对象&#xff0c;匿名对…

【Visual Studio】智能提示功能消失解决办法

问题 VS2013环境智能提示突然用不了&#xff0c;重启计算机也无效&#xff0c;一下有点不习惯。 解决方法 1、打开 VS2013开发人员提示。 2、输入一下命令&#xff0c;重置VS2013。 devenv.exe /resetsettings

限制远程访问,保障服务器安全,如何指定某台电脑远程本服务器?

好多人都在问&#xff0c;如何限制某台电脑远程访问本服务器是一个必须要解决的问题。下面&#xff0c;我将为大家介绍几种限制远程访问的方法&#xff0c;帮助大家保障服务器的安全性。 1&#xff0e;修改远程桌面端口号 默认情况下&#xff0c;Windows服务器的远程桌面端口号…

吸烟(抽烟)检测和识别2:Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码)

吸烟(抽烟)检测和识别2&#xff1a;Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码) 目录 吸烟(抽烟)检测和识别2&#xff1a;Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码) 1.吸烟(抽烟)检测和识别 2.吸烟(抽烟)数据集 &#xff08;1&am…