TCP协议报文,核心特性可靠的原因,超时重传详细介绍

news2024/12/23 15:43:18

目录

一、TCP协议

二、TCP核心特性的保障

三、保留的六位标志位对于应答报文的作用

四、如何处理丢包——超时重传的原理

五、超时重传的时间


一、TCP协议

每一行是四个字节,前面的20个字节是固定的(TCP最短长度,20字节,选项部分:有/无都行,当然了你有多个也行)

4bit表示的范围0——15 此处的单位是4字节🌸 ,所以要把这里的数值*4,才是真正的报头长度TCP,最大的长度60字节。

保留六位的六个标识位:resvered设计TCP大佬比设计UDP的大佬,留个心眼,虽然现在不用,但是先占有个位置,后面可能需要用(目前TCP这么多年大概不用了 🌸 )

二、TCP核心特性的保障

TCP核心特性:有连接,可靠传输,面向字节流,全双工
可靠传输:内核实现的可靠传输,写代码的时候,感知不到(人本身就是这么设计,让感知成本,使用成本降低)🌻

网络传输中:常常会遇到那种后发先至(当连续发送多条信息的时候)🌻

网络上从A到B中间路径有很多(初心,冗余,让他不怕核弹这种,一个弹过来影响通讯)

比如:舔狗狗哥舔女神

问女神吃不吃麻辣烫呀?愿不愿意做我女朋友啊?

女神先回我:好的好的。😃 滚一边去,下头男啊🌚🌚🌚

结果后发先至,😍虽说没有吃麻辣烫,但是做我女朋友也挺好。(🤠小丑)。

另外每个节点/路由器/交换机/繁忙程度不一样,此时,这样的转发过程,也会存在差异。

那么我们该怎么办呢?

针对数据进行编号

TCP是面向字节流,不是按照条为单位进行传输的。

确认应答的意思,假如说应答下一个数据1001,就说明(1-1000)之前的数据全收到了,下面该从1001开始发。

1.针对字节进行编号的,而不是针对条

2.应答报文也是要和收到的数据序号相关联而不是相等。

只要知道这一串字节的开始编号,以及数据的长度,每个字节的编号也就知道了,TCP报头中,把这一串字节的编号表示出来,再结合报文长度,此时每个字节编号就都确定了。

编号也就是那个32位序号

32位确认序号——这个字段是给应答报文使用的,假如超越了32位,就开始从头计算,4个字节->42亿9千万,4个G,一般也不会一口气传4G

三、保留的六位标志位对于应答报文的作用

保留的六位具体是

那么对于应答报文是怎么样呢🐳🐳

ACK为0,表示这是一个普通报文,此时只有32位序号,是有效的

ACK为1,表示这是一个应答报文,这个报文的序号和确认序号都是有效的->确认报文的序号和正常报文,之间没有关联关系,各自论各自的,序号是你自己的主机发送的数据进行编号。

数据1-1000,序号1,长度1000,确认序号无意义,ACK为0

下一个返回确认报文1001,序号未知,假设是100(这个序号根发送序号没啥关系),长度不知道,确认序号是1001,ACK是1->应答报文可能携带载荷,也可能没有。

下一个传输应答的时候,应答是应答的序号,与发送的序号无关,上个应答序号是100,这个应答报文就应该是101,序号未知。

确认应答,是TCP保证->IP协议的报头中,可以知道载荷多长的,IP载荷长度——TCP报头长度->TCP载荷长度

如果设备过于繁忙,后来新来的等待的太久,就可能会被丢弃,越忙越容易丢包。

面对丢包,我们的应对机制是什么呢?,难道丢包就不可靠了吗?

四、如何处理丢包——超时重传的原理

这个问题最大的就是:无法区分是哪种情况,既然无法区分,那就都重新传输呗。但是也不能随意去重啊。你想想一个问题,你转50块钱,就算你没收到,我发出去了啊,我再发一个50,那不就亏了50嘛(任何问题一用钱💰🤬🤬考虑都好过分)接收方收到数据之后,需要对数据进行呢去重,把重复的数据丢弃掉,保证应用程序,调用inputStream的时候,读到的不会出现重复,如何进行去重?如何高效判定当前数据是否重复,直接使用TCP的序号,来作为判定依据

->TCP在内核中,给每个socket对象都安排一个内存空间,相当于一个队列,也称为“接收缓冲区”,收到的数据,都会被放到缓冲区里,并且按照序号排列,已经排好序了。

(这里又是一个生产者消费者模型,收到数据,接收的网卡,把数据放到对应socket的接收缓冲区内核中)

应用程序,调用read,就是从这个接收缓冲区中,消费数据,当数据被read走后,就可以从队列中删除掉了(read有两种模式,读到就删除,也可以读到不删除)-》接收缓冲区,数据按照序号有序排列~队列队首序号已经超过了新收到的这个数据的序号,新收到的序号在之前被读过了

以下是去重的思想:假如给B发一条序号为100,B成功收到消息后,并返回101作为确认,然后确认的消息发生了丢包,你不知道消息是否到达,所以你进行了重新发送,序号仍为100,确保B能正常接收,但是由于B之前已经读完了那个主机A的内容,所以他会帮你进行一个去重(注意不是根据内容去重的哈🌝🌝)

后发先至的这个问题,是根据序号重新排列的过程,因此应用程序不必考虑数据传输先后的顺序问题。

五、超时重传的时间

为啥我们重新传输的时候就能够传过去呢?(这就如同电脑重启,丢包的本质是概率问题)重传的次数增加,总体传输的成功概率也就越大,高中算数,一个丢包0.1概率,连着丢10的概率很低的。

超时时间当然也不是一个固定的值,(这段时间一直传不过去,就不传了这种),是会随着超时轮次的增加,进一步增加

随着转轮次数的增加,等待时间也会越来越长,当前认为,正常情况下,第二次重新传输有极大情况,重传成功,如果很多次都不成功,那就有可能当前的网络有故障。

超时重传的轮次也不是无限的,重新传输到一定次数,会重置TCP连接。使用复位报文

TCP复位报文

RST,那个六位里面的

RST为1,表示一个复位报文-》除非严重的故障,复位操作也无法成功,最后只好放弃连接。

确认应答是TCP可靠最核心的机制

超时连接是TCP可靠性的有效补充

下一篇更屌,面试最常考的就是我的下一章,等我

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

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

相关文章

进制和编码

目标:了解计算机中一些必备的尝试知识,了解常见名词背后的意义 1.python的运行方式 交互式运行脚本式运行 2.进制 2.1 进制的转换 计算机中底层的所有数据都是0101010101的形式存在的 八进制无法直接转为2进制 十进制转其他进制 bin(25) # 10进制转…

[XSCTF]easyxor

查看,main函数,首先是将输入的数据与key中的字符依次异或 在这个循环里,将异或得到的结果每次减去1,同时在数组里写上1,往后遍历数组 直到异或得到的结果减为0,在数组中写一个0进行标记 最后比较数组是否与…

百度飞桨(厦门)人工智能产业赋能中心签约,共创人工智能产业协同服务新生态...

9月8日,第二十三届中国国际投资贸易洽谈会在厦门正式开幕。 当日,厦门市思明区政府和火炬管委会,与百度正式签约,联手共建百度飞桨(厦门)人工智能产业赋能中心。思明区委书记林重阳,厦门市工信局…

【 NTR-domain ;NTR-C345C】

tissue inhibitors of metalloproteases (TIMP) TIMP NTR-C345C HPX-binding-domain [ MMP CAT(FN2)PEX (hemopexin) ] [ MMP-9-inhibitor a-2M (NTR-C345C) ] netrin Laminin-GLaminin-EGFNTR-domain

软件测试报告有什么用?

报告类型 不同的报告类型有不同的报告用途,以下分类别进行分析 1、登记测试报告 可以用于软件产品的增值税即征即退、软件企业的双软评估以及计算机系统集成资质的材料 2、鉴定\确认测试报告 可以用用于政府项目申报、高新认证、项目结题、创新产品认定、各类政…

c++11 override 和 final 关键字

1. final:修饰虚函数,表示该虚函数不能再被重写 如果一个类不想被继承:下面分别提供了c98 和 c11的不同写法 c 98 的写法: c 11 的写法:final最终类 2. override: 检查派生类虚函数是否重写了基类某个虚函数&#xff…

机器学习——K最近邻算法(KNN)

机器学习——K最近邻算法(KNN) 文章目录 前言一、原理二、距离度量方法2.1. 欧氏距离2.2. 曼哈顿距离2.3. 闵可夫斯基距离2.4. 余弦相似度2.5. 切比雪夫距离2.6. 马哈拉诺比斯距离2.7. 汉明距离 三、在MD编辑器中输入数学公式(额外&#xff0…

C++数据结构X篇_11_C++栈的应用-后缀表达式求解

上篇C栈的应用-中缀转后缀中我们介绍了我们所熟知的中缀表达式转为后缀表达式,那么如何通过后缀表达式获得原表达式的值呢?本篇将会参考博文栈的应用-后缀表达式求解介绍计算机是如何基于后缀表达式计算的? 文章目录 1. 后缀表达式求解计算规…

【MySQL】一文带你理解索引事务及其原理

MySQL- 索引事务 文章目录 MySQL- 索引事务索引操作索引原理 事务操作并发执行 索引 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。 通俗来…

C++项目实战——基于多设计模式下的同步异步日志系统-④-日志系统框架设计

文章目录 专栏导读模块划分日志等级模块日志消息模块日志消息格式化模块日志消息落地模块日志器模块日志器管理模块异步线程模块 模块关系图 专栏导读 🌸作者简介:花想云 ,在读本科生一枚,C/C领域新星创作者,新星计划导…

新知同享 | Web 开发性能提升,优化体验

更加强大且开放的 Web 可以简化开发工作并支持 AI 一起来看 2023 Google 开发者大会上 Web 开发值得重点关注的升级与成果 了解 Web 如何实现加速开发,更加便捷 精彩大会现场一览 Web 开发不断发展,每年都带来性能提升和功能迭代,开启丰富多…

【多线程】volatile 关键字

volatile 关键字 1. 保证内存可见性2. 禁止指令重排序3. 不保证原子性 1. 保证内存可见性 内存可见性问题: 一个线程针对一个变量进行读取操作,另一个线程针对这个变量进行修改操作, 此时读到的值,不一定是修改后的值,即这个读线…

用python实现基本数据结构【01/4】

说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…

Linux 下spi设备驱动

参考: Linux kernel 有关 spi 设备树参数解析 Linux kernel 有关 spi 设备树参数解析 - 走看看 Linux SPI驱动框架(1)——核心层 Linux SPI驱动框架(1)——核心层_linux spi驱动模型_绍兴小贵宁的博客-CSDN博客 Linux SPI驱动框架(2)——控制器驱动层 Linux SPI驱…

如何进行SEO优化数据分析?(掌握正确的数据分析方法,让您的网站更上一层楼!)

在互联网时代,SEO优化已经成为了每一个网站运营者必备的技能。而在SEO优化中,数据分析更是至关重要的一环。在本文中,我们将会详细介绍如何正确的进行SEO优化数据分析,让您的网站更上一层楼! 数据分析的重要性 数据分…

ROS2-IRON Ubuntu-22.0 源码下载失败解决方法 vcs import --input

ROS2 一.ROS2 IRON环境搭建1.设置系统字符集为UTF-82.将RO2 apt 库添加到系统中3.添加ROS2 GPG key4.添加ROS 2 的软件源安装开发工具 二.下载ROS2sh源代码编译 一.ROS2 IRON环境搭建 虚拟机系统:Ubuntu22.04 虚拟机:VMware-player-full-16.2.5-2090451…

YOLOv5算法改进(15)— 更换Neck之AFPN

前言:Hello大家好,我是小哥谈。在YOLOv5中添加AFPN(Adaptive Feature Pyramid Network)可以提高目标检测的准确性。AFPN是一种用于目标检测任务的功能增强模块,它能够自适应地融合来自不同层级的特征图,以提…

scss文件自动导入

正常使用scss文件,需要先导入再使用内部变量,自动导入可以免除手动导入的步骤,直接使用内部的变量。 步骤:装包 -> scss文件 -> 配置 1. 装包 npm i sass -D // -D 仅在开发环境中依赖 2. 新增一个 scss文件&#xff…

设计模式之单列模式

单列模式是一种经典的设计模式,在校招中最乐意考的设计模式之一~ 设计模式就是软件开发中的棋谱,大佬们针对一些常见的场景,总结出来的代码的编写套路,按照套路来写,不说你写的多好,至少不会太差~ 在校招中…

Java的环境配置

目录 window系统安装java下载JDK配置环境变量JAVA_HOME 设置PATH设置CLASSPATH 设置测试JDK是否安装成功 Linux,UNIX,Solaris,FreeBSD环境变量设置流行JAVA开发工具使用 Eclipse 运行第一个 Java 程序 window系统安装java 下载JDK 首先我们…