【Java ee初阶】网络原理

news2025/7/19 5:14:01

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) 流量控制,拥塞控制 …… 

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

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

相关文章

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

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

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

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

求助求助,重金酬谢

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

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

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

基于GPUGEEK 平台进行深度学习

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

【多模态】IMAGEBIND论文阅读

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

LeetCode LCR 007. 三数之和 (Java)

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

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

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

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

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

phpstorm2024.3 设置中文

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

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

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

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

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

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

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

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

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

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

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

计算机网络-MPLS LDP基础实验配置

前面我们学习了LDP的会话建立、标签发布与交换、LDP的工作原理,今天通过一个基础实验来加深记忆。 一、LDP基础实验 实验拓扑: 1、IGP使用OSPF进行通告,使用Lookback接口作为LSR ID,LDP ID自动生成。 2、实验目的:使…

HPE ProLiant DL360 Gen11 服务器,配置 RAID 5 教程!

今天的任务,是帮客户的一台HPE ProLiant DL360 Gen11 服务器,配置RAID 5。依然是按照我的个人传统习惯,顺便做一个教程,分享给有需要的粉丝们。如果你在实际操作中,遇到了什么问题,欢迎在评论区留言&#x…

SARIMA-LSTM融合模型对太阳黑子数量预测分析|附智能体数据代码

全文智能体链接:https://tecdat.cn/?p41969 分析师:Peng Fan 本研究以太阳黑子活动数据为研究对象,旨在帮助客户探索其未来走势并提供预测分析。首先,通过对数据的清洗和处理,包括离群值的识别与处理以及时间序列的建…

C# WinForm DataGridView 非常频繁地更新或重新绘制慢问题及解决

非常频繁地更新 DataGridView问题描述: 在 C# 中无法在合理的时间内刷新我的 DataGridView ,我每秒通过网络发送 20 个数据包,获取数据。我想解析这些数据并将其放入 DataGridView 中。我还想调整 DataGridView 的更新间隔,从 0.1…

【数据结构】红黑树(C++)

目录 一、红黑树的概念 二、红黑树的性质 三、红黑树结点定义 四、红黑树的操作 1. 插入操作 1.1 插入过程 1.2 调整过程 1.2.1 叔叔节点存在且为红色 1.2.2 叔叔节点存在且为黑色 1.2.3 叔叔节点不存在 2. 查找操作 2.1 查找逻辑 2.2 算法流程图 2.3 使用示例 …