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

【网络原理】从零开始深入理解TCP的各项特性和机制.(一)

在这里插入图片描述

本篇博客给大家带来的是网络原理的相关知识.其中传输层这一部分非常重要,面试中只要是涉及到网络这一部分知识,几乎是必定会考传输层TCP的.
🐎文章专栏: JavaEE初阶
🚀若有问题 评论区见
欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .

王子,公主请阅🚀

  • 要开心
    • 要快乐
      • 顺便进步
  • 1. 应用层
  • ★2. 传输层
    • 2.1 端口号
    • 2.2 UDP协议
    • 2.3 TCP协议
      • 2.3.1 TCP协议格式
      • 2.3.2 TCP的特点
      • ★2.3.3 TCP传输数据时的重要过程

要开心

要快乐

顺便进步

1. 应用层


应用层和程序员接触最密切, 上一篇文章写回显TCP代码,其实就是应用层中的应用程序.
在应用层这里,很多时候都是程序员"自定义"应用层协议.

比如: 客户端向服务器发送请求时,要按程序员约定好的格式发送.
服务器向客户端发送响应时要按程序员约定好的格式发送.
发送的格式就是程序员自定义的应用层协议.

当然,也有一些现成的应用层协议:

① xml 这是"上古时期"的组织数据的格式了,通过标签来组织数据. 目前很少用于网络通信.
优点: 数据可读性强
劣势: 标签写起来非常繁琐,传输的时候也占用更多的网络带宽.
具体格式如下:

在这里插入图片描述

② json 当下最流行的一种数据组织格式,通过键值对结构来组织数据.
优点: 可读性高,比 xml 更加简洁.
劣势: 在网络传输中,同样会消耗额外的带宽.
具体格式如下:

在这里插入图片描述

③ protobuffer 使用二进制的方式来组织数据.
优势: 占用带宽最低,传输效率最高, 非常适合性能要求高的场景.
劣势: 可读性非常弱, 影响开发效率.
注意: 影响开发效率这一缺点是非常致命的 ,相较于计算机的执行效率来说, 程序员的开发效率是更重要的.



★2. 传输层

传输层这一部分,既是面试的考点,也是工作中的常用内容. 非常重要.

UDP: 无连接,不可靠,面向数据报,全双工.
TCP: 有连接,可靠传输,面向字节流,全双工 .

2.1 端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序;
写一个服务器,必须手动指定一个端口号,通过端口来区分当前这个主机上的不同的应用程序.
写一个客户端,客户端在通信的时候也会有一个端口号,该端口号由系统自动分配的.
在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信.

Ⅰ 端口号范围划分

① 0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.

② 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

Ⅱ 认识知名端口号

① ssh服务器, 使用22端口.
② http服务器, 使用80端口.
③ https服务器, 使用443端口.
④ ftp服务器, 使用21端口.
⑤ telnet服务器, 使用23端口.
我们自己写一个程序使用端口号时, 要避开这些知名端口号.

Ⅲ 关于端口号的两个问题

① 一个进程是否可以bind多个端口号?

② 一个端口号是否可以被多个进程bind?

2.2 UDP协议

Ⅰ UDP协议端格式:详细见-> RFC标准文档

在这里插入图片描述

这样来看更加直观:
在这里插入图片描述
注意: 端口号和 ip 虽然写代码的时候总是一起用,但它们并不在同一层, 源 ip 和 目的 ip 在网络层的ip协议中


① 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度.
2个字节的长度大概就是64kb,这在上个世纪80年代,确实不算少, 但是现在64kb是很小的.
所以使用 UDP协议 的时候,难以表示一个很大的数据报

② 如何基于校验和来完成数据校验?
1. 发送方,把要发送的数据整理好(称为 data1),通过一定的算法,计算出校验和 checksum1.
2. 发送方把 data1 和 checksum1 一起通过网络发送出去.
3. 接收方收到数据,收到的数据称为 data2(数据可能和 data1 就不-样了),收到数据 checksum1.
4. 接收方再根据 data2 重新计算校验和(按照相同的算法),得到 checksum2.
5. 对比 checksum1 和 checksum2 是否相同.如果不同,则认为 dat2 和 data1 一定不相同.

③ 计算校验和的算法,本文只介绍两种:
1. UDP中使用的是CRC算法(循环冗余算法).
把当前要计算校验和的数据,每个字节,都进行累加,把结果保存到这个 两个字节的 变量中,累加过程中如果溢出,也没关系,
如果中间某个数据,出现传输错误,第二次计算的校验和就会和第一次不同.
CRC 这个算法其实不是特别的靠谱,导致两个不同的数据,得到相同的 CRC 校验和的概率比较大.例如: 前一个字节 少 1,后一个字节恰好 多 1.

2. md5算法.(md5在线加密文档 )
md5是利用一系列的公式, 来完成计算的. 此处只需知道md5算法的特点即可.

第一点: 加密结果定长. 无论原始数据多长,计算得到的 md5结果都是固定长度, 校验和短才方便网络传输.

第二点: 加密结果分散. 给定两个原始数据,哪怕绝大部分内容都一样,只要其中一个字节不同,得到的 md5 值都会差异很大. 这一特点,也说明了md5 非常适合作为 hash 算法.

第三点: md5算法不可逆. 给你一个原始数据,计算 md5非常容易. 给你 md5,还原出原始数据,计算量非常庞大,以至于超出了现有计算机的算力极限,理论上是不可行的.

Ⅱ UDP 的特点

① 无连接.
UDP 协议本身不会存储对端的信息. 要在发送数据的时候,显式指定要传输给谁.

//3. 把响应写回客户端.// 搞一个响应对象,DatagramPacket// 往DatagramPacket里构造刚才的数据,再通过send返回DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);

上述代码是 【网络编程】从零开始彻底了解网络编程(二) 这篇文章中第五节 使用UDP写回显服务器的一段代码,详细可看这篇文章.

② 不可靠传输. 在代码中体现不出来, 后面介绍TCP 协议的可靠传输一对比就能感知到.

③ 面向数据报, UDP是以DatagramPacket为单位进行传输的. 上述代码同样可以说明这一特点.

//3. 把响应写回客户端.// 搞一个响应对象,DatagramPacket// 往DatagramPacket里构造刚才的数据,再通过send返回DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);

④ 全双工, 通过一个socket,即可接收,又可发送.

//1. 读取请求并解析DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);//3. 把响应写回客户端.// 搞一个响应对象,DatagramPacket// 往DatagramPacket里构造刚才的数据,再通过send返回DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);

Ⅲ 基于UDP的应用层协议:

① NFS: 网络文件系统.
② TFTP: 简单文件传输协议.
③ DHCP: 动态主机配置协议.
④ BOOTP: 启动协议(用于无盘设备启动).
⑤ DNS: 域名解析协议.

2.3 TCP协议

2.3.1 TCP协议格式

在这里插入图片描述
16位源端口号和目的端口号和UDP相同,不再多说. 直接看到第四行:
TCP报头长度不是固定不变的,其中还保留了6位,这是TCP大佬设计时的一点小细节, 改进了UDP固定长度无法扩展的问题.



2.3.2 TCP的特点

① 有连接

//1. 通过accept方法,把内核中已经建立好的连接拿到应用程序.Socket clientSocket = serverSocket.accept();

② 可靠传输, TCP最最核心的特性,也是TCP设计的初心.

③ 面向字节流 ,inputStream和outputStream就是字节流对象.

try(InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream())

④全双工, 一个serverSocket即可接收信息,又可发送信息.

★2.3.3 TCP传输数据时的重要过程

可靠传输不是说发送方把数据能够100%的传输给接收方,而是:
发送方发出数据之后,能够知道接收方是否收到了数据,如果发现对方没收到,就可以通过一些手段来补救.

Ⅰ 确认应答

发送方把数据发给接收方之后,接收方收到数据就会给发送方返回一个 应答报文 (acknowledge, 简称ack).发送方,如果收到这个应答报文了,就知道自己的数据发送成功了.

我们来考虑数据接收的顺序问题. 假设有以下场景:

在这里插入图片描述
如果无法保证数据传输的顺序,就有可能出现下面情况:

在这里插入图片描述
好在上述问题TCP本身就能解决, TCP格式中序号的大小关系就决定了数据的先后顺序.

在这里插入图片描述

① 上述 TCP 数据包里一共有 1000 个字节的载荷数据.其中第一个字节的序号是1,就在 TCP 报头的序号字段中,写"1" . 由于一共是 1000 个字节,此时最后一个字节的序号自然就是1000 了. 但是 1000 这样的数据并没有在 TCP 报头中记录.
TCP 报头中记录的序号,是这一次传输的载荷数据中第一个字节的序号剩下其他字节的序号都需要依次推出. 在应答报文中, 就会在确认序号 字段中填写 1001.

② 通过特殊的 ack 数据包,里面携带的"确认序号"告诉发送方,哪些数据已经被确认收到了此时发送方,就心中有数了,就知道了自己刚发的数据是到了还是没到. (这其实就是可靠传输的体现).

③ 怎么确定主机B发过来的是ack数据包呢?
在这里插入图片描述

红圈中ack这一位如果是1,就表示当前数据包是一个应答报文,此时该数据包中的"确认序号子段"就能生效.

再多提一嘴:
TCP能够保证可靠传输,主要是以确认应答为主,其他机制为辅来实现可靠传输的.

Ⅱ 超时重传

确认应答描述的是一个比较理想的情况, 如果网络传输过程中出现丢包了, 发送方就势必无法收到 ack 了. 超时重传机制,针对确认应答,进行补充

① 为什么会出现丢包?

把网络想象成公路,全国公路组成一张公路网,错综复杂,在公路上有很多的收费站. 正常情况下,公路上很少出现堵车的情况, 但在一些节假日时(国庆)收费站这就会堵车. 可以把收费站理解成路由器/交换机. 一旦数据包太多就会堵在路由器/交换机上. 路由器处理"堵车"问题比较粗暴, 它不会把所有数据包都保存下来,而是保存一部分, 然后把大部分数据包直接丢掉.此时就出现了丢包的情况.

② 丢包了之后怎么办呢?

重传一下试试呗.无论是传输数据丢了还是返回的 ack 丢了,对于发送方来说虽然无法区分这两种情况,但是只要没收到接收方的 ack , 就会重传数据包.
假设每次发送数据包的丢包概率为10%, 那么两次传输都丢包的概率是1%.可以看到重传操作能大幅度地提升数据成功传输的概率.

③ 超时重传能够进一步保证可靠性,但同时也付出了代价:

重传会降低传输效率,同时TCP的复杂程度也变高了.

④ 发送方没收到接收方的ack, 何时进行重传?

发送方发出去数据之后, 会等待一段时间. 如果这个时间之内,ack 来了,自然就视为正常传输.如果到达这个时间之后,数据还没到,就会触发重传机制.
初始的等待时间,是可配置的.不同的系统上都不一定一样,也可以通过修改一些内核参数来引起这里的时间变化.
当 主机A 重传了数据后,还是没有收到 ack,第二次等待的时间就会比第一次更长.

⑤ 重传了数据包给B, 对于主机B来说,收到了两条一样的数据,inputStream.read,读出来的是两条一样的数据,必然会有问题.
就好像A转账给B两次50块, 第一次没成功,第二次成功了, B收到了50块,A扣款100块.
TCP 已经非常贴心的帮我们把这个问题解决了,TCP 会有一个"接收缓冲区"就是一个内存空间,会保存当前已经收到的数据,以及数据的序号. 接收方如果发现,当前发送方发来的数据,是已经在接收缓冲区中存在的,接收方就会直接把这个后来的数据给丢弃掉.确保应用程序进行 read 的时候,读到的是只有一条数据.

Ⅲ 连接管理
建立连接+断开连接

这部分知识就是面试中最经典的问题三次握手和四次挥手问题.

① TCP的三次握手

TCP 在建立连接的过程中,需要通信双方"打三次招呼"才能够完成建立连接.
实际开发中,主动发起连接的一方,就是客户端,被动接受的一方就是服务器.

三次握手过程,需要用到syn(同步报文段), 什么是同步报文段,怎么判断?

同步报文段也是一个特殊的 TCP 数据包,没有载荷,意味着它不携带业务数据.

在这里插入图片描述
当上述syn这一位为1时, 表示这个报文是一个同步报文段.如果这一位为0,则说明不是.

三次握手过程如下图:

在这里插入图片描述

看到上图问题就来了, 不是总共发送了四次数据包吗? 怎么才握手三次呢?
实际上,是因为B给A发送的 ack 和 syn 这两次可以合并成一次, 因为这两次传输都是内核响应的.

在这里插入图片描述

三次握手的三个重要作用
1. 投石问路, 确认当前网络是否畅通.
2. 让发送方和接收方都能确认自己的发送能力和接收能力是否正常.
3. 让通信双方针对一些重要的参数进行协商.

在这里插入图片描述
在这里插入图片描述

只看三次握手的部分:

在这里插入图片描述
② 断开连接: TCP的四次挥手

在这里插入图片描述
FIN是结束报文段

在这里插入图片描述

同样的如果红圈这一位是1,说明该数据包是结束数据包.

和 三次握手不同, 此处的四次挥手,能否把中间的两次交互合二为一呢? 不一定能,但正常情况下不能合并.

不能合并的原因是ACK 和 第二个 FIN 的触发时机是不同的.
ACK 是内核响应的.B 收到第一个 FIN,就会立即返回 ACK. 第二个 FIN 是应用程序的代码触发.B 这边调用了 close 方法才会触发 FIN.
从服务器收到 FIN(同时返回 ACK),再到执行到 close发起 FIN, 这中间要经历多少时间,经历多少代码,是不确定的,主要还是要看代码是怎么写的.

所以 前面的三次握手, ACK 和 第二个 syn 都是内核触发的. 同一个时机可以合并. 这里的四次挥手,ACK 是内核触发的,第二个 FIN 是应用程序执行 close 触发的.时机不相同,不能合并. 如果我这边代码 close 没写/没执行到, 第二个 FIN 就有可能一直发不出去的. 这个时候就是异常断开连接(没有挥完四次).
TCP 中还有一个机制,延时应答(下篇文章再说),能够拖延 ACK 的回应时间,一旦 ACK 滞后了,就有机会和下一个 FIN 合并在一起了.

四次挥手的详图如下:
在这里插入图片描述

TIME WAIT 状态存在的主要意义就是为了防止最后一个 ACK 丢失.

如果最后一个 ACK 丢了,站在 B 的角度,B 就会触发超时重传重新把刚才的 FIN 给传一遍.如果 A 没有进入 TIME WAIT 状态, 就意味着 A 这个时候就已经真的释放连接了此时重传的 FIN 也就没人能处理, 没人能返回 ACK 了.B 永远也收不到 ACK 了.




本篇博客到这里就结束啦, 感谢观看 ❤❤❤

🐎期待与你的下一次相遇😊😊😊

相关文章:

【网络原理】从零开始深入理解TCP的各项特性和机制.(一)

本篇博客给大家带来的是网络原理的相关知识.其中传输层这一部分非常重要,面试中只要是涉及到网络这一部分知识,几乎是必定会考传输层TCP的. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给…...

基于Pytorch的深度学习-第二章

2.1 CIFAR-10数据集简介 CIFAR-10数据集包含10个类别:plane、car、bird、cat、deer、dog、frog、horse、ship、truck,每个类别有6000张图片。其中训练集图片有50000张,测试集有10000张图片。训练集和测试集的生成方法是,分别从每…...

gitlab-ce容器镜像源(国内)

下载命令 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0 更多参考: https://docker.aityp.com/image/docker.io/gitlab/gitlab-ce:17.10.4-ce.0...

TinyVue v3.22.0 正式发布:深色模式上线!集成 UnoCSS 图标库!TypeScript 类型支持全面升级!

我们非常高兴地宣布,2025年4月7日,TinyVue发布了v3.22.0🎉。 本次 3.22.0 版本主要有以下重大变更: 支持深色模式增加基于 UnoCSS 的图标库更丰富的 TypeScript 类型声明支持 XSS 配置 详细的 Release Notes 请参考&#xff1a…...

Browser-Use WebUI:让AI自动使用浏览器帮你查询信息执行任务

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

使用PyTorch如何配置一个简单的GTP

目录 一、什么是GPT 1. Transformer Block 的核心结构​ ​2. 关键组件解析​ ​​(1) 掩码多头自注意力(Masked Multi-Head Self-Attention)​​ ​​(2) 前馈神经网络(FFN)​​ ​​(3) 层归一化(LayerNorm&…...

【FAQ】针对于消费级NVIDIA GPU的说明

概述 本文概述 HP Anyware 在配备消费级 NVIDIA GPU 的物理工作站上的关​​键组件、安装说明和重要注意事项。 注意:本文档适用于 NVIDIA 消费级 GPU。NVIDIA Quadro 和 Tesla GPU 也支持 HP Anyware 在公有云、虚拟化或物理工作站环境中运行。请参阅PCoIP Graphi…...

02_java的运行机制以及JDKJREJVM基本介绍

1、运行机制 2、JDK&JRE&JVM JDK 基本介绍 (1) JDK 的全称(Java Development Kit Java开发工具包) JDK JRE java的开发工具 [ java, javac, javadoc, javap等 ] (2)JDK是提供给Java开发人员使用的,其…...

go 的 net 包

目录 一、net包的基本功能 1.1 IP地址处理 1.2 网络协议支持 1.3 连接管理 二、net包的主要功能模块 2.1 IP地址处理 2.2 TCP协议 2.3 UDP协议 2.4 Listener和Conn接口 三、高级功能 3.1 超时设置 3.2 KeepAlive控制 3.3 获取连接信息 四、实际应用场景 4.1 Web服…...

ShenNiusModularity项目源码学习(21:ShenNius.Admin.Mvc项目分析-6)

菜单列表页面用于新建、维护及删除系统所有模块所需的菜单信息,包括菜单名称、菜单中的按钮、菜单关联的后台服务地址及请求方式等。菜单列表页面的后台控制器类MenuController位于ShenNius.Admin.Mvc项目的Areas\Sys\Controllers内,页面文件位于同项目的…...

基于单片机的游泳馆智能管理系统

标题:基于单片机的游泳馆智能管理系统 内容:1.摘要 随着人们生活水平的提高,游泳馆的规模和客流量不断增大,传统的管理方式已难以满足高效、便捷的管理需求。本研究的目的是设计并实现一种基于单片机的游泳馆智能管理系统。方法上,采用单片机…...

开发了一个b站视频音频提取器

B站资源提取器-说明书 一、功能说明 本程序可自动解密并提取B站客户端缓存的视频资源,支持以下功能: - 自动识别视频缓存目录 - 将加密的.m4s音频文件转换为标准MP3格式 - 将加密的.m4s视频文件转换为标准MP4格式(合并音视频流)…...

vue2项目,为什么开发环境打包出来的js文件名是1.js 2.js,而生产环境打包出来的是chunk-3adddd.djncjdhcbhdc.js

Vue2项目开发环境与生产环境JS文件名差异的核心原理及配置逻辑如下: 一、文件名差异的底层机制 1‌、Webpack默认命名策略‌ 开发环境默认禁用哈希,采用[id].js命名规则(如1.js),生产环境启用[chunkhash]生成chunk-xxx…...

SQL进阶知识:六、动态SQL

今天介绍下关于动态SQL的详细介绍,并结合MySQL数据库提供实际例子。 动态SQL是指在运行时动态构建和执行SQL语句的技术。这种技术在处理复杂的查询逻辑、参数化查询或在某些情况下需要根据用户输入动态调整查询时非常有用。MySQL支持动态SQL,主要通过PRE…...

Spring Boot常用注解详解:实例与核心概念

Spring Boot常用注解详解:实例与核心概念 前言 Spring Boot作为Java领域最受欢迎的快速开发框架,其核心特性之一是通过注解(Annotation)简化配置,提高开发效率。注解驱动开发模式让开发者告别繁琐的XML配置&#xff…...

java 富文本转pdf

前言: 本文的目的是将传入的富文本内容(html标签,图片)并且分页导出为pdf。 所用的核心依赖为iText7。 因为itextpdf-core的核心包在maven中央仓库中,阿里云华为云等拉不下来,中央仓库在外网,并且此包在中央仓库中未…...

17.第二阶段x64游戏实战-人工遍历二叉树结构

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:16.第二阶段x64游戏实战-分析二叉树结构 上一个内容里把二叉树的结构写了写&am…...

C#基于Sunnyui框架和MVC模式实现用户登录管理

C#基于Sunnyui框架和MVC模式实现用户登录管理 1 Controller1.1 UserManagementController.cs(控制器入口) 2 Model2.1 UserRepository.cs(用户管理模型)2.2 User.cs(用户结构体)2.3 SQLiteHelper.cs&#x…...

Spring Boot实战(三十六)编写单元测试

目录 一、什么是单元测试?二、Spring Boot 中的单元测试依赖三、举例 Spring Boot 中不同层次的单元测试3.1 Service层3.2 Controller 层3.3 Repository层 四、Spring Boot 中 Mock、Spy 对象的使用4.1 使用Mock对象的背景4.2 什么是Mock对象,有哪些好处…...

声音分离人声和配乐-从头设计数字生命第4课——仙盟创梦IDE

音频分离在数字人中具有多方面的重要作用,主要体现在以下几个方面: 提高语音合成质量:通过音频分离,可以将原始音频中的语音部分与其他背景噪音或干扰声音分离开来。这样在进行语音合成时,能够获得更纯净的语音信号&am…...

http协议、全站https

一、http协议 1、为何要学http协议? 用户用浏览器访问网页,默认走的都是http协议,所以要深入研究web层,必须掌握http协议 2、什么是http协议 1、全称Hyper Text Transfer Protocol(超文本传输协议) ### 一个请求得到一个响应包 普通…...

Mediamtx与FFmpeg远程与本地推拉流使用

1.本地推拉流 启服 推流 ffmpeg -re -stream_loop -1 -i ./DJI_0463.MP4 -s 1280x720 -an -c:v h264 -b:v 2000k -maxrate 2500k -minrate 1500k -bufsize 3000k -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 拉流 ffplay -rtsp_transport tcp rtsp://43.136.…...

css3新特性第七章(3D变换)

css新特性第七章(3D变换) 一、3d空间和景深 元素进行 3D 变换的首要操作:父元素必须开启 3D 空间! 使用 transform-style 开启 3D 空间,可选值如下: flat : 让子元素位于此元素的二维平面内( 2D 空间&…...

redis经典问题

1.缓存雪崩 指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。 解决方案: 1)Redis 高可用,主从哨兵,Redis cluster,避免全盘崩…...

数据仓库是什么?数据仓库架构有哪些?

目录 数据仓库是什么?数据仓库架构有哪些? 一、数据仓库是什么? 二、数据仓库的架构分层 1. 获取层 2. 数据层 3. 应用层 4. 访问层 三、数据仓库的价值体现 1.决策支持 2.业务优化 3.提升竞争力 四、数据仓库的未来发展趋势 总…...

Nginx 通过 Let‘s Encrypt 实现 HTTPS 访问全流程指南

一、Let’s Encrypt 与 Certbot 简介 Let’s Encrypt 是由非营利组织 ISRG 运营的免费证书颁发机构(CA),旨在推动 HTTPS 的普及。其核心工具 Certbot 能自动化完成证书申请、部署与续期,大幅降低 HTTPS 的配置复杂度。通过 Certb…...

网络知识:路由器静态路由与动态路由介绍

目录 一、静态路由 1.1 什么是静态路由? 1.2 静态路由的好处 1.3 静态路由的局限 1.4 静态路由应用场景 微型办公室网络 性能要求高业务流量 安全性要求高的环境 二、动态路由 2.1 什么是动态路由? 2.2 动态路由的好处 2.3 动态路由的局限 2.4 动态路由的应用场…...

LLaMA3微调全流程:从LoRA到QLoRA,7B参数模型推理速度提升4倍的代码实战

LLaMA3微调全流程:从LoRA到QLoRA,7B参数模型推理速度提升4倍的代码实战 发现了一个巨牛的人工智能学习网站,分享一下给大家!https://www.captainbed.cn/ccc 前言 在大模型时代,LLaMA系列作为开源社区的明星模型&#…...

日内组合策略思路

一、策略概述 本策略是一种针对日内交易设计的策略,其核心在于通过识别市场趋势和突破信号,结合动态止损和止盈机制,实现日内交易的盈利。策略以金字塔式的加仓方式控制风险,并通过灵活的平仓策略锁定收益。 二、交易逻辑思路 市场…...

从空气污染监测到嵌入式仿真教学:基于STM32与MQ135的实践探索

一、嵌入式系统在环境监测中的技术演进 随着全球城市化进程加速,世界卫生组织(WHO)数据显示,92%的人口长期暴露于超标PM2.5环境中。在此背景下,基于STM32微控制器的智能监测系统因其高性价比(单节点成本低…...

【数据结构】Map与Set结构详解

数据结构系列五:Map与Set(一) 一、接口的实现 1.方法上 2.成员上 二、Map的内外双接口结构 1.实现 1.1外部Map接口的实现 1.1.1临摹整体 1.1.2外部类实现整体 1.2内部Entry接口的实现 1.2.1临摹内部 1.2.2内部类实现内部 2.关系 3.意义 3.1逻辑内聚 …...

银河麒麟(内核CentOS8)安装rbenv、ruby2.6.5和rails5.2.6

一、安装 rbenv 和 ruby-build 1.安装 rbenv git clone https://github.com/rbenv/rbenv.git ~/.rbenv 2. 添加 rbenv 到 PATH echo export PATH"$HOME/.rbenv/bin:$PATH" >> ~/.bashrc echo eval "$(rbenv init -)" >> ~/.bashrc source ~…...

豆包桌面版 1.47.4 可做浏览器,免安装绿色版

自己动手升级更新办法: 下载新版本后安装,把 C:\Users\用户名\AppData\Local\Doubao\Application 文件夹的文件,拷贝替换 DoubaoPortable\App\Doubao 文件夹的文件,就升级成功了。 再把安装的豆包彻底卸载就可以。 桌面版比网页版…...

Linux 命令行与 vi/vim 编辑器完全指南

一、Linux 命令行基础 (一)命令与命令行简介 命令:Linux 系统内置的操作指令,以字符化形式使用,用于指示系统执行特定任务。 命令行(终端):提供字符化的操作界面,用户通…...

海量聊天消息处理:ShardingJDBC分库分表、ClickHouse冷热数据分离、ES复合查询方案、Flink实时计算与SpringCloud集成

海量聊天消息处理:ShardingJDBC分库分表、ClickHouse冷热数据分离、ES复合查询方案、Flink实时计算与SpringCloud集成 一、背景介绍 每天有2000万条聊天消息,一年下来几千万亿海量数据。为应对这种规模的数据存储和处理需求,本文将从以下几…...

金融系统上云之路:云原生后端架构在金融行业的演化与实践

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:为什么金融行业也要“云原生”? 金融行业素来以“安全第一、稳定优先”著称,面对每日亿级交易请求、秒级风控响应、PB级数据处理,系统稳定性和性能要求极高。长期以来,大型金融机构往…...

每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)

[洛谷 P1226] 快速幂求模题解 📌 题目链接 https://www.luogu.com.cn/problem/P1226 📝 题目描述 给定正整数 a、b 和质数 p,要求计算: a^b % p其中: 1 ≤ a ≤ 10^90 ≤ b ≤ 10^92 ≤ p ≤ 10^9 &#x1f4a1…...

深度学习小记(包括pytorch 还有一些神经网络架构)

这个是用来增加深度学习的知识面或者就是记录一些常用的命令,会不断的更新 import torchvision.transforms as transforms toPIL transforms.ToPILImage()#可以把tensor转换为Image类型的 imgtoPIL(img) #利用save就可以保存下来 img.save("/opt/data/private/stable_si…...

Spring Boot默认缓存管理

Spring框架支持透明地向应用程序添加缓存,以及对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法,从而减少操作数据的执行次数,同时不会对程序本身造成任何干扰。Spring Boot继承了Spring框架的缓存管理功能&#xff…...

倚光科技:微透镜阵列低成本加工新范式

在光通信、机器视觉、生物医学成像等前沿领域,微透镜阵列凭借其独特的光学特性成为不可或缺的核心部件。然而,传统加工方式往往面临成本高、效率低、精度难控等困境。倚光科技深耕光学加工领域多年,创新运用单点金刚石车床技术,成…...

Vue+Flask豆瓣LSTM影评+推荐算法大数据可视化平台深度学习系统源码

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: F011 视频介绍 VueFlask豆瓣LSTM影评推荐算法大数据可视化平台深度学习系统源码(2023重制) 1…...

【MySQL】基本查询

目录 增加 查询 基本查询 where子句 结果排序 筛选分页结果 修改(更新) 删除 普通删除 截断表 插入查询结果 聚合函数 分组查询 这一节的内容是对表内容的增删查改,其中重点是表的查询 增加 语法: INSERT [INTO] table_name [(column [, …...

hive默认的建表格式

在 Hive 中创建表时,默认的建表语法格式如下: CREATE TABLE table_name (column1_type,column2_type,... ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;在这个语法中: CREATE TABLE table_name:指定要创建…...

配置RSUniVLM环境(自用)

首先git clone这个仓库,但是好像不太行,就直接下载下来吧 创个容器弄,容器里需要conda gpu 镜像的话 在dockerhub找到了一个:docker pull vkashyap10/llava-next 下载在了 ssh root10.12.107.240 amos123 这个机器上。等会看…...

产品经理对于电商接口的梳理||电商接口文档梳理与接入

接口梳理7个注意点总结 ①注意要测试环境和生产环境。生产上线时候要提醒研发换到生产环境调用。 ②注意必输字段和选输字段,要传入字段的含义和校验。枚举值不清楚含义的要询问对方含义,比如说单据类型字段枚举值是B2C发货单,BBC发货单&am…...

深入探索Spark-Streaming:从Kafka数据源创建DStream

在大数据处理领域,Spark-Streaming是一个强大的实时流处理框架,而Kafka作为高性能的分布式消息队列,二者结合能实现高效的数据处理。今天就来聊聊Spark-Streaming中从Kafka数据源创建DStream的相关知识。 早期,Spark-Streaming通过…...

R 语言科研绘图第 41 期 --- 桑基图-基础

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

基于STM32的汽车主门电动窗开关系统设计方案

芯片和功能模块选型 主控芯片 STM32F103C8T6:基于 ARM Cortex - M3 内核,有丰富的 GPIO 接口用于连接各类外设,具备 ADC 模块可用于电流检测,还有 CAN 控制器方便实现 CAN 总线通信。它资源丰富、成本低,适合学生进行 DIY 项目开发。按键模块 轻触按键:用于控制车窗的自…...

Spring Boot 配置处理器深度解析:元数据驱动的工程实践

Spring Boot 配置处理器深度解析:元数据驱动的工程实践 引言:为什么关注配置处理器? 在 Spring Boot 中,spring-boot-configuration-processor 是支撑“配置即文档”“配置即代码”的基础设施。它通过编译期生成结构化的配置元数…...

深入详解人工智能数学基础——概率论中的贝叶斯深度学习

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...