【计算机网络】TCP原理 | 可靠性机制分析(一)

news2024/10/3 8:20:38

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【网络编程】【Java系列】
本专栏旨在分享学习网络编程、计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌

目录

  • 一、UDP协议
    • UDP协议特性
    • UDP协议端格式
  • 二、TCP协议
    • TCP协议头格式
  • 三、TCP协议可靠性分析
    • 确认应答机制
    • 超时重传机制

一、UDP协议

UDP协议特性

  • 无连接:知道对端的IP和端口号就可以直接进行传输,不需要进行连接。
  • 不可靠:发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
  • 面向数据报:应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并(比如发送端一次性接收100个字节,那么接收端也必须一次性接收100个字节)。

UDP协议端格式

UDP协议端格式即UDP协议报文格式。

在这里插入图片描述

在这里插入图片描述

  • UDP的校验和如何实现:是通过CRC校验算法来进行实现的,即将数据报中的每个字节进行累加,传输数据的时候将数据和校验和一并发送出去;接收方接收到的校验和我们视为旧校验和,而接收方受到的数据将每个字节累加后得到的结构视为新的校验和。当数据相同时,校验和一定相同;校验和不同时,数据一定不同,但是校验和相同时数据不一定相同(工程上不考虑,因为概率太小了,可以忽略不计)。最后,如果数据出错的话,UDP的做法是直接丢弃掉,如果你想让对方重新发一遍数据的话,哈哈,对不起,UDP协议做不到(TCP就可以做到,这也算是TCP协议可靠性的一种体现把)!!!

二、TCP协议

TCP协议头格式

下面是TCP协议头格式的图片:
在这里插入图片描述

  • 端口号:属于传输层,知道了端口号之后才能进一步确定数据要交给哪个应用程序。端口号的范围依然是0-65535,0-1024端口号在这里依然存在。
  • 首部长度:TCP首部长度字段的最小值是5,最大值是15,单位是字节;所以首部长度字段的最小字节是4*5=20字节,最大字节为15*4=60字节。另外TCP报头长度是可变长的,TCP报头长度的最短长度是20字节,选项部分可有可无,可以有一个选项,也可以有多个选项,选项的存在与否就影响到了4位首部长度最终是几,最终通过4位首部长度可以确定选项到哪里结束,数据从哪里开始(即我们需要通过首部长度来确定载荷数据是从哪里开始,报头是从哪里结束的)。
  • 6位保留位:保留位是为了以后协议的发展保留的,目前它们的值必须被设置为0(保留位就是为了将来对TCP协议进行升级留下了空间,但是就目前来看大概率是用不到了)。
  • 16位校验和同UDP协议中的校验和是一个意思,用于确保数据传输的正确性。

在这里插入图片描述
上图表示6个标志位,每个标志位是1bit,表示非常重要的含义。

  • 32位序号:每个数据报文段(segment)都会包含一个 TCP 报文头和数据载荷,而TCP 数据报中载荷数据的第一个字节的序号存储在 32 位序号字段(Sequence Number)中。
  • 32位确认序号:确认序号的数值就是收到的最后一个字节的编号+1(在 TCP 数据传输过程中,接收方收到发送方发送的每个数据报文段,会对其进行确认,确认号就是接收方期望接收的下一个字节的序号。)
  • 六位标志位之ACK:当ACK为0的时候只有32位序号是有效的,32位确认序号是无效的;当ACK为1的时候,32位序号和32位确认序号都是有效的。

三、TCP协议可靠性分析

  • 面向连接:TCP在数据传输前要建立连接,数据传输后要释放连接,因此是一种面向连接的传输协议。

  • 面向字节流:TCP像一个字节流一样传输数据,以字节流位单位进行读写,应用程序可以将数据分割成任意大小的段,不同的数据段会拼成一个完整的数据流。

  • 全双工:TCP的一个连接,既有发送缓冲区,也有接收缓冲区,那么对于这一个连接,既可以读数据,也可以写数据。

  • 确认应答机制:TCP协议的可靠性最核心的机制就是确认应答。

确认应答机制

确认应答:简单理解就是A给B发送了一个消息,但是A不能确定B是否收到了自己发送的消息,B如果收到了A发送的消息后就可以给A发送一个消息说我收到了,此时A就可以确定B已经接收到了自己的消息。
后发先至:在数据传输的过程中,一个数据报是先发送出去的,另一个数据报是后发送出去的,但是最终结果是后发出去的数据报反而优先到达目的地(这里两个数据报的目的地都相同)。
后发先至产生的原因:假设现在有两个数据报,都是从出发地A到达目的地B,但是两个数据报走的路线是可以有很多种的,另外每个节点(路由器/交换器)的繁忙程度是不一样的,所以就有可能出现后发先至的情况。
如何解决后发先至的情况:针对数据进行编号,比如发送消息1、发送消息2、应答1、应答2,通过这种方式就可以避免消息发送错乱的情况。TCP是面向字节流的,并没有一条一条这样的概念,所以当然不能以条作为传输单位,所以这里的编号是根据字节来进行编号的,另外应答报文要和收到的消息相关联。如下图所示:
在这里插入图片描述
在这里插入图片描述

如何确定每个字节的编号:
我们只需要知道这一串字节的第一个字节的编号以及报文长度,此时每个字节的编号自然也就能够确定了(载荷长度在TCP中是感知不到的,但是在IP报头中可以感知到)。

超时重传机制

超时重传确认应答是保证TCP传输数据可靠性的核心机制。但是由于丢包问题可能收不到应答,等待一定时间后如果还收不到数据包,此时就需要考虑到重新将数据包进行传输,我们称之为超时重传

超时重传分为两种情况:第一种情况是发的消息本身丢包了;另外一种情况是应答报文丢包了。发送方是无法区分到底是哪种情况的。
情况1:消息本身丢包
在这里插入图片描述
情况2:应答报文丢包
在这里插入图片描述
既然发送方针对丢包情况无法区分具体是哪一种情况,所以发送方的做法是重传。
第一种情况如果重传并没有什么太大的问题;但是如果是第二种情况的话,发送方就会出现同一条数据包发送了两次的重复传送(即同一个消息发送了两遍)的现象。
所以接收方的做法是:接收方收到数据之后会对数据进行去重(即将重复的数据去除掉),以保证应用程序调用inputStream.read的时候读到的数据不会重复
那如何对数据进行去重呢:可以TCP的序号来作为判定条件,TCP会在内核中给每个socket对象安排一个内存空间,相当于一个队列,我们称之为接收缓冲区,作用是把接收到的数据都放到内存缓冲区中,并且按照序号排列好顺序(这里其实相当于一个生产者消费者模型:当接收方收到数据后,接收方的网卡会把数据放到对应的socket的接收缓冲区中。当应用程序调用read的时候,此时就会从接收缓冲区中进行数据的消费)。我们知道接收缓冲区中数据的序号是有序排列的,如果队列队首元素的序号已经超过了新收到的这个数据的序号,说明新收到的这个数据的序号对应的数据已经被读取过了。
当read被调用来读取数据的时候,有两种模式,一种模式是读到数据后就删除(这是默认模式),另一种模式就是读到数据后不对数据进行删除。
队列中是数据的序号是有序排列的,正因为是有序排列,所以也解决了数据后发先制的情况,因此应用程序就不用担心数据传输的先后顺序问题。

现在来看下一个问题,即为什么数据重传时就一定能够保证数据一定能够传过去呢:这是个概率问题,本来丢包概率就已经很小了,连续丢包的概率就更小了,总体数据传输成功就好即可。

超时等待时间是多久呢:这里的等待时间是可以进行手动设置的,随着超时轮次的增加,超时时间是不断增加的(随着超时轮次的增加,超时时间会越来越长)。这里解释下为什么随着超时轮次增加超时时间会越长呢,既然超时重传好几次都不成功的话,那可能网络是有故障的,之所以拉长了超时的时间间隔就是为了给网络恢复留下了一定的时间。当然超时轮次不是无限的,超时轮次到了一定次数之后,如果一直重传不成功的话就会放弃重传,此时就会重置TCP连接,复位TCP报文(六个标志位中有个标志位是RST,为1表示是一个复位报文)

复位报文:
如果发送方连续重传了一定次数(通常是超过一定阈值),但仍然没有收到接收方的任何响应,这可能意味着连接发生了某种异常,无法继续通信。在这种情况下,发送方会发送一个复位(RST)报文给接收方,以中断当前的连接。
复位报文是TCP中一种特殊的控制报文,它用于异常情况下的连接中断。接收方收到复位报文后,会立即中断连接,并且双方的TCP栈都会清除关于这个连接的状态信息。复位报文的作用是快速通知对方连接已经不能继续,并且清理连接资源以防止资源浪费。
需要注意的是,复位报文是作为异常情况下的最后手段使用的,通常在网络故障、主机崩溃或拒绝服务攻击等情况下。在正常情况下,TCP会使用其他机制(如超时重传和拥塞控制)来保证数据可靠传输和连接的稳定。

以上就是超时重传机制,仅仅依靠确认应答机制并不能保证数据传输的可靠性,超时重传机制是确认应答机制的有效补充。确认应答机制是正常情况下接收方给发送方说明我已经收到消息了,而超时重传机制是用来解决丢包这种非正常情况的一种策略。

本文到这里就结束了,希望友友们可以支持一下一键三连哈。嗯,就到这里吧,再见啦!!!

在这里插入图片描述

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

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

相关文章

探索生成式AI:自动化、问题解决与创新力

目录 自动化和效率:生成式AI的颠覆力量 解谜大师生成式AI:如何理解和解决问题 创新与创造力的启迪:生成式AI的无限潜能 自动化和效率:生成式AI的颠覆力量 1. 神奇的代码生成器:生成式AI可以帮助开发人员像魔术一样快…

Linux network — 网络层收发包流程及 Netfilter 框架浅析

Linux network — 网络层收发包流程及 Netfilter 框架浅析 1. 前言2. 基础网络知识2.1 网络分层模型2.2 数据包协议分层2.3 sk_buff 结构2.4 收发包整体框架 3. 网络层(IPv4)收发包流程4. Netfilter 框架4.1 IPv4 网络层的 Netfilter Hook 点4.2 iptable…

jquery图形验证码

效果展示 js图形随机验证码&#xff08;表单验证&#xff09; html代码片段 <form class"formwrap"><div class"item"><input type"text" id"code_input" value"" placeholder"请输入验证码"/>…

【KD】知识蒸馏(knowledge distillation)简单介绍

最近学到了知识蒸馏的相关知识&#xff0c;来简单总结一下૮꒰ ˶• ༝ •˶꒱ა。 知识蒸馏 知识蒸馏&#xff0c;是一种模型压缩的手段。通过训练学生模仿教师的行为&#xff0c;将嵌入在大的教师模型中的知识迁移到小的学生模型。 例如&#xff0c;TinyBERT(Jiao et al.,2…

第14课 利用openCV快速数豆豆

除了检测运动&#xff0c;openCV还能做许多有趣且实用的事情。其实openCV和FFmpeg一样都是宝藏开源项目&#xff0c;貌似简单的几行代码功能实现背后其实是复杂的算法在支撑。有志于深入学习的同学可以在入门后进一步研究算法的实现&#xff0c;一定会受益匪浅。 这节课&#…

sensor 点亮出图后,画面全黑是为什么?

同事在点一个思特威的 sensor sc035hgs&#xff0c;这个 sensor 主要负责数据采集&#xff0c;然后给到后面的 NN&#xff08;神经网络&#xff09;去做处理。 点亮出图后&#xff0c;画面很黑&#xff0c;如下图所示&#xff1a; 因为没拿到板子&#xff0c;只能盲猜&#xf…

案例097:基于微信小程序+PHP的家具购物商城系统

目录 前言 系统展示 管理员模块的实现 用户管理 家具分类管理 家具新品管理 家具广告管理 小程序用户模块的实现 首页 家具信息 我的 代码实现 登录功能实现代码 注册功能实现代码 密码重置功能实现代码 修改信息功能实现代码 删除信息功能实现代码 保存信息…

H266/VVC多样化视频编码工具概述

全景视频编码 全景视频&#xff1a; 具有360度全包围视角的球面视频。 全景视频编码&#xff1a; 包括H266在内的视频编码算法都是以平面视频为对象的&#xff0c;为了采用传统的视频编码编码算法&#xff0c;全景视频需要转换为平面视频&#xff0c;其中经纬图等角映射&#…

深度学习|4.1 深L层神经网络 4.2 深层网络的正向传播

4.1 深L层神经网络 对于某些问题来说&#xff0c;深层神经网络相对于浅层神经网络解决该问题的效果会较好。所以问题就变成了神经网络层数的设置。 其中 n [ i ] n^{[i]} n[i]表示第i层神经节点的个数&#xff0c; w [ l ] w^{[l]} w[l]代表计算第l层所采用的权重系数&#xff…

记一次实战云渗透总结

点击星标&#xff0c;即时接收最新推文 云渗透思路 所谓的云渗透通常指SaaS或PaaS渗透&#xff0c;即将服务器端的某些服务搭建在云服务器上&#xff0c;源代码的开发、升级、维护等工作都由提供方进行。从原理上看&#xff0c;云渗透思路与传统渗透思路相差无几。站点必须由底…

Python中的cls语法

在Python中&#xff0c;cls 是一个用于指代类本身的约定性名称&#xff0c;通常用作类方法&#xff08;class method&#xff09;中的第一个参数。cls 类似于 self&#xff0c;它是对类的引用&#xff0c;而不是对实例的引用。cls 通常在类方法中用于访问类级别的属性和方法。举…

Kafka消息阻塞:拯救面试的八大终极解决方案!

大家好&#xff0c;我是小米&#xff0c;一个对技术充满热情的90后程序员。最近在准备社招面试的过程中&#xff0c;遇到了一个超级有挑战性的问题&#xff1a;“Kafka消息阻塞怎么解决&#xff1f;”今天&#xff0c;我就来和大家一起深入剖析这个问题&#xff0c;分享我在解决…

1-02VS的安装与测试

一、概述 对于一名C语言程序员而言&#xff0c;进行C语言程序的开发一般需要一个文本编辑器加上一个编译器就足够了。但为了方便起见&#xff0c;我们选择使用集成开发环境——Visual Studio&#xff08;简称VS&#xff09;。安装Visual Studio 下面讲一下如何安装VS&#xff0…

找不到mfc110u.dll,是什么原因,五种找不到mfc110u.dll,的解决方法

在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“mfc110u.dll丢失”。那么&#xff0c;什么是mfc110u.dll文件&#xff1f;为什么会出现丢失的情况&#xff1f;本文将为您详细介绍mfc110u.dll文件的作用、丢失原因以及提供5种解决方法…

概率论基础知识补充

概率论基础知识 样本概率&#xff1a;P(x)表示样本x出现的概率&#xff0c;也就是在全体样本中出现的概率先验概率&#xff1a;对于多类问题&#xff0c;类别状态 ω i \omega_i ωi​出现的概率, P ( ω i ) P{\left(\omega_i\right)} P(ωi​)条件概率&#xff1a;在类别 ω…

关于图像分类任务中划分数据集,并且生成分类类别的josn字典文件

1. 前言 在做图像分类任务的时候&#xff0c;数据格式是文件夹格式&#xff0c;相同文件夹下存放同一类型的类别 不少网上的数据&#xff0c;没有划分数据集&#xff0c;虽然代码简单&#xff0c;每次重新编写还是颇为麻烦&#xff0c;这里记录一下 如下&#xff0c;有的数据…

win10关闭打开文件安全警告

1.使用场景 在流水线上&#xff0c;因车间刷软件的程序不能下发到每一台电脑上&#xff0c;会使用共享文件夹的形式来共享程序。每次打开会弹出一下窗口&#xff0c;影响员工生产。 需要将安全警告关闭。2.解决步骤 1.winR键打开运行窗口&#xff0c;输入gpedit.msc&#xff…

vue3 的内置组件汇总

官方给出的说明&#xff1a; Fragment: Vue 3 组件不再要求有一个唯一的根节点&#xff0c;清除了很多无用的占位 div。Teleport: 允许组件渲染在别的元素内&#xff0c;主要开发弹窗组件的时候特别有用。Suspense: 异步组件&#xff0c;更方便开发有异步请求的组件。 一、fr…

django学习:页面渲染与请求和响应

1.请求过程 2.页面渲染 在app中新建一个目录&#xff08;Directory&#xff09;&#xff0c;文件名命名为templates。该文件名命名是固定的&#xff0c;不可命名出错&#xff0c;如若后续步骤出错&#xff0c;该目录文件名是一个检查的重点项目。在该目录下新建一个html文件&a…

软件测试|全面解析Docker Start/Stop/Restart命令:管理容器生命周期的必备工具

简介 Docker是一种流行的容器化平台&#xff0c;用于构建、分发和运行应用程序。在使用Docker时&#xff0c;经常需要管理容器的生命周期&#xff0c;包括启动、停止和重启容器。本文将详细介绍Docker中的docker start、docker stop和docker restart命令&#xff0c;帮助您全面…