当前位置: 首页 > article >正文

【Java ee初阶】网络原理

TCP协议

1.确认应答 实现可靠传输的核心机制

2.超时重传 实现可靠传输的核心机制

3.连接管理 网络部分最高频的面试题

4.滑动窗口 提高传输效率的机制

5.流量控制 依据接收方的处理能力,限制发送方的发送速度。

6.拥塞控制 依据传输链路的处理能力,限制发送方的发送速度。

做实验

1.先从比较小的窗口开始 慢启动

2.指数增长

3.达到阈值,线性增长

4.遇到丢包,重新设定阈值,把窗口大小设为阈值的大小,继续线性增长

TCP核心机制

核心机制七:延时应答

为了提高传输效率。

承接滑动窗口,让传输效率提高一些。让窗口尽量大一些(在可靠性的前提下)

不立即返回 ack,而是稍微等一等。接收方应用程序,就是消费者。 为了给接收方留出一些时间 好能够多消费一些,接收缓冲区的剩余空间更大一点。

核心机制八 捎带应答

网络通信中,经常是“一问一答”的模型

客户端发起request,服务器返回response (不是ack.....)

核心机制九:面向字节流

读取/写入的时候,读写操作有很多种方式,非常灵活。

读100字节,

1. 一次读10字节,10次完成

2. 一次读20字节,5次完成

3. 一次读50字节,2次完成 ……

因此引起了粘包问题

接收方用的时候 去掉报头,把载荷内容放到一个 接收缓冲区中

接收方的应用程序,read的时候,就有很多种read的可能性

read的可能性:

1) a a a b b b c c c

2) aa ab bb cc c

3) aaa bbb ccc

4) aaab bbcc c

5) aa abb bcc c ......

取决于应用程序的代码是咋写的

具体怎样来读,才能确保读到的是一个“完整的应用层数据包”?

粘包,粘的是应用层的数据包。

TCP字节流的特性,收到多个TCP数据报的时候把所有的载荷都给混到一起 放到接收缓冲区里 

包的边界比较模糊,就好像“粘上了”一样

解决粘包,从应用层入手,合理的设计应用层协议,让包之间的边界,能够比较清晰

1. 通过特殊的分隔符,来作为包边界的区分

比如,约定,每个应用层数据包,都以;为结尾

包的数据里面,不能包含分隔符

需要找合适的符号,确保这个符号在正文中不会重复出现

再比如,之前写的回显服务器当时是使用 \n 作为分隔符的(空白符)

读到空白符就结束了。 空白符是统称,包括不限于: 空格,换行,回车,制表符,分页符,垂直制表符……

发请求的时候,使用 \n 作为结束标记的

由于是通过控制台来进行输入请求内容的

控制台里输入的内容本来就不会包含 \n

即使ascii码表中,也有不少的字符,可以用来作为分隔符

有一些特殊的“不可见字符” 历史遗留

2. 在应用层数据包开头的地方,通过固定长度,约定整个应用层数据包的长度

应用程序read的时候,先固定read 2字节,看看2字节里的内容是啥 => 发现是3

接下来再read 3字节,读到的aaa就是完整的应用层数据包

粘包问题只针对字节流的传输。对于文件操作,(使用文件存储多个结构化数据...也是可能涉及到粘包的)

比如,通过文件,保存若干个学生信息。

class Student { name id age classId ... }

比如约定成,每个学生信息占一行(使用 \n 作为结束标记,作为分隔符)

对于UDP来说,不存在粘包问题,UDP的接收缓冲区和TCP的不太一样

应用层不需要做区分

应用程序每次调用 recv 得到但就是一个完整的 DatagramPacket

也就对应一个完整的应用层数据包了。

未来实际开发中,很多时候是基于一些现成的框架/库进行开发的

(很可能粘包问题已经被框架/库帮我们解决了)

知名的框架和库,都是“通用的”

核心机制十 异常情况

1. 进程崩溃 [正常的流程]

进程崩溃,意味着对应的文件描述符就被关闭了(调用close,干掉进程)。

只要是进程退出,都会释放PCB,释放文件描述符表

TCP的连接并没有因为进程的结束立即结束,保留一会

触发FIN

2. 主机关机 (正常流程)

正常流程下的主机关机,就会先杀死所有的进程

此时也会触发FIN,进而进入四次挥手

有可能挥不完

如果关机的速度比较慢,有很大可能四次挥手挥完了

如果关机的速度比较快,刚发FIN,机器就关了

对端可以正常返回ack,也会继续正常发送FIN,这里的FIN就没有收到ack,尝试重传几次FIN. 还是没有ack,对端就直接放弃连接(删除之前保存的对端信息)

四次挥手,如果挥完了, 双方可以确认,双方都能顺利把保存的信息删掉, 如果挥不完,至少自己可以把保存的信息删掉, 对端就不管了 此时对端关机了,内存的数据全没了

3. 主机掉电(直接拔电源)

直接啥都没了

来不及发起FIN 台式机

1) 如果掉电的一方是接收方,对方是发送方。

对方继续发送数据,没有ack=> 超时重传 => 仍然没有ack => 继续超时重传

达到一定程度,掉电方仍然没有ack,发送方发送一个复位报文,就是表示要重置连接

放弃当前的连接

2) 如果掉电的一方是发送方,对方是接收方。

接收方感受到的是,发送方,突然停下了

接收方会继续阻塞等待,等待发送方发来新的数据

心跳包。

接收方会周期性的和发送方交换“心跳包”

A给B发一个无业务数据的报文

B给A返回一个ack 如果对方有应答,就可以认为对方是正常工作的。

如果心跳包也没有应答,就可以认为,对方挂了

如果发现心跳包没有,就可以单方面的释放连接了

这个机制非常重要,尤其是分布式系统中

分布式系统中,知道某个节点存活,非常重要的

4. 网线断开

本质上和主机掉电是一样的.

网线断开的两端,一个是发送方,一个是接收方 对于发送方来说,没有ack => 超时重传 => 仍然没有ack => 超时重传 => 达到一定程度,放弃连接

对于接收方来说,周期性触发心跳包 => 发现对端下线 => 放弃连接

1. 确认应答 2. 超时重传 3. 连接管理(三次握手,四次挥手) 4. 滑动窗口(快速重传) 5. 流量控制 6. 拥塞控制 7. 延时应答 8. 捎带应答 9. 面向字节流(粘包问题) 10. 异常情况(心跳包)

TCP有连接,可靠传输,面向字节流

还有一系列的机制……十个机制 

大部分情况优先考虑TCP

UDP无连接,不可靠传输,面向数据报 UDP传输效率高

机房内部的传输,不太会丢包,效率要求更高 还有的场景,既需要可靠性(不需要那么严格的可靠性),又需要效率(比TCP更高)

用UDP实现可靠传输(经典面试)

其实是在考察 TCP 基于UDP,在应用层,自己写代码,实现可靠传输.... 参考TCP的做法。

1) 确认应答 序号/确认序号 2) 超时重传 3) 滑动窗口 4) 流量控制,拥塞控制 …… 

相关文章:

【Java ee初阶】网络原理

TCP协议 1.确认应答 实现可靠传输的核心机制 2.超时重传 实现可靠传输的核心机制 3.连接管理 网络部分最高频的面试题 4.滑动窗口 提高传输效率的机制 5.流量控制 依据接收方的处理能力,限制发送方的发送速度。 6.拥塞控制 依据传输链路的处理能力&#xff0c…...

MongoDB 的核心概念(文档、集合、数据库、BSON)是什么?

MongoDB 是一个面向文档的数据库,它的核心概念与传统的关系型数据库(RDBMS)有所不同。以下是它的四个主要核心概念: 文档 (Document) 定义: 文档是 MongoDB 中的基本数据单元。它类似于关系型数据库中的一行记录&#…...

Spring 事件监听机制的使用

文章目录 1. 创建自定义事件2. 发布事件3. 监听事件4. 异步事件 1. 创建自定义事件 事件可以是任意对象(Spring 4.2支持POJO),或继承ApplicationEvent(旧版)。 // 自定义事件(POJO形式,无需继…...

awesome-digital-human本地部署及配置:打造高情绪价值互动指南

在数字化交互的浪潮中,awesome-digital-human-live2d项目为我们打开了本地数字人互动的大门。结合 dify 聊天 api,并借鉴 coze 夸夸机器人的设计思路,能为用户带来充满情绪价值的交互体验。本文将详细介绍其本地部署步骤、dify 配置方法及情绪…...

WebSocket与Socket.IO实现简易客服聊天系统全解析

WebSocket结合Socket.IO实现简易客服聊天系统全解析 一、技术选型对比 技术优点缺点适用场景原生WebSocket浏览器原生支持,性能好API较底层,需手动处理断线重连等逻辑简单实时应用Socket.IO自动重连,房间管理,兼容性好体积较大&…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 获取macOS App的Bundle路径信息.

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

C++取时间戳窗口

应用场景 防止接口在指定的时间内重复调用&#xff0c;比如 10 秒内不能重复调用。 函数实现 #include <chrono>/// brief 计算当前时间戳所属时间窗口的起始点&#xff08;对齐到 Window 秒的整数倍&#xff09; /// param Window 时间窗口长度&#xff08;单位&…...

第26节:卷积神经网络(CNN)-数据增强技术(PyTorch)

1. 引言 在深度学习领域,数据增强(Data Augmentation)是提升卷积神经网络(CNN)性能的关键技术之一。通过人为地扩展训练数据集,数据增强能够有效提高模型的泛化能力,防止过拟合,特别是在训练数据有限的情况下。本文将全面介绍PyTorch框架下的数据增强技术,包括基本原理、…...

求助求助,重金酬谢

如图&#xff0c;我先在服务器上运行一个 dock 容器&#xff0c;然后用 nohup 命令把 auto_run.py 程序挂起&#xff0c;然后我查了一下是在 12 端口运行的&#xff0c;这时候我关闭命令窗口&#xff0c;我再重新打开运行 docker 容器就找不到挂起的进程了&#xff01;这是为什…...

【生产实践】Dolphinscheduler集群部署后Web控制台不能登录问题解决

太长不看版 问题描述&#xff1a; Dolphinscheduler按生产手册使用一键脚本集群部署后&#xff0c;控制台登录页面可以打开&#xff0c;但使用默认账户怎么都登录不进去&#xff0c;尝试在数据库中清理登录用户字段&#xff0c;发现数据库中并没有相关用户字段&#xff0c;而后…...

【东枫科技】使用LabVIEW进行深度学习开发

文章目录 DeepLTK LabVIEW深度学习工具包LabVIEW中的深度神经网络**功能与特性****功能亮点&#xff1a;** **支持的网络层****支持的网络架构****参考示例** 授权售价 DeepLTK LabVIEW深度学习工具包 LabVIEW中的深度神经网络 功能亮点&#xff1a; 在 LabVIEW 中创建、配置…...

PYTHON训练营DAY25

BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型&#xff0c;例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐&#xff1a;捕获所有类型的异常&…...

Axure :基于中继器的列表删除 、 列表编辑

文章目录 I 列表删除思路操作说明II 列表编辑功能思路修改按钮的交互操作说明编辑页面的保存按钮交互设置取消标记I 列表删除 思路 中继器删除行交互事件; 操作说明 在操作列中添加删除标签,同步添加鼠标点击交互事件 在交互事件中插入中继器删除行动作 多选删除,勾选已标…...

基于GPUGEEK 平台进行深度学习

一、平台简介 GPUGEEK 是一个专注于提供 GPU 算力租赁服务的平台&#xff0c;在人工智能与深度学习领域为用户搭建起便捷的算力桥梁。它整合了丰富多样的 GPU 资源&#xff0c;涵盖 RTX - 4090、RTX - 3090、A100 - PCIE 等多种型号&#xff0c;满足不同用户在模型训练、数据处…...

【多模态】IMAGEBIND论文阅读

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 IMAGEBIND 多模态论文梗概 IMAGEBIND是一种夸模态的神经网络&#xff0c;以图片为中心&#xff0c;联合六中模态的网络&#xff08;图片、文…...

LeetCode LCR 007. 三数之和 (Java)

题目描述 给定一个整数数组 nums&#xff0c;判断是否存在三个元素 a, b, c&#xff0c;使得 a b c 0&#xff1f;找出所有满足条件且不重复的三元组。 解题思路 核心方法&#xff1a;排序 双指针 排序&#xff1a;首先将数组排序&#xff0c;便于后续去重和双指针操作。…...

VTK|类似CloudCompare的比例尺实现1-源码分析

文章目录 CloudCompare源码分析void ccGLWindowInterface::drawScale(const ccColor::Rgbub& color)&#x1f9e9; 总体功能&#x1f9e0; 函数逐步解析✅ 1. 断言只在正交模式下使用✅ 2. 计算显示的实际长度✅ 3. 字体和图形区域准备✅ 4. 计算比例尺图形的绘制位置✅ 5.…...

电子电器架构 --- 车载以太网拓扑

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

phpstorm2024.3 设置中文

要在 PhpStorm 2024.3 中设置中文界面&#xff0c;你可以按照以下步骤进行操作。请注意&#xff0c;PhpStorm 2024.3 版本可能已经包括了中文语言包&#xff0c;但如果你使用的是较早的版本&#xff0c;可能需要下载额外的语言包。 方法一&#xff1a;直接在设置中切换&#x…...

Spring Boot 的 CommandLineRunner

Spring Boot 的 CommandLineRunner 是用于在应用程序启动后执行初始化逻辑的核心接口&#xff0c;以下为综合说明&#xff1a; 一、定义与作用 CommandLineRunner 是 Spring Boot 提供的函数式接口&#xff0c;开发者通过实现其 run(String... args) 方法&#xff0c;可在应用…...

vxe-table 同时实现合并单元格与任意列展开行

前一段时间有一个需求&#xff0c;要求既要合并单元格&#xff0c;又要实现树状图的效果&#xff0c;但是展开节点tree-node 可以放在非第一列的任意位置&#xff0c;Vxe-table可以实现如下是效果图&#xff1a; 大家可以一起交流学习&#xff01; ~重点注意事项&#xff1a;…...

ArcGIS Desktop使用入门(二)常用工具条——图形

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…...

Java SpringMVC 和 MyBatis 整合关键配置详解

目录 一、数据源配置二、MyBatis 工厂配置三、Mapper 扫描配置四、SpringMVC 配置五、整合示例实体类Mapper 接口Mapper XML 文件Service 类控制器JSP 页面六、总结在 Java Web 开发中,SpringMVC 和 MyBatis 是两个常用框架。SpringMVC 负责 Web 层的请求处理和视图渲染,MyBa…...

【行为型之观察者模式】游戏开发实战——Unity事件驱动架构的核心实现策略

文章目录 &#x1f3af; 观察者模式&#xff08;Observer Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;玩家血量监控系统&#xff09;1. 定义观察者接口与主题基类2. 实现具体主题&#xff08;玩家血量&#xff09;3. 实现…...

神经网络语言模型(前馈神经网络语言模型)

神经网络语言模型 什么是神经网络&#xff1f;神经网络的基本结构是什么&#xff1f;输入层隐藏层输出层 神经网络为什么能解决问题&#xff1f;通用近似定理为什么需要权重和偏置&#xff1f;为什么需要激活函数&#xff1f;权重是如何确定的&#xff1f;1. 穷举2. 反向传播主…...

基于Transformer的多资产收益预测模型实战(附PyTorch实现与避坑指南)

基于Transformer的多资产收益预测模型实战(附PyTorch模型训练及可视化完整代码) 一、项目背景与目标 在量化投资领域,利用时间序列数据预测资产收益是核心任务之一。传统方法如LSTM难以捕捉资产间的复杂依赖关系,而Transformer架构通过自注意力机制能有效建模多资产间的联…...

CUDA编程——性能优化基本技巧

本文主要介绍下面三种技巧&#xff1a; 使用 __restrict__ 让编译器放心地优化指针访存想办法让同一个 Warp 中的线程的访存 Pattern 尽可能连续&#xff0c;以利用 Memory coalescing使用 Shared memory 0. 弄清Kernael函数是Compute-bound 还是 Memory-bound 先摆出一个知…...

道通EVO MAX系列无人机-支持二次开发

道通EVO MAX系列无人机-支持二次开发 EVO Max 系列采用Autel Autonomy自主飞行技术&#xff0c;实现复杂环境下的全局路径规划、3D场景重建、自主绕障和返航&#xff1b;高精度视觉导航能力&#xff0c;使其在信号干扰强、信号遮挡、信号弱等复杂环境下&#xff0c;依然获得高精…...

Node.js中MongoDB连接的进阶模块化封装

Node.js中MongoDB连接的进阶模块化封装 &#x1f4d1; 目录 为什么需要模块化数据库连接现代Node.js连接MongoDB的最佳实践四层架构下的模块化封装 1. 配置层&#xff08;Config Layer&#xff09;2. 连接层&#xff08;Connection Layer&#xff09;3. 模型层&#xff08;Mo…...

Go基于plugin的热更新初体验

背景 对于一个部署在生产环境的项目来说&#xff0c;我们希望当代码出现bug的时候&#xff0c;可以不用重启进程而达到动态修改代码的目的—— 这就是代码热部署&#xff01; 使用java做游戏服务器&#xff0c;最大的好处是&#xff0c;当代码出现bug&#xff0c;可以直接热…...