JavaEE: 深入探索TCP网络编程的奇妙世界(二)

文章目录

  • TCP核心机制
    • TCP核心机制二: 超时重传
      • 为啥会丢包?
      • TCP如何对抗丢包?
      • 超时重传的时间设定
        • 超时时间该如何确定?


TCP核心机制

前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(一)
书接上文~

TCP核心机制二: 超时重传

在网络传输中,并不会一帆风顺,而是可能出现"丢包情况"~

为啥会丢包?

产生丢包的原因有很多种

  1. 数据传输的过程中,发生了bit翻转,收到这个数据的接收方/中间的路由器啥的,发现计算校验和对不上了

    发现错误,要及时止损,不能将错就错!
    于是就把这个数据包丢弃掉了,不再继续往后转发/不交给应用层使用.

  2. 数据传输到某个节点(路由器/交换机),这个节点,负载太高了.

    某个路由器,单位时间只能转发N个包,由于现在是网络高峰期,这个路由器单位时间需要转发的包超过N了(发不过来了),那么后续传输过来的数据就可能被这个路由器直接丢弃掉.

TCP如何对抗丢包?

由于丢包这件事情,是完全随机的,是不可预测的.

TCP再怎么厉害,也不可能避免数据发生丢包!

TCP能做的就是,感知到数据是否丢包,如果丢包,就重新再发一次.

假设网络丢包率是10%(数据报到达对方是90%)
10%的丢包是相当高的数字,出现这个情况,都是网络发生严重故障(LOL就卡成ppt了),此时可以赶紧找运营商保修了~我在这里只是举个例子~
此时,进行一次重传,两次传输至少一次到达对方的概率: 1 - 10% * 10% = 99%
传输次数越多,数据到达对方的概率就越大.

关于是否丢包,这个问题需要通过应答报文来区分

  • 收到应答报文,说明数据没丢包
  • 没收到应答报文,就说明数据丢包了

我们都知道,数据在网络传输过程中是需要消耗时间的.

那么我们来思考一下这个问题: "没有收到应答报文"表明暂时没收到,那么是过一会就收到了,还是永远都收不到??

其实,发送方发送数据之后,会给出一个"时间限制"(超时时间).
如果在这个时间限制之内,没有收到反馈的ack,那么就视为是数据丢包了.

丢包这个过程有两种情况:

  • 一是主机A发送数据给B之后,可能因为网络拥堵等原因,导致数据无法达到主机B.
    在这里插入图片描述
  • 二是A发送的数据到达B了,但是A在一个特定的时间间隔内没有收到B发来的确认应答(ACK丢失),于是就会重新发送.
    在这里插入图片描述

情况一还好说,A重新发一份就是了.

但是情况二就有点麻烦了,因为A又重新发送了一份相同的数据,接收到多份相同数据感觉好像没啥大不了的,但是万一你传输的数据是"扣款"这样的请求呢?

为了解决情况二引发的问题,TCP会对上述情况做处理.

接收方有一个接收缓冲区,收到的数据先进入到缓冲区里,等后续再收到数据,就会根据序号,在缓冲区中,找对应的位置(排序),如果发现,当前序号1-1000这个数据,已经在缓冲区中存在了,那么就会直接把新收到的这个1-1000数据包丢弃掉~

其实就是去重,通过去重来确保应用程序,调用read读出来的数据,是唯一的,不重复的~

超时重传的时间设定

这里的时间,不是固定值,而是动态变化的.

发送方第一次重传,超时时间是 t1 ,如果重传之后,仍然没有ack,还会继续重传,此时的超时时间就变成了 t2.
t2 > t1
每多重传一次,超时时间的间隔就会变大 / 重传的频次会降低.

经过一次重传之后,就能让数据到达对方的概率提高很多,再重传一次,又会提升很多.

反之,如果重传几次,都没有顺利到达,这就说明网络的丢包率已经到达了一个非常高的程度,网络发生了严重故障,大概率没法继续使用了.

此时再重传的快,也没意义,不如省点力气~

当然了,重传也不会无休止的进行,当重传达到一定的次数之后,TCP不会尝试重传,就认为这个连接已经G了.
TCP会先尝试进行"重置/复位 连接",发送一个特殊的数据包"复位报文".

  • 如果网络这会恢复了,复位报文就会重新连接,使通信可以继续进行.
  • 如果网络还是有严重问题,复位报文也没有得到回应,此时TCP就会单方面放弃连接.

    之前讲过,连接就是通信双方各自保存对方的信息.
    发送方释放掉信息之前保存的接收方的相关信息,那么这个连接也就没了.

针对上述内容,我们只关注策略,不关注参数.因为参数可以根据需要进行修改,而策略是固定的~

超时时间该如何确定?
  • 最理想的状态下,只要找到一个最小的时间,来保证"确认应答一定能在这个时间内返回"就OK.
  • 但是这个时间长短,是会随着网络环境的不同,而发生改变.
  • 如果超时时间设的太长,那么就会影响整体的重传效率
  • 如果超时时间设的太短,那么就有可能会频繁发送重复的包

TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间.

  • Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍
  • 如果重发一次之后,仍然得不到应答,那么将等待2*500ms后进行重传
  • 如果仍然得不到应答,那么将等待4*500ms进行重传.以此类推,以指数形式递增.
  • 等累积到一定的重传次数,TCP就会认为网络或者对端主机出现异常,就会强制关闭连接.

确认应答,和超时重传,相互补充,共同构建了TCP"可靠传输机制"~

下一篇文章JavaEE: 深入探索TCP网络编程的奇妙世界(三)

本文到这里就结束啦~

在这里插入图片描述

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

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

相关文章

基础环境搭建以及大模型部署

文章目录 算力云基础环境搭建以及大模型部署创建实例(租用算力云)选择服务器(一台RTX 3090)选择镜像版本连接实例确认环境和显卡信息 安装大模型1.选择大模型2. 下载并安装大模型设置资源下载加速安装git-lfs下载大模型安装依赖的…

如何使用ssm实现基于SpringMVC网上选课系统的设计与实现

TOC ssm696基于SpringMVC网上选课系统的设计与实现jsp 研究背景和来源 目前的管理类系统已各种各样,涉及到生活中的每一个部分。购物类、网站类、信息统计类、办公类、官网类等非常丰富。我国各类系统的发展已非常成熟,这些系统依靠网络和计算机技术不…

如何使用ssm实现线上旅游体验系统+vue

TOC ssm691线上旅游体验系统vue 绪论 课题背景 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升&#xff0…

15 Midjourney从零到商用·实战篇:建筑设计与室内设计

以前设计师生成一张效果图需要先画草稿,导入三维软件搭建场景后,再用渲染器渲染,而现在只需要有客户的意向图或者自己想法,在MidJourney中就能一键生成惊艳的效果图。 “给我一个prompt我能撬动整个设计界”。设计师在AI绘画面前似…

LLMs之RAG:MemoRAG(利用其记忆模型来实现对整个数据库的全局理解)的简介、安装和使用方法、案例应用之详细攻略

LLMs之RAG:MemoRAG(利用其记忆模型来实现对整个数据库的全局理解)的简介、安装和使用方法、案例应用之详细攻略 目录 MemoRAG的简介 0、更新日志 1、特性 2、路线图 MemoRAG的安装和使用方法 1、安装 安装依赖项 T1、从源码安装 T2、通过pip安装 2、使用方…

【简单介绍】DevOps是什么?

由于 DevOps 方法的广泛采用以及由此产生的快速产品交付和部署,许多部门已采用更敏捷的方法来开发生命周期。在满足市场速度和规模要求的同时,设计安全的软件一直是现代 IT 公司共同面临的问题。结果,超过 52% 的组织因为担心上市速度落后而放…

大数据毕业设计选题推荐-手机销售数据分析系统-Hive-Hadoop-Spark

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

Dubbo入门案例

Dubbo 学习地址:Dubbo3 简介_w3cschool; 01-Dubbo入门案例 ​ 我们先来新建一个Dubbo的小案例来体验一下Dubbo的使用,我们先来创建一个springboot的项目。 1.1-zookeeper下载启动 ​ 在编写我们的入门案例之前,我们需要先去下…

浅拷贝和深拷贝(Java 与 JavaScript)

一、Java 浅拷贝和深拷贝 在Java中,浅拷贝和深拷贝的主要区别在于对对象的引用和内容的复制方式。 浅拷贝 Java 的类型有基本数据类型和引用类型,基本数据类型是可以由 CPU 直接操作的类型,无论是深拷贝还是浅拷贝,都是会复制出…

C++ 二叉树

1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树,他或者是一棵空树,或者是具有以下性质的二叉树: ①若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 ②若它的右子树不为空,则右子树上所有节…

PCL 用八叉树完成空间变化检测

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1八叉树构建与变化检测 2.1.2检测变化的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更…

如何在O2OA中使用ElementUI组件进行审批流程工作表单设计

本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计,O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操作。 在流程表单设计界面,可以在左边的工具栏找到Ele…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算(化为基本型)1.5.1 主对角线行列式:主…

Vue3 + ElementPlus 的后台菜单指引

文章目录 需求实现思路 需求 实现思路 引导页用 Drive.js 基本的使用操作这里写了一些菜单使用 ElementPlus 的组件,可以调用组件中暴露的这个方法,具体使用方法在这里说明 二者结合一下,就可以有这样的效果了

2024网安周 | 百度安全深度参与,探索人工智能与数字安全的融合发展之路

9月9日-15日,2024年国家网络安全宣传周在全国范围内统一举行,本届网安周继续以“网络安全为人民,网络安全靠人民”为主题,由中央宣传部、中央网信办、教育部、工业和信息化部、公安部、中国人民银行、国家广播电视总局、全国总工会…

K8s flink-operator 例子

1.参考官网: https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/docs/try-flink-kubernetes-operator/quick-start/ 2.首先环境具备 k8s、helm 我的环境 k8s 1.30 最新版本了 [rootk8s-master ~]# kubectl get no -owide NAME …

C/C++逆向:循环语句逆向分析

在逆向分析中,循环语句通常会以特定的汇编模式或结构体现出来。常见的循环语句包括 for 循环、while 循环和 do-while 循环。由于不同的编译器会根据代码优化的级别生成不同的汇编代码,分析循环的模式也可能会有所不同。以下是三种常见循环语句的汇编分析…

uni-app+vue3开发微信小程序使用本地图片渲染不出来报错[渲染层网络层错误]Failed to load local image resource

我把图片放在assets里面页面通过相对路径引入。结果一直报错。 最后我把图片放在static文件夹下面。然后修改路径指向static就可以了 或者是我们必须先import 这个图片然后在使用 import banner1 from ../../assets/images/banner/banner1.png; <image :src"banner…

【时时三省】(C语言基础)指针笔试题5

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 笔试题5 这个a数组代表着5行5列 如下图 a[4][2]是第5行的数组 第五行下标为2的位置 取出的是这个位置的地址

【Linux学习】1-2 新建虚拟机ubuntu环境

1.双击打开VMware软件&#xff0c;点击“创建新的虚拟机”&#xff0c;在弹出的中选择“自定义&#xff08;高级&#xff09;” 2.点击下一步&#xff0c;自动识别ubuntu光盘映像文件&#xff0c;也可以点击“浏览”手动选择&#xff0c;点击下一步 3.设置名称及密码后&#xf…