【网络原理】TCP协议的相关机制(确认应答、超时重传)

系列文章目录

【网络通信基础】网络中的常见基本概念

【网络编程】Java网络编程中的基本概念及实现UDP、TCP客户端服务器程序(万字博文)

【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法)


文章目录

一、TCP协议的特性

TCP协议段格式

二、TCP协议的相关机制

1. 确认应答

2. 超时重传


一、TCP协议的特性

前面介绍过,TCP(Transmission Control Protocol,传输控制协议)是互联网中的一种有连接的、可靠的、面向字节流、全双工的传输层协议。它是TCP/IP协议族中的一个重要组成部分,用于在网络中可靠地传输数据。

TCP协议是以后工作中最常用到的传输层协议,也是面试最常考的协议,非常非常重要!

TCP协议段格式

TCP协议段(Segment)的格式如下图所示:

301444ec6e994608a0c82b21befa385d.png

由于TCP报头最大长度是60字节,而除选项外,其余报头字段加起来一共是20字节,是固定的。这个选项部分是可选的,因此选项部分为0 ~ 40个字节。

可以看到,TCP报头是比UDP报头复杂很多的。

TCP的内部机制也是很多的,需要了解TCP的这些机制,才能理解报头的含义。

二、TCP协议的相关机制

1. 确认应答

确认应答,可以说是TCP协议用来确保可靠性,最核心的机制。

假设你给“朋友“发了一条短信:

  • 当你发出短信后,你可能会期待朋友收到并回复你,以确认他已经收到了你的短信。如果你很长时间没有收到回复,你可能会怀疑短信没有发送成功(前提是朋友一定会回复你的短信)。
  • 如果朋友此时收到短信,并给你回复了,你看到回复,就可以知道之前发的短信是一定被正确收到了。在这里,朋友的回复就相当于确认应答

再假设,你给“朋友”发了两条短信: 

  • 由于网络传输过程中,经常会出现"后发先至"的情况。导致朋友回复短信的时候,回复短信的顺序和发送短信的顺序是不一致的,就容易发生“答非所问”的情况。

出现后发先至的情况是,由于网络拥塞或者数据包的路由选择引起的。这种情况可能发生在网络中存在多条路径,但是不同路径的延迟不同,导致一些数据包比其他数据包先到达目的地。

为了解决上述问题,TCP就入了序号和确认序号。通过对数据进行编号,应答报文里就告诉发送方,我这次应答的是哪个数据。

而TCP是面向字节流的,以字节为单位进行传输的。因此,TCP的序号和确认序号都是以字节来进行编号的。如下图:

  • 假设载荷有1000个字节,一个载荷就有1000个序号,由于序号是连续的,只需要在报头保存第一个字节的序号即可,后续字节的序号都是很容易计算得到的。
  • 应答报文中的确认序号,是按照发送过去的最后一个字节的序号+1,来进行设定的。

如上图,当发送第一条数据:

  • 数据报头的序号就是1,主机B收到了1 - 1000这些字节数据后,反馈一个应答报文,应答报文中的确认序号的值就是1001

此处1001的含义,有两种理解方式:

  1. 小于1001的数据,都已经收到了.
  2. 发送方接下来要给我发的数据是从1001开始的.

确认应答中,通过应答报文来反馈给发送方,当前的数据正确收到了。应答报文,也叫 ACK 报文,ACK => acknowledge 单词的缩写。

ACK报文也就是TCP报头中六位标志位的第二位。平时该位是0,如果当前报文时应答报文,则这一位就是1.

2. 超时重传

超时重传,可以被视为是确认应答机制的一种补充。

发送方发送数据,如果一切顺利,接收方通过 ACK 标志位就可以告诉发送方,当前数据是否成功收到了。

但是,在某些情况下,1. 如果接收方没有及时发送 ACK 确认,2. 或者数据包丢失(丢包),发送方就无法得知数据是否已成功传输(至于为什么会丢包,这里就不细说了)。这时就需要超时重传来补充确认应答机制。

简单来说:

  • 发送方发了个数据之后,要等待接收来自接收方的ACK确认。
  • 如果等了很久,ACK还没等到,此时发送方就认为数据的传输出现丢包了。
  • 当认为丢包之后,就会把刚才的数据包再传输一次(重传)。
  • 而这个等待的过程有一个时间阈值(定时器),超过等待时间,就是(超时)。

上面的过程,我们认为没收到ACK就是丢包。实际上,超时重传的触发可能不仅是由于数据包丢失导致的,还可能是由于ACK确认丢失导致的。

不论是数据包丢了,还是ACK丢了,从发送方的角度来看,是区分不了的,都是认为ACK没收到。如下图,对比一下这两种情况:

对于ACK丢失而导致的主机B收到很多重复数据这种情况,这里涉及到的内容也很多:

  • TCP socket 在内核中存在接收缓冲区,对于发送方发来的数据,是要先放到接收缓冲区中的。而应用程序调用读方法读数据的操作,其实是读取接收缓冲区的数据。
  • 当数据到达接收缓冲区的时候,接收方首先会判定当前缓冲区是否已经有,或者有过这个数据了。
  • 如果这个数据已经存在或者存在过,TCP就会直接把重复发来的数据丢弃(去重),这样就能确保应用程序,调用读方法的时候,不会出现重复数据了。

※ 接收缓冲区,除了能进行去重之外,还能够进行排序,对收到的数据按照序号进行排序,确保上层应用程序读到的数据和发送的数据顺序是一致的

接收方如何判定这个数据是否是"重复数据"?

核心判定依据:前面谈到的数据的序号。

  1. 数据还在接收缓冲区,还没被读走。此时,拿着新收到的数据的序号,和缓冲区中所有的数据的序号对一下,看看有没有一样的。有一样的就是重复了,就把这个数据丢弃了。
  2. 数据已经不在接收缓冲区,被应用程序读走了。此时,新来的数据序号是无法从接收缓冲区查到的。但是!应用程序读取数据的时候,是按照序号的先后顺序进行读取的。例如,1-1000,1001-2000,2001-3000。一定是先读序号小的,后读序号大的数据。此时, socket api中就可以记录上次读的最后一个字节的序号是多少。比如,上次读到的最后一个字节的序号是3000,新收到的数据的序号是1001,而这个1001一定是之前已经读过了。这个时候同样可以把这个新的数据包判定为“重复数据”直接丢弃了。

上述这些机制,都是TCP内置的,我们在使用TCP的api的时候,不需要考虑这些。但是学习这些能够让我们了解TCP内部做了哪些事情,从而写出更正确的代码。

TCP为了保证较高性能通信,此处的超时重传也不是无限重传,重传过程也是有一定的策略的。

  1. 重传次数是有上限的。如果累计到一定次数,还没有收到ACK,TCP认为网络或者对端主机出现异常,强制关闭连接。
  2. 重传的超时时间也不是固定不变的。随着重传次数的增加,这个超时时间会动态增长。

使用上述策略1的原因:

  • 假设,一次网络通信过程中,丢包的概率是10%(已经是一个很大的数字了),包顺利到达的概率是90%
  • 如果此时重传了一次,两次都丢包的概率只有10% * 10%,即1%;而两次至少有一次传输成功的概率,就是99%
  • 随着重传次数的增加,包能到达接收端的概率也会大大增加,这个概率就非常高了。

如果继续重传,在成功概率这么高的情况下,还是出现丢包的情况,说明当前网络已经出现非常严重的故障了,再重传也意义不大了。因此,就会关闭连接。

使用上述策略2的原因:

结合策略1的分析,数据经过了重传之后还是丢包,大概率是网络出现严重问题了,在没达到重传次数上限之前,重传还是要重传的,但是可以省点力气,少传几次(降低重传频率)。

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

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

相关文章

uniapp制作分页查询功能

效果 代码 标签中 <uni-pagination change"pageChanged" :current"pageIndex" :pageSize"pageSize" :total"pageTotle" class"pagination" /> data中 pageIndex: 1, //分页器页码 pageSize: 10, //分页器每页显示…

第72天:漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

案例一&#xff1a;某 APP-Web 扫描-常规&联动-Burp&Awvs&Xray Acunetix 一款商业的 Web 漏洞扫描程序&#xff0c;它可以检查 Web 应用程序中的漏洞&#xff0c;如 SQL 注入、跨站脚本攻击、身份验证页上的弱口令长度等。它拥有一个操作方便的图形用户界 面&#…

基于yolov5实时实例分割

是一个结合了最新技术进展&#xff08;State-of-the-Art, SOTA&#xff09;的实时实例分割项目&#xff0c;基于著名的YOLOv5目标检测架构&#xff0c;并对其进行扩展以实现对图像中每个对象实例的精确像素级分割。以下是该项目的中文介绍&#xff1a; YOLOv5&#xff1a; YOL…

数据结构八:线性表之循环队列的设计

上篇博客&#xff0c;学习了栈&#xff0c;我们可以知道他也是一种线性表&#xff0c;遵从先进后出的原则&#xff0c;在本节&#xff0c;我们进一步学习另一种线性表—队列。就像饭堂里排队打饭的的队伍&#xff0c;作为一种先进先出的线性表&#xff0c;他又有哪些特别之处呢…

实现Spring底层机制(二)

文章目录 阶段2—封装bean定义信息到Map1.代码框架图2.代码实现1.文件目录2.新增注解Scope存储单例或多例信息Scope.java3.修改MonsterService.java指定多例注解4.新增bean定义对象存储bean定义信息BeanDefinition.java5.修改pom.xml增加依赖6.修改容器实现bean定义信息扫描Sun…

C语言|关于C语言变量的作用域、链接、存储期及相关知识(C多文件编程基础)

文章目录 作用域块作用域(block scope)函数作用域(function scope)函数原型作用域(function prototype scope)文件作用域(file scope)翻译单元和文件(作用域&#xff09; 链接(linkage)存储期(Storege Duration)静态存储期(static storage duration)线程存储期(thread storage …

kafka启动报错(kafka.common.InconsistentClusterIdException)

文章目录 前言kafka启动报错(kafka.common.InconsistentClusterIdException)1. 查找日志2. 定位问题/解决 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不…

qt实现方框调整

效果 在四周调整 代码 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QWidget>class MainWindow : public QWidget {Q_OBJECT public:explicit MainWindow(QWidget *parent 0);~MainWindow();void paintEvent(QPaintEvent *event);void updateRect();void re…

ZYNQ--PL读写PS端DDR数据

PL 和PS的高效交互是zynq 7000 soc开发的重中之重,我们常常需要将PL端的大量数 据实时送到PS端处理,或者将PS端处理结果实时送到PL端处理,常规我们会想到使用DMA 的方式来进行,但是各种协议非常麻烦,灵活性也比较差,本节课程讲解如何直接通过AXI总 线来读写PS端ddr的数据…

什么是基尼系数

基尼系数是国际上用来综合考察居民内部收入分配差异状况的一个重要分析指标。每个人的收入有多有少&#xff0c;差距大时&#xff0c;基尼系数就高&#xff1b;差距小时&#xff0c;基尼系数就低。 一、基本概念 基尼系数表示在全部居民收入中&#xff0c;用于进行不平均分配…

补充centos7软件包的方式/编译安装源码包软件/企业案例/linux进程管理/企业管理进程系列命令(企业经验)--8820字详谈

cenros7软件包的安装方式 软件包分类安装方式优缺点rpm包软件开发商编译打包&#xff0c;安装简单&#xff0c;快速软件版本可能偏低&#xff0c;安装路径是固定好的源码包自己手动编译安装并且复杂软件爸爸随意选&#xff0c;可以定制安装路径二进制包解压就可以使用不能进行…

什么是AIGC技术

AIGC技术&#xff0c;即人工智能全局优化控制技术&#xff0c;是一种将人工智能与全局优化控制方法相结合的技术。它的主要目标是通过智能化的方法来解决复杂系统的优化问题&#xff0c;提高系统的性能和效率。 AIGC技术的主要目标是利用人工智能算法和技术来实现对系统整体的…

第三篇:Python编程基础:掌握核心语法与开发技巧

Python编程基础&#xff1a;掌握核心语法与开发技巧 1 引言 在这个信息化迅速蔓延的世界中&#xff0c;Python语言如同钥匙一般开启了通往各种可能性的大门。无论你是数据科学家、网络工程师、机器学习专家&#xff0c;还是仅仅对自动化办公感兴趣的办公室人员&#xff0c;Pyt…

【Elasticsearch<二>✈️✈️】基本属性概念与MySQL数据库的不同之处

目录 &#x1f378;前言 &#x1f37b;一、Elasticsearch 基本属性 1.1 ES VS MySQL 1.2 ES 属性概念 1.3 ES 的增删改查 &#x1f37a;二、自动补全场景 2.1 场景举例 2.2 使用数据分词器 2.3 查询的流程 2.4 整个查询流程图 &#x1f379;章末 &#x1f378;前言 上次初步…

Zynq 7000 系列中的Interconnect(互联)简介

PS&#xff08;处理器子系统&#xff09;内部的互联结构包含了多个交换机&#xff0c;用于通过AXI点对点通道连接系统资源。这些通道负责在主机和从机客户端之间进行地址、数据和响应事务通信。该互联结构负责管理多个待处理的事务&#xff0c;并且为Arm CPU设计了低延迟路径&a…

UE4_动画基础_FootIK

角色由于胶囊体的阻挡&#xff0c;双脚与地面平行&#xff0c;不会与斜坡、台阶等贴合&#xff0c;有一条腿会处于悬空状态&#xff0c;通过双骨骼IK节点使一只脚太高&#xff0c;让后胶囊体下降&#xff0c;修正双脚的角度。这就是逆向运动IK的方法。 一、新建第三人称模板游戏…

OpenStack云计算(十四)——综合演练手动部署OpenStack,

本项目的项目实训可以完全参考教材配套讲解的详细步骤实施&#xff0c;总体来说实训工作量较大&#xff0c;可根据需要选做&#xff0c;重点观看配套的微课视频。 项目实训一 【实训题目】 搭建OpenStack云平台基础环境 【实训目的】 掌握OpenStack基础环境的安装和配置方…

CTFshow-PWN-栈溢出(pwn36)

存在后门函数&#xff0c;如何利用&#xff1f; 好好好&#xff0c;终于到了这种有后门函数的了 checksec 检查一下&#xff1a; 32 位程序&#xff0c;RELRO 保护部分开启 RWX: Has RWX segments 存在可读可写可执行的段 使用 ida32 看 main 函数 跟进 ctfshow 函数…

C++系列-命名空间

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 命名空间 在C/C中&#xff0c;变量&#xff0c;函数和后面要学到的类都是大量存在的&#xff0c;这些变量&#xff0c;函数和类的名称都存在于全局作用域中&#xff0c;可能会导…

电机入门1

文章目录 122.12.22.3 33.13.23.33.4 1 2 2.1 电机板 驱动板电机分类 驱动器分类 转速 转向扭矩定时器 ADC 2.2 PID 自动控制 的核心闭环控制算是 PID的应用 2.3 无刷电机用的 可大大提高其控制效率 和控制精度 3 开发板的IO 电流太小了 20~25ma 电机要A 驱动板 信号放大没舵…