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

Linux系统:网络

目录

一、网络协议

1.网络协议概念

2.协议分层

3.OSI七层模型和TCP/IP五层(或四层)模型

4.为什么要有网络协议?

5.网络通信协议的原理

二、网络传输的基本流程

1.局域网的网络传输流程

1.MAC地址

2.局域网通信原理(以太网为例)

3.协议的封装和解包、分用

2. 跨网络传输流程图

1.IP地址

2.跨网络通信原理

​编辑3.IP地址对比MAC地址

三、Socket编程预备知识

1.端口号Port

2.端口号和进程ID的区别

3.理解Socket

4.认识传输层中的典型协议

5.网络字节序

6.Socket编程接口

(1)创建 socket 文件描述符(TCP/UDP, 客户端 + 服务器)

(2)绑定端口号 (TCP/UDP, 服务器)

(3)开始监听socket (TCP, 服务器)

(4)接收请求 (TCP, 服务器)

(5)建立连接 (TCP, 客户端)

(6)接收数据(UDP,服务端)

(7)发送数据sendto

7.关于sockaddr结构体

(1)struct sockaddr_in

(2)struct sockaddr_un


一、网络协议

1.网络协议概念

计算机之间的传输媒介是光信号和电信号,通过“频率”和“强弱”表示0或1。如果想要传递各种各样的信息,就要约定好双方通信信息的数据格式。

为了让不同厂商生产的计算机可以相互通畅地通信,就需要约定一个共同的通信标准,所有人都要遵守,这个共同的通信标准就是网络协议。

2.协议分层

协议本质是一个软件,协议分层是为了实现解耦合,让软件维护成本更低。

例如下图:将协议分层为两层:语言层和通信设备层。以打电话为例,逻辑上是两个人在直接通信,但实际上是需要通过电话来传输信息,电话机之间遵循的时电话间之间的协议,人与人之间遵循的是汉语协议。

如果将电话机通信改为无线电通信,那么通信设备层之间遵循的就是无线电协议;如果将汉语改为英语,那么语言层之间遵循的就是英语协议。

实际上的网络通信协议设计地更复杂,需要分为更多层。

3.OSI七层模型和TCP/IP五层(或四层)模型

 OSI七层模型是开放式系统互联参考模型, 是一个逻辑上的定义和规范。将网络通信协议从逻辑上分为了7层,但是实际实现时OSI七层模型比较复杂冗余,所以真正采用的是TCP/IP五层(或四层)模型。TCP/IP五层(或四层)模型将OSI七层模型中的应用层、表示层和会话层合为一个层。又由于物理层考虑的比较少,所以TCP/IP模型也叫做四层模型。

TCP/IP五层(或四层)模型是一组协议的代名词,它其中还包括许多其他协议,共同组成了TCP/IP协议簇。

  • 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆 (现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决 定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
  • 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测 到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太 网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
  • 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规 划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
  • 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标 主机.
  • 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问 协议(Telnet)等. 我们的网络编程主要就是针对应用层

4.为什么要有网络协议?

首先,即使是一个计算机,其内部也存在各种协议,例如其他设备和内存之间的通信协议、其他设备和磁盘的通信协议等。而网络协议是为了解决计算机之间的通信,其存在的本质原因是通信距离变远了。

例如主机A和主机B通信,但是距离较远,就需要考虑许多问题:

  • 主机A将数据传输给主机B,首先要将数据传输给路由器,怎么传输给路由器?
  • 网络上存在大量其他主机,如何定位并找到主机B?
  • 数据传输过程中丢失了怎么办?
  • 主机A将数据传输给主机B不是目的,只是手段,主机B接收到数据后如何处理使用?

因此设计了TCP/IP通信协议,其本质是一种解决方案。

5.网络通信协议的原理

在TCP/IP通信协议分层中,其中传输层为TCP,网络层为IP,这两层都是在操作系统中实现C/C++语言实现的,所以对于相同的数据结构,两台计算机都能认识就完成了通信。

所以通信协议的本质是,通信双方都认识结构化的数据类型

二、网络传输的基本流程

1.局域网的网络传输流程

1.MAC地址

每台主机在局域网中,都要有一个唯一标识来保证主机的唯一性,即MAC地址

MAC地址用来识别数据链路层中相连的节点,长度为48位(6个字节),一般使用16进制数字加上冒号的形式来表示(例如08:00:27:03:fb:19)

MAC地址在网卡出厂时就确定了,不可修改,所以MAC地址是唯一的

虚拟机中的MAC地址不是真实的MAC地址,可能会与已存在的MAC地址发生冲突

2.局域网通信原理(以太网为例)

两台计算机在同一个以太网下,就可以直接通信。

如果同一个以太网下有多台主机,主机A给主机B传输数据,其他所有主机包括主机B都会接收到数据,但是这样很明显不可以。所以每个主机都会有一个MAC地址,主机A在给主机B传输数据时会带上主机B的MAC地址,其他主机收到数据时对比MAC地址,不是自己的MAC地址就会丢弃数据,是自己的MAC地址才会接收处理数据。

以太网通信特点:

  • 以太网中,任何时刻只允许一台主机向网络中发送数据
  • 如果有多台主机同时向网络中发送数据,就会有数据干扰,称为数据碰撞
  • 主机在向网络中发送数据之前要先进行碰撞检测和碰撞避免
  • 没有交换机的情况下,以太网就是一个碰撞域 
3.协议的封装和解包、分用

两台主机在以太网中通信:

每一层都有不同的协议,所以在进行数据传输时每一层都要进行封装和解包。所谓报头就是对应协议层的结构体字段,除了报头剩下的叫做有效载荷,报头+有效载荷=报文。

例如主机1给主机2发送数据“你好”,其数据传输过程以及封装和解包的过程如下:

主机1中数据包从应用层到网卡层的过程叫做封装,封装就是每层协议为数据包加上一个数据首部,包含了诸如首部有多长、有效载荷有多长、上层协议是什么等信息。

主机2中数据包从网卡层到应用层的过程叫做解包,由于每层可能会有多种协议,将解包后的数据包交给哪一个协议的过程叫做分用。解包就是协议去除掉数据包相应的首部数据,再将数据包交给上层协议处理。

综上,协议对于数据包的封装和解包的过程,十分类似入栈和出栈,所以协议又叫做协议栈

2. 跨网络传输流程图

1.IP地址

IP地址是存在于IP协议中的,用于标识网络中不同主机的地址。IP协议有两个版本:IPv4和IPv6。

对于IPv4来说,IP地址是一个4字节(32位)的整数,或者通常采用“点分十进制”的字符串表示IP地址,例如 192.168.0.1 ,点号分割的每一个数字表示一个字节,范围是0 - 255

2.跨网络通信原理

路由器连接着两个网卡,即路由器连接着两个不同的局域网

用户A发送的报文经过主机1的网络层协议封装后,发现目标IP地址不是当前局域网的,即报文不是发送给主机1所在的局域网的,所以要将报文继续向下封装后交给路由器,再由路由器解包到达网络层发现目标IP地址是自己所连接局域网中的IP地址,所以路由器重新封装报文到达网卡层,再由路由器的网卡层传输给主机2的网卡层,主机2再进行相应的解包,完成跨网络通信。

所以网络层也叫IP层,网络层之上包括网络层不管是局域网通信还是跨网络通信,它们的报文都是一样的。因此使用IP地址可以屏蔽底层网络的差异,提供了网络虚拟层,让所有的网络都是IP网络

因此无论是使用无线网、数据网或者其他网络,它们都可以连接网络相互通信。

3.IP地址对比MAC地址

IP地址在跨网络中标识主机设备的唯一性,MAC地址只在局域网中标识主机设备的唯一性

IP地址在整个路由过程中一直不变,MAC地址一直在变

IP地址是一种长远目标,MAC地址是下一阶段目标

IP地址是路径选择的重要依据,MAC地址是局域网转发的重要依据

如下图,IP地址一直不变,而MAC地址要经过许多路由器而一直在变化:

三、Socket编程预备知识

Socket编程是传输层供给应用层的编程接口,是应用层与传输层之间的桥梁。

使用Socket编程可以开发客户机和服务器应用程序,这些程序能够在本地网络上进行通信,也可通过Internet在全球范围内通信。

1.端口号Port

主机之间通过网络完成数据传输不是目的,真正的目的是要将数据交给系统中的进程。进程是人在系统中的代表,只要把数据交给进程,就相当于人拿到了数据。

系统中存在许多进程,数据传输给目标主机后需要再将数据传给目标进程,这就需要唯一标识进程——使用端口号唯一标识进程

端口号是传输层协议的内容,是一个2字节16位的整数。IP地址+端口号就可以唯一标识某一台主机的某一个进程。

一个进程可以绑定多个端口号,但是一个端口号只能唯一标识一个进程。

端口号的范围划分:

0-1023是知名端口号,例如为HTTP、FTP、SSH等广为使用的应用层协议;1024-65535是操作系统为系统进程动态分配的端口号。

2.端口号和进程ID的区别

端口号可以唯一标识进程,进程ID也可以唯一标识进程,为什么不使用进程ID来替代端口号呢?

从技术角度来说,确实可以实现使用进程ID来替代端口号,但是这样会导致系统进程管理和网络强耦合。此外并不是所有的系统进程都需要进行网络通信,只有部分进程才需要网络通信,才需要端口号。

3.理解Socket

综上所述,IP地址用来标识互联网中唯一的一台主机,port用来标识该主机上唯一的一个网络进程。所以IP+Port可以表示互联网中唯一的一个进程。

网络通信本质是进程间通信,使用{srcIP, srcPort,dstIP,dstPort}这样的4元组就能标识互联网中唯二的两个进程。

IP+Port叫做套接字Socket

4.认识传输层中的典型协议

1.TCP(Transmission Control Protocol 传输控制协议):

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

2.UDP(UserDatagramProtocol 用户数据报协议):

无连接、不可靠传输、面向数据报

5.网络字节序

计算机中的字节数据有大端和小端存储方式之分,所以网络数据流同样也会有大小端之分。如果一个采用大端存储方式的机器向一个采用小端存储的机器发送数据,就会产生错误。

因此TCP/IP协议规定:网络数据流必须采用大端字节序!即从网络中读取到的数据流一定是大端字节序的,因此我们还需要进行网络字节序和主机字节序的转换。

因为发送主机通常会缓冲区的数据按照内存地址从低到高的顺序发出,接收主机将从网络中接收到的字节保存在缓冲区同样是按照内存地址由低到高保存,先将数据保存到低地址再到高地址。例如数据0x1234abcd,发送主机按照0x12 0x34 0xab 0xcd顺序发出,接收主机将这些数据按照接收顺序将它们依次存储在缓冲区的低地址到高地址:0x12 0x34 0xab 0xcd。这正好符合大端存储模式,所以规定网络数据流必须采用大端字节序,对于采用小端存储模式的机器要先将数据转换为大端存储模式再发送。

 接下来是网络字节序和主机字节序转换的库函数:

6.Socket编程接口

头文件:#include <sys/types.h> #include <sys/socket.h>

(1)创建 socket 文件描述符(TCP/UDP, 客户端 + 服务器)

int socket(int domain, int type, int protocol);

创建一个套接字系统调用,相当于打开了网卡

domain:指定协议族,常见协议族包括

  • AF_INET:IPv4 协议族。
  • AF_INET6:IPv6 协议族。
  • AF_UNIX 或 AF_LOCAL:本地进程间通信(IPC)。
  • AF_UNSPEC:未指定协议族。

type:指定套接字类型,常见套接字类型包括

  • SOCK_STREAM:流式套接字,用于面向连接的 TCP 服务。
  • SOCK_DGRAM:数据报套接字,用于无连接的 UDP 服务。
  • SOCK_RAW:原始套接字,允许直接操作 IP 层或更低层的协议。

protocol:通常设置为0,表示选择默认协议

返回值:成功返回一个非负文件描述符(可用于后续套接字操作:绑定、监听、连接、发送和接收);失败返回 -1,并设置全局变量 errno 以指示错误类型。

关于文件描述符:Linux系统中一切皆文件,创建套接字相当于打开了网卡设备,网课也是一个文件,所有返回的相当于是网卡的文件描述符。

(2)绑定端口号 (TCP/UDP, 服务器)

int bind(int socket, const struct sockaddr *address, socklen_t address_len);

将一个套接字与一个特定的地址绑定(通常是IP地址和端口号),当这个套接字用于网络通信时就可以将数据发送到绑定的地址中,或者从绑定的地址中接收数据。

套接字将监听发送到其绑定地址的数据。

socket:文件描述符

address:指向sockaddr结构体的指针,结构体中包含了要绑定的地址信息。sockaddr通常有sockaddr_in(IPv4)、sockaddr_in6(IPv6)、sockaddr_un

address_len:address指向的结构体的长度

返回值:成功返回0,失败返回-1并设置全局变量 errno 来指示错误类型。

(3)开始监听socket (TCP, 服务器)

int listen(int socket, int backlog);

(4)接收请求 (TCP, 服务器)

int accept(int socket, struct sockaddr* address, socklen_t* address_len);

(5)建立连接 (TCP, 客户端)

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

(6)接收数据(UDP,服务端)

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

在UDP协议通信时,使用recvfrom函数接收来自发送到套接字绑定地址的数据包,并将接收到的数据包存储在缓冲区buf中

sockfd:文件描述符

buf:用于存储接收到的数据包

len:缓冲区的大小

flags:标志位,通常设置为0,可以修改为其他标志位例如MSG_PEEK 标志允许你查看数据而不从队列中移除它

src_addr:存储源地址信息,即从哪里接收到的数据包(输入输出型参数)

addrlen:存储src_addr中地址的长度

返回值:成功返回接收到的数据字节数,失败返回-1,并设置 errno 以指示错误类型

(7)发送数据sendto

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

将数据发送到指定的地址(IP地址+端口号)

sockfd:文件描述符

buf:指向发送数据所在缓冲区的指针

len:要发送数据所在缓冲区的大小

flags:标志位,通常设置为0,可以设置为其他值以改变发送行为,如MSG_DONTROUTE(指出数据不提交给路由选择)

dest_addr:发送的目标地址

addrlen:存储dest_addr中地址的长度

返回值:成功返回发送数据的字节数,失败返回-1并设置全局变量errno以指示错误原因

(8)关闭网络套接字

#include <unistd.h>

int close(int fd);

返回值:成功返回0,失败返回 -1并设置全局变量 errno 以指示错误原因

7.关于sockaddr结构体

头文件:#include <netinet/in.h> #include <arpa/inet.h>

#include <sys/socket.h>
struct sockaddr {sa_family_t sa_family; // 地址族char        sa_data[14]; // 地址数据,具体含义取决于地址族
};

struct sockaddr是一个通用的套接字结构体,它包含了地址族(sa_family)和地址数据(sa_data)等信息,但是struct sockaddr没有针对特定协议进行详细划分(例如IPv4、IPv6 或 UNIX域 ),因此直接使用struct sockaddr会导致编程上的复杂和错误。

因此引入了struct sockaddr_in和struct sockaddr_un,但是它们的第一个字段都是相同的sa_family_t类型,所以为了兼容性和灵活性,需要将struct sockaddr_in和struct sockaddr_un强制类型转换为struct sockaddr类型,再传给系统调用。

补充:地址族sa_family的作用:指定套接字通信的协议类型(IPv4、IPv6、UNIX域)

(1)struct sockaddr_in

专门用于IPv4网络通信

将地址数据sa_data细分为:端口号sin_port、IP地址sin_addr、填充字节sin_zero等信息

#include <netinet/in.h>
struct sockaddr_in {sa_family_t    sin_family; // 地址族,对于 IPv4 来说是 AF_INETuint16_t       sin_port;   // 端口号,使用网络字节序(大端序)struct in_addr sin_addr;   // IPv4 地址char           sin_zero[8];//填充字节,确保结构体大小与 sockaddr 一致
};
// 其中 struct in_addr 是一个嵌套的结构体,通常定义如下:
struct in_addr {uint32_t s_addr; // IPv4 地址,要使用网络字节序
};
(2)struct sockaddr_un

专门用于UNIX域套接字通信(同一台机器中的进程通信)

结构体中包括:地址族sun_family、套接字路径名sun_path等信息

#include <sys/un.h>
struct sockaddr_un {sa_family_t sun_family; // 地址族,对于 UNIX 域套接字来说是 AF_UNIX 或 AF_LOCALchar        sun_path[108]; // 套接字路径名
};

相关文章:

Linux系统:网络

目录 一、网络协议 1.网络协议概念 2.协议分层 3.OSI七层模型和TCP/IP五层&#xff08;或四层&#xff09;模型 4.为什么要有网络协议&#xff1f; 5.网络通信协议的原理 二、网络传输的基本流程 1.局域网的网络传输流程 1.MAC地址 2.局域网通信原理&#xff08;以太网…...

shodan2-批量查找CVE-2019-0708漏洞

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…...

面向对象(二)——类和对象(上)

1 类的定义 做了关于对象的很多介绍&#xff0c;终于进入代码编写阶段。 本节中重点介绍类和对象的基本定义&#xff0c;属性和方法的基本使用方式。 【示例】类的定义方式 // 每一个源文件必须有且只有一个public class&#xff0c;并且类名和文件名保持一致&#xff01; …...

Redis3——线程模型与数据结构

Redis3——线程模型与数据结构 本文讲述了redis的单线程模型和IO多线程工作原理&#xff0c;以及几个主要数据结构的实现。 1. Redis的单线程模型 redis6.0之前&#xff0c;一个redis进程只有一个io线程&#xff0c;通过reactor模式可以连接大量客户端&#xff1b;redis6.0为了…...

linux 获取公网流量 tcpdump + python + C++

前言 需求为&#xff0c;统计linux上得上下行公网流量&#xff0c;常规得命令如iftop 、sar、ifstat、nload等只能获取流量得大小&#xff0c;不能区分公私网&#xff0c;所以需要通过抓取网络包并排除私网段才能拿到公网流量。下面提供了一些有效得解决思路&#xff0c;提供了…...

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…...

pytest(二)excel数据驱动

一、excel数据驱动 excel文件内容 excel数据驱动使用方法 import openpyxl import pytestdef get_excel():excel_obj openpyxl.load_workbook("../pytest结合数据驱动-excel/data.xlsx")sheet_obj excel_obj["Sheet1"]values sheet_obj.valuescase_li…...

python蓝桥杯刷题3

1.解方程组解 题解&#xff1a;首先让a&#xff0c;b&#xff0c;c进行遍历&#xff0c;然后计算得到1000时输出结果&#xff0c;其次考虑1000开根号是多大&#xff0c;计算得到32的倍数是1024&#xff0c;所有选择&#xff08;1&#xff0c;32&#xff09;进行遍历&#xff0c…...

基于PySpark 使用线性回归、随机森林以及模型融合实现天气预测

基于PySpark 实现天气预测与模型集成 在大数据分析与机器学习领域&#xff0c;Spark 提供了强大的计算能力和灵活的扩展性。本文将介绍如何利用 PySpark 完成以下任务&#xff1a; 1、数据预处理&#xff1a;清洗和编码天气数据。 2、特征工程&#xff1a;合并数值和分类特征…...

Day 30 贪心算法 part04

今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙! 这种题还是属于那种,做过了也就会了,没做过就很难想出来。 不过大家把如下三题做了之后, 重叠区间 基本上差不多了 452. 用最少数量的箭引爆气球…...

dns实验3:主从同步-完全区域传输

服务器192.168.234.111&#xff08;主服务器&#xff09;&#xff0c;打开配置文件&#xff1a; 打开配置文件&#xff1a; 关闭防火墙&#xff0c;改宽松模式&#xff1a; 重启服务&#xff1a; 服务器192.168.234.112&#xff08;从服务器&#xff09;&#xff0c;打开配置文…...

数据结构 (20)二叉树的遍历与线索化

一、二叉树的遍历 遍历是对树的一种最基本的运算&#xff0c;所谓遍历二叉树&#xff0c;就是按一定的规则和顺序走遍二叉树的所有节点&#xff0c;使每一个节点都被访问一次&#xff0c;而且只被访问一次。二叉树的遍历方式主要有四种&#xff1a;前序遍历、中序遍历、后序遍历…...

【docker】Overlay网络

什么是 Overlay 网络&#xff1f; Overlay 网络是一种 Docker 网络驱动&#xff0c;允许容器在不同主机间通信。 它依赖分布式存储&#xff08;如 Swarm、Etcd 或 Consul&#xff09;来管理网络配置和路由。 Overlay 网络的核心特点 跨主机通信&#xff1a;容器可以跨物理主…...

基于智能语音交互的智能呼叫中心工作机制

在智能化和信息化不断进步的现代&#xff0c;智能呼叫中心为客户提供高质量、高效率的服务体验&#xff0c;提升众多品牌用户的满意度和忠诚度。作为实现智能呼叫中心的关键技术之一的智能语音交互技术&#xff0c;它通过集成自然语言处理&#xff08;NLP&#xff09;、语音识别…...

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题&#xff0c;避免了多线程对同一块临界资源访问产生的冲突&#xff0c;但同一时刻对临界资源的访问&#xff0c;不论是生产者还是消费者&#xff0c;都需要竞争互斥锁&#xff0c;由此也带来了竞争的问题。即生产者和消费者、消费…...

有趣的Docker

&#x1f449;【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中 1. Docker 上的“全世界”命令行 你可以在 Docker 容器中运行一个模拟的 “世界地图”&#xff0c;并通过命令行与它互动。这是一个非常有趣的项目&#xff0c;结合了命令行和图形界面的交互。…...

深入探讨锁升级问题

1. 引言 本文深入探讨锁升级问题。 2. 锁升级问题概述 2.1 锁升级的概念 2.1.1 定义 锁升级是指数据库管理系统将较低粒度的锁&#xff08;如行级锁&#xff09;转换为较高粒度的锁&#xff08;如表级锁&#xff09;的过程。这种情况通常发生在事务对同一对象的多个较低粒…...

MySQL篇—通过官网下载linux系统下多种安装方式的MySQL社区版软件

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…...

6.824/6.5840(2024)环境配置wsl2+vscode

本文是经过笔者实践得出的最速の环境配置 首先&#xff0c;安装wsl2和vscode 具体步骤参见Mit6.s081环境配置踩坑之旅WSL2VScode_mit6s081-CSDN博客 接下来开始为Ubuntu(笔者使用的版本依然是20.04)配置go的相关环境 1、更新Ubuntu的软件包 sudo apt-get install build-es…...

【乐企文件生成工程】搭建docker环境,使用docker部署工程

1、自行下载docker 2、自行下载docker-compose 3、编写Dockerfile文件 # 使用官方的 OpenJDK 8 镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR ./app# 复制 JAR 文件到容器 COPY ../lq-invoice/target/lq-invoice.jar app.jar # 暴露应用程序监听的端口 EXPOSE 1001…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...