JavaEE初阶---网络原理之TCP篇(二)

文章目录

  • 1.断开连接--四次挥手
    • 1.1 TCP状态
    • 1.2四次挥手的过程
    • 1.3time_wait等待
    • 1.4三次四次的总结
  • 2.前段时间总结
  • 3.滑动窗口---传输效率机制
    • 3.1原理分析
    • 3.2丢包的处理
    • 3.3快速重传
  • 4.流量控制---接收方安全机制
    • 4.1流量控制思路
    • 4.2剩余空间大小
    • 4.3探测包的机制
  • 5.拥塞控制---考虑中间节点
    • 5.1机制的考量
    • 5.2阻塞情况图像分析

1.断开连接–四次挥手

建立连接:一般是我们的客户端发起的;

断开连接:我们的客户端和服务器都可以断开链接;

1.1 TCP状态

listen:表示的就是我们的这个服务器已经建立这个socket对象,端口号什么的已经全部处理好了,这个时候就可以允许我们的客户端进行连接了;

establist状态:表示我们的服务器和客户端之间的这个链接已经建立完成,这个时候可以开始进行通信了;

image-20241030191518907

1.2四次挥手的过程

下面的这个就是我们的四次握手的过程,我们的这个fin就是结束报文段:表示我要和你断开连接了,这个中间的B向A发送的这个ack和fin是不可以进行合并的;

A:我要把你删除了啊~~

B:我要把你删除了啊~~

这个其实可以理解为这个两个人互相拉黑的过程~~

四次挥手两步不可以合并:这个过程的B向A发送的ack和这个fin不可以合并,因为两个触发的时间不是一样的,我们的这个ack是有这个内核发送的,这个速度是很快的,但是我们的这个fin是当我们的传输对象socket执行这个close方法的时候,这个中间还会经历一段时间,因此这两步不可以进行合并的操作;

三次握手里面可以合并:三次握手的时候这个ack,syn是同时触发的,因此这个三次握手的时候两个消息是可以进行合并的,这个也是一个区别;

image-20241030192427663

image-20241030124427066

延时应答:当这个ack的回应时间滞后,这个时候我们的两个ack,fin就可能会一起执行,转换为这个三次挥手;

1.3time_wait等待

这个等待主要是为了防止我们的这个ack(最后一次发送的这个ack)丢失,如果丢失了,我们需要进行重传,但是我们的这个左边的已经释放连接,重传也是无人可以处理的;

我们引入这个time_waited就是为了等待一段时间,保证我们的这个右边的没有信息发送过来,保证右边没有重传;

这个其实也是出于我们的这个两者通信的可靠性进行考虑,但是我们的这个time_wait不会无限的等待,最多是2MSL(这个是我们的网络上面的两个节点之间的这个通信消耗的最大时间),但是这个一般不会达到2MSL的时间;

image-20241030193046541

1.4三次四次的总结

如何正确的理解这个握手和挥手的过程,我认为下面的这个图片足够了,加上自己的理解,应该不会有太大的问题;

image-20241030131701822

2.前段时间总结

确认应答机制:ack数据包;

超时重传机制:就是出现丢包的情况,我们会进行二次发送设置是多次发送;

连接管理机制:就是我们的三次握手,四次挥手的过程;

上面的这三个机制就是为了解决我们的这个可靠性问题,下面的这个是为了提高效率,和这三个机制是有本质的区别的,这个是可靠性,下面的这个是安全性;

3.滑动窗口—传输效率机制

3.1原理分析

TCP引入可靠性,因此这个效率就会降低,我们通过这个滑动窗口,就是为了缩短和UDP的传输的效率的差距,这个相当于就是一个亡羊补牢的操作;

下面的这个就是我们的滑动窗口和普通传输方式的一个对比:滑动窗口是为了进行数据的批量传输,因为左边的这个情况下,我们的进行等待的时候是两段时间:一个是我们的这个发过去的时间,一个是我们的这个ack返回的时间,我们的滑动窗口是为了减少这个等待时间的消耗;

image-20241030194019439

我们的这个滑动窗口是批量处理数据,这个批量也会有限制的,当我们的发送数据量达到最大的时候,我们需要等待,等待一个ack返回之后,我们开始发下一个,而不是等待所有的全部回来再发送,而是回来一个发一个,这个就是滑动窗口的精髓

在这个视觉效果上面,好像就是这个窗口不断的移动,这个就给人一个滑动的感觉,这个就是滑动窗口的名字由来;

image-20241030194308870

3.2丢包的处理

下面的这个就是两个丢包的情况:一个是我们的这个ack丢了,或者这个响应数据包丢了;

第一个情况,我们是不用处理的,例如我们的第一次应答ack是1001,就是想要索取这个1001开始的数据,但是后来我们的第二次和第三次的数据ack丢失了,这个时候直接返回这个4001,这个时候我们的主机A就明白之前的这个100-3000的数据,我们的这个主机B是收到的,因为不然的话这个序号不会是这个4001,只不过这个ack中间丢了,这个时候我们不用进行处理的;

但是这个数据包丢了:我们需要进行处理,1001-2000丢了,这时候主机A不知道,接下来只要这个主机A发数据,我们就返回这个1001,就一直问这个主机A索要这个1001,直到这个主机A给了我们(这个过程我们的主机A就会知道,这个B一直问我要1001,肯定是我的这个数据没有发送成功)这个时候他就会重传数据;

image-20241030194617840

3.3快速重传

我们的这个哪个数据包丢失了,我们就重新传输那一个数据包,这个是快速重传,使我们之前的超时重传的变种;

当这个数据量很大的时候,我们可以使用,可以使用滑动窗口里面的这个快速重传;

如果是这个数据量不是很大,这个时候我们就可以使用之前介绍这个超时重传进行处理;

上面的两个重传的机制有各自的这个应用的场景,这个并不冲突;

4.流量控制—接收方安全机制

4.1流量控制思路

这个还是书接上回:我们的窗口不断的发送数据,但是我们的这个B根本来不及接受,接受的能力超出了B上限,即使我们窗口传输的效率很高,这个也是没用的;

我们的流量控制,就是对于这个发送方的发送速率进行控制,让他刹刹车,不要发的很快,要适应我们的这个接受的能力;

这个其实也是我们的生产者消费者模型的一个使用,就是我们的这个B从这个自己的这个接受缓冲区取出来数据,这样即使我们的这个发送速率很快,也不会影响我们的这个B接受数据,处理数据的效率;

4.2剩余空间大小

就是衡量我们的接收方的处理的能力:我们的这个B进行应答的时候,会把这个剩余缓冲空间的大小包含在这个ack里面去,当我们的这个ack里面写的这个缓冲区见很小的时候,

下面的这个16位窗口大小:就是我们的这个ack返回里面指明的这个剩余空间大小;

但是这个不意味着我们的这个剩余空间最大就是16位,我们的这个选项里面可以对于这个剩余空间大小进行动态的调整,我们的这个A根据我们的这个剩余空间大小对于A发送的数据进行调整,

image-20241030195937245

4.3探测包的机制

就是我们的这个探测包是探测一下我们的这个剩余空间是不是大于0,原本我们的这个剩余空间已经是0了,这个时候A就会使用探测包,实时对于这个剩余空间大小进行查看;

这个探测包就是为了看看我们的这个B里面是不是有空间了,如果有了我们就会开始发送数据包,没有的话我们就会接着等待,再使用探测包不断的探测这个剩余空间大小,以此类推;

image-20241030200311837

5.拥塞控制—考虑中间节点

5.1机制的考量

上面的是考虑的我们的接收方的接受处理能力,但是我们的这个考虑的就是我们的传输过程路径中的经过的节点的处理能力,中间经过的这个节点的处理能力达到上限,这个也是不行的;

image-20241030201008517

中间节点的结构复杂,不好进行控制,我们可以先让这个A以一个小的窗口发送数据,看看是不是丢包,在这个基础上面 不断的扩大这个滑动窗口,如果出现丢包,我们在缩减这个滑动窗口的大小;

如果不丢包了,我们就变大窗口,丢包就减小这个窗口大小,不断的进行调整这个滑动窗口的大小,这个做法就是通过实验的方式找到我们的这个中间节点的传输瓶颈参数—进而确定窗口大小;

5.2阻塞情况图像分析

下面的这个就是我们的窗口大小随着我们的传输过程的调整过程:刚开始是指数增长,然后就是线性增长,出现丢包(图上面的网络拥堵),我们就减小窗口的大小,再重新进行这个指数增大,线性增加,重复进行下去;

image-20241030201513243

们的窗口大小随着我们的传输过程的调整过程:刚开始是指数增长,然后就是线性增长,出现丢包(图上面的网络拥堵),我们就减小窗口的大小,再重新进行这个指数增大,线性增加,重复进行下去;

[外链图片转存中…(img-iOLNIv6E-1730292373618)]

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

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

相关文章

单细胞数据分析(一):10X数据生成seurat数据对象

文章目录 介绍加载R包数据链接导入数据过滤细胞:移除双重细胞合并所有seurat数据对象输出结果系统信息介绍 在单细胞基因组学研究中,Seurat是一个流行的R包,用于单细胞基因表达数据的分析和探索。以下是如何从10X基因注释数据生成Seurat数据对象,并对该数据进行过滤的步骤…

了解SQLExpress数据库

SQLExpress(Microsoft SQL Server Express)是由微软公司开发的一款免费且轻量级的数据库管理系统。以下是关于SQLExpress的详细解释: 一、定义与特点 定义: SQLExpress是Microsoft SQL Server的一个缩减版或基础版,旨在…

C++ 魔法三钥:解锁高效编程的封装、继承与多态

快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 目录 💯前言 💯封装 1.封装概念 2.封装格式 3.封装的原理 4.封装的作用 💯继承 1.继承的概念 2.继承格式 3.继承的…

开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序中积分使用价值的拓展策略

摘要:本文围绕开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序,深入探讨其积分使用价值的丰富策略。详细分析积分兑换礼品、会员升级、积分抵现等方式在该特定商城小程序环境下的应用特点、存在问题及对用户和商城的影响,旨在为商城的优化运…

UE4安卓Gradle工程中的libUE4.so的生成原理

流程图 流程图放在最前面,下面是讲解。 libUE4.so 问:在UE4安卓开发中,libUE4.so即是符号表,又是引擎代码native,是吗? 答:是的,libUE4.so在UE4安卓开发中既包含符号表,…

Java线程池的核心内容详解

文章内容已经收录在《面试进阶之路》,从原理出发,直击面试难点,实现更高维度的降维打击! 目录 文章目录 目录Java线程池的核心内容详解线程池的优势什么场景下要用到线程池呢?线程池中重要的参数【掌握】新加入一个任…

Pandas DataFrame学习

1.DataFrame定义 DataFrame 是 Pandas 中的另一个核心数据结构,用于表示二维表格型数据。DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索…

如何在创建完fb公共主页后添加管理员防止封号?

在创建Facebook公共主页后,及时添加备用管理员是非常重要的。这可以帮助防止由于个人账号被封或其他限制因素导致无法继续管理公共主页的情况。以下是关于如何添加管理员及接受邀请的详细步骤。 Facebook公共主页的角色介绍 在Facebook公共主页上,有五种…

无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划

着重介绍通过对三维 PCD 点云进行处理生成 2D 栅格地图 PGM,而后将该 PGM 地图充分运用到无人系统路径规划之中,使得无人机能够依据此规划合理避开飞行路线上可能出现的障碍物。(解决如何使用PGM的问题) Hybrid A*算法 参考博客…

YOLOv10改进策略【注意力机制篇】| WACV-2024 D-LKA 可变形的大核注意 针对大尺度、不规则的目标图像

一、本文介绍 本文记录的是利用D-LKA模块优化YOLOv10的目标检测网络模型。D-LKA 结合了大卷积核的广阔感受野和可变形卷积的灵活性,有效地处理复杂的图像信息。本文将其应用到v11中,并进行二次创新,使网络能够综合多种维度信息,更…

人工智能中的机器学习和模型评价

文章目录 1.监督学习1.1线性回归1.2KNN算法1.3支持向量机 2.无监督学习2.1K-means聚类2.2FCA主成分分析 机器学习是人工智能的一个分支,它使计算机系统能够从数据中学习并做出决策,而无需进行明确的编程。它涉及到开发算法和技术,使计算机能够…

HomeAssistant自定义组件学习-【二】

#要说的话# 前面把中盛科技的控制器组件写完了。稍稍熟悉了一些HA,现在准备写窗帘控制组件,构想的东西会比较多,估计有些难度,过程会比较长,边写边记录吧! #设备和场景环境# 使用的是Novo的电机&#xf…

Docker Swarm简介

注意事项 Swarm 模式是用于管理 Docker 守护进程集群的一项高级特性。如果你打算将 Swarm 用作生产运行时环境,那就使用 Swarm 模式。如果你不打算使用 Swarm 进行部署,可改用 Docker Compose。如果正在为 Kubernetes 部署进行开发,可以考虑使…

JVM 运行时数据区

JVM整体架构 可以分为三层: 1 JVM外部,从源文件到Class文件,再装载到JVM 2 JVM运行时数据区,相当于就是避风港、运行的大后方。给执行程序提供后勤。 3 执行引擎层。和运行时数据区交互,完成执行任务。 运行时数据…

新加坡托管服务器VS香港托管服务器:AI时代的选择策略

在人工智能迅速发展的今天,服务器作为数据存储与计算的核心基础设施,其性能、稳定性和地理位置对于用户体验和业务效率至关重要。对于中国用户而言,在选择服务器时,新加坡服务器和香港服务器无疑是两个极具吸引力的选项。两者同属…

DAYWEB69 攻防-Java 安全JWT 攻防Swagger 自动化算法签名密匙Druid 泄漏

知识点 1、Java安全-Druid监控-未授权访问&信息泄漏 2、Java安全-Swagger接口-文档导入&联动批量测试 2、Java安全-JWT令牌攻防-空算法&未签名&密匙提取 Java安全-Druid监控-未授权访问&信息泄漏 Druid是阿里巴巴数据库事业部出品,为监控而…

vscode使用技巧

vscode如果要用来写不同的语言,可以通过创建的工作区,然后创建不同的快捷方式以便打开它 注:C/C 退回到1.8.4,为了生成可以配置的文件 1.创建工作区 将工作区另存为 -> 选择你要写的文件夹的根目录 -> Save 2.归纳可执行…

Android 托管 Github Action 发布 Github Packages ,实现 Mvn 免费自动化托管

自从多年前 JCenter 关闭服务之后,GSY 项目版本就一直发布在 Jitpack 上,如今每个月也都有大概 10w 左右下载,但是近年来时不时就会出现历史版本丢失的问题,而且有时候还不是某个具体版本丢失,而是版本里的某几个依赖突…

记录一次企业外部通过ssh 连接数据库的事DBeaver

情况大概是这样,公司算法供应商开通了连接某个服务器A的权限,但是数据库x是在另一台服务器B上。 直接通过外部连接数据库是不行的,需要借用服务器A来进行访问x 使用软件:DBeaver, 数据库x类型:oracle 需要的信息&am…

Java爬虫的京东“寻宝记”:揭秘商品类目信息

开篇:Java特工的神秘任务 在这个数据驱动的时代,我们就像一群特工,穿梭在数字的海洋中,寻找着隐藏的宝藏——商品类目信息。今天,我们将带领你一起,用Java这把精密的瑞士军刀,深入京东的神秘领…