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

news2024/11/25 20:53:03

文章目录

  • 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.coloradmin.cn/o/2228525.html

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

相关文章

玩转HF/魔搭/魔乐社区

下载依赖 下载指定文件 玩转HF/魔搭/魔乐社区 1. 闯关任务 😀Hello大家好,这节课为大家带来“玩转HF/魔搭/魔乐社区”的课程,课程任务请访问闯关任务 2. 课程内容 😀Hello大家好,欢迎来到书生大模型实战营第四期…

ReactNative Fabric渲染器和组件(5)

ReactNative Fabric渲染器和组件 简述 Fabric是ReactNative中新架构最核心的模块,本章我们会来了解一下自定义一个Fabric组件,然后在JS文件中声明之后如何,是怎么映射到原生构建一个View的。 关于Fabric架构理念官网已经有说明了&#xff0…

DataSophon集成ApacheImpala的过程

注意: 本次安装操作系统环境为Anolis8.9(Centos7和Centos8应该也一样) DataSophon版本为DDP-1.2.1 整合的安装包我放网盘了: 通过网盘分享的文件:impala-4.4.1.tar.gz等2个文件 链接: https://pan.baidu.com/s/18KfkO_BEFa5gVcc16I-Yew?pwdza4k 提取码: za4k 1…

计算机网络-MSTP概述

一、RSTP/STP的缺陷与不足 前面我们学习了RSTP对于STP的一些优化与快速收敛机制。但在划分VLAN的网络中运行RSTP/STP,局域网内所有的VLAN共享一棵生成树,被阻塞后的链路将不承载任何流量,无法在VLAN间实现数据流量的负载均衡,导致…

字节青训-兔群繁殖之谜

问题描述 生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律: 每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。新生的小兔子需要一个月成长,到第二个月才能开始繁殖。兔子永远不会死亡。 小 R…

uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件

手机上有很多组件,需要手机底部弹窗来做选择,picker选择器,select列选择器呀这些,在苹果手机上会被底部nav遮住 采用了好几种配置的方式,多多少少都不太行,还是采用css来做吧,但是css来写想让它生效&#x…

从零开始使用Surya-OCR最新版本0.6.1——最强文本检测模型:新添表单表格检测识别

目录 一、更新概述 二、环境安装 1.基础环境配置 2.模型参数下载 3.参数地址配置——settings.py 三、指令使用 1.命令指令运行 一、更新概述 surya项目Github地址:https://github.com/VikParuchuri/surya 号称今年最强OCR的surya近期迎来新的更新,Vik…

深入理解C++ Lambda表达式:语法、用法与原理及其包装器的使用

深入理解C Lambda表达式:语法、用法与原理及其包装器的使用 lambda表达式C98中的一个例子lambda表达式语法lambda表达式各部分说明捕获列表说明 函数对象与lambda表达式 包装器function包装器 bind 🌏个人博客主页: 个人主页 本文深入介绍了…

nacos介绍

Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它致力于提供发现、配置和管理微服务的统一解决方案,以支持构建云原生应用。 服务发现(Service Discovery): Nacos 支持服务的动态注册与发现&#xff…

【操作系统实验课】Git操作基础

1. Windows系统 1.1. Git下载安装 下载 Git 访问 Git 官方网站:https://git-scm.com/。 在页面中找到适合 Windows 系统的下载链接,一般会有 “Windows” 字样的按钮,点击下载安装程序。 安装 Git 运行下载的安装程序。 在安装向导中,一般可以选择默认设置,也可以根…

搜维尔科技:Xsens动作捕捉、Manus数据手套和Faceware面部捕捉技术集成,应用于元宇宙数字人制作解决方案

Xsens动作捕捉、Manus数据手套和Faceware面部捕捉技术集成,能够实现非常逼真且高效的数字人动作和表情捕捉! 硬件连接与数据传输方面: 1.Xsens与Manus的集成:Xsens惯性动作捕捉系统通常可以与Manus的数据手套直接集成。Xsens主要…

MQTTnet4.3.x服务端+客户端实例测试(服务端和客户端方法及参数)

一、示例 目的:学习MQTTnet4.x使用方法,网上很多方法都是3.x版本介绍 二、方法调用 2.1 服务端 2.2 客户端 结合上篇博文,实现与多客户端进行交流(实现在线客服功能) 当然还有其他方法。之前曾写过相关MQTT文章&#…

【WebDriver】浏览器驱动下载及其配置

一、Windows电脑环境搭建-Chrome浏览器 行业内,Chrome (谷歌) 浏览器对于自动化程序来讲是比较稳定的. 自动化程序推荐使用 Chrome 浏览器的原因有几个: 开发者工具:Chrome 提供强大的开发者工具,方便调试和测试自动化脚本。 稳…

用jest做单元测试不得不知道的起手式配置,闭坑指南

做单元测试有很多的工具,今天在一个老项目中看到的用的工具是用的jest做的单元测试,特尝试更新下,遇到不少的问题。 相关依赖配置文件 npm install --save-dev jestpackage.json {"name": "jest-app","version&qu…

【Android】多渠道打包配置

目录 简介打包配置签名配置渠道配置配置打包出来的App名称正式包与测试包配置 打包方式开发工具打包命令行打包 优缺点 简介 多渠道打包 是指在打包一个 Android 应用时,一次编译生成多个 APK 文件,每个 APK 文件针对一个特定的渠道。不同的渠道可能代表…

Linux初学者导引:掌握主要命令与操作系统基础(第一天)

本文使用的工具:CentOS。 1.打开终端: 鼠标单击右键,选择“在终端打开(E)”选项。 2.命令行基础 常用命令: (1)ls:列出目录内容 列出当前目录或指定目录中的文件和文件夹。 基本用法:ls常…

块设备驱动的基本概念

块设备与字符设备 块设备只能以块为单位接收输入和返回输出,而字符设备则以字节为单位。大多数设备是字符设备,因为它们不需要缓冲而且不以固定块大小进行操作;字符设备只能被顺序读写,而块设备可以随机访问。 块设备对于I/O请求…

【力扣 + 牛客 | SQL题 | 每日4题】牛客大厂面试真题W3,W10

1. 牛客大厂面试真题SQLW3:分析客户逾期情况 1.1 题目: 描述 有贷款信息表:loan_tb(agreement_id:合同id,customer_id:客户id,loan_amount:贷款金额,pay_a…

python 写web前端的库

Gradio vs Streamlit vs Dash vs Flask几款的对比 Gradio:Gradio 是专门为机器学习模型构建的。因此,如果您想专门为您构建的机器学习模型创建一个 Web UI,Gradio 的简单语法和设置是您的不二之选。 Streamlit:如果您想快速启动和…

Ubuntu系统安装软件

在Linux系统中有四种软件安装方式:rpm、yum、apt、编译安装 编译安装 编译安装只有一个源码包,源码包是由一大堆源代码程序组成的,是由程序员按照特定格式和语法编写好了,现成的安装包 程序:未执行的代码 进程&#…