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_INET
    uint16_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_LOCAL
    char        sun_path[108]; // 套接字路径名
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子应用设计方案-45:智能火锅系统方案设计

智能火锅系统方案设计 一、引言 随着人们生活水平的提高和对饮食体验的追求&#xff0c;智能火锅系统应运而生。本方案旨在设计一款集智能化控制、高效加热、安全保障和个性化体验于一体的智能火锅系统。 二、系统概述 1. 系统目标 - 实现精准的温度控制&#xff0c;满足不同…

论文概览 |《Urban Analytics and City Science》2023.03 Vol.50 Issue.3

本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年3月第50卷第3期的论文的题目和摘要&#xff0c;一共包括18篇SCI论文&#xff01; 论文1 A new kind of search 一种新型的搜索 【摘要】 ChatGPT (2022) was first launched o…

jwt简介和在go中的简单使用

什么是 JSON Web 令牌&#xff1f; JSON Web 令牌 &#xff08;JWT&#xff09; 是一种开放标准 &#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于将信息作为 JSON 对象在各方之间安全地传输。此信息是经过数字签名的&#xff0c…

机器学习详解(3):线性回归之代码详解

文章目录 1 数据预处理2 构建线性回归模型并绘制回归线初始化方法前向传播&#xff1a;forward_propagation代价函数&#xff1a;cost_function反向传播&#xff1a;backward_propagation参数更新&#xff1a;update_parameters训练方法&#xff1a;train代码运行结果 3 使用Py…

iOS如何自定义一个类似UITextView的本文编辑View

对于IOS涉及文本输入常用的两个View是UITextView和UITextField&#xff0c;一个用于复杂文本输入&#xff0c;一个用于简单文本输入&#xff0c;在大多数开发中涉及文本输入的场景使用这两个View能够满足需求。但是对于富文本编辑相关的开发&#xff0c;这两个View就无法满足自…

唇形同步视频生成工具:Wav2Lip

一、模型介绍 今天介绍一个唇形同步的工具-Wav2Lip&#xff1b;Wav2Lip是一种用于生成唇形同步&#xff08;lip-sync&#xff09;视频的深度学习算法&#xff0c;它能够根据输入的音频流自动为给定的人脸视频添加准确的口型动作。 &#xff08;Paper&#xff09; Wav2Lip模型…

轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…

数学课上的囚徒问题(2)

#include<bits/stdc.h> using namespace std; int main() {int n; cin>>n;double res0;for(int in/21;i<n;i)res1./i;cout<<fixed<<setprecision(12)<<(1-res); } 赛后看到别人那么短的代码直接破防了&#xff0c;才发现思考起来也不是很简单…

21Java之多线程、线程池、并发、并行

一、多线程常用方法 下面我们演示一下getName()、setName(String name)、currentThread()、sleep(long time)这些方法的使用效果。 public class MyThread extends Thread{public MyThread(String name){super(name); //1.执行父类Thread(String name)构造器&#xff0c;为当前…

HttpClient介绍

1. 介绍 2. 发送Get方式请求 public void httpGetTest() throws Exception{// 创建HttpClient对象CloseableHttpClient httpClient HttpClients.createDefault();// 创建请求方式对象HttpGet httpGet new HttpGet("http://localhost/user/shop/status");// 发送请…

矩阵的乘(包括乘方)和除

矩阵的乘分为两种&#xff1a; 一种是高等代数中对矩阵的乘的定义&#xff1a;可以去这里看看包含矩阵的乘。总的来说&#xff0c;若矩阵 A s ∗ n A_{s*n} As∗n​列数和矩阵 B n ∗ t B_{n*t} Bn∗t​的行数相等&#xff0c;则 A A A和 B B B可相乘&#xff0c;得到一个矩阵 …

智能跳转 - 短链接高级特性详解

看到标题&#xff0c;我只想说短链接工具已经卷疯了。很多人都知道&#xff0c;短链接的基础特性就是将长链接变短&#xff0c;更加简洁美观便于传播推广&#xff1b;高级一点的功能还有数据统计&#xff0c;便于运营进行分析决策&#xff1b;更高级的还能绑定企业自己的域名&a…

离线写博客(失败) - 用Markdown来离线写博客

因为想控制一下用网&#xff0c;但是又有写博客的需求&#xff0c;所以想研究一下离线写博客。 我看CSDN上面好像有很多介绍&#xff0c;Windows Live Writer 啦&#xff0c;Markdown啦&#xff0c;还有一些其他的&#xff0c;我看了一下&#xff0c;好像 Markdown还有点儿靠谱…

第三节、电机定速转动【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍用定时器定时的方式&#xff0c;精准控制脉冲时间&#xff0c;从而控制步进电机速度 一、计算过程 1.1 电机每一步的角速度等于走这一步所花费的时间&#xff0c;走一步角度等于步距角&#xff0c;走一步的时间等于一个脉冲的时间 w s t e p t … ……

夏普MX-4608N复印机维修模式进入方法及载体初始化方法

夏普MX-4608N复印机载体型号&#xff08;图&#xff09;&#xff1a; 型 号&#xff1a;载体&#xff08;黑色&#xff09;MX-561CV 净含量&#xff1a;395克 下面图片中分别有载体、刮板、鼓芯、上纸盒搓纸轮一套&#xff0c;均原装正品&#xff1b; 保养周期将至的时候建…

头歌 Linux之线程管理

第1关&#xff1a;创建线程 任务描述 通常我们编写的程序都是单进程&#xff0c;如果在一个进程中没有创建新的线程&#xff0c;则这个单进程程序也就是单线程程序。本关我们将介绍如何在一个进程中创建多个线程。 本关任务&#xff1a;学会使用C语言在Linux系统中使用pthrea…

Docker的彻底删除与重新安装(ubuntu22.04)

Docker的彻底删除与重新安装&#xff08;ubuntu22.04&#xff09; 一、首先我们彻底删除Docker1、删除docker及安装时自动安装的所有包2、删除无用的相关的配置文件3、删除相关插件4、删除docker的相关配置和目录 二、重新安装1、添加 Docker 的官方 GPG 密钥&#xff1a;2、将…

深入浅出:Go语言标准库探索

深入浅出&#xff1a;Go语言标准库探索 引言 Go语言自发布以来&#xff0c;以其简洁的语法、高效的性能和强大的并发支持赢得了开发者的青睐。除了这些特性外&#xff0c;Go还拥有一个功能丰富且设计精良的标准库&#xff0c;几乎涵盖了现代应用程序开发所需的所有基本功能。…

深入浅出:Go语言中的结构体(Struct)

深入浅出&#xff1a;Go语言中的结构体&#xff08;Struct&#xff09; 引言 结构体是Go语言中一种非常重要的数据类型&#xff0c;它允许我们定义包含多个字段的自定义数据类型。通过结构体&#xff0c;我们可以更好地组织和管理复杂的数据结构&#xff0c;使得代码更加清晰…

基于长短时记忆神经网络的空气质量数据分析与预测的设计与实现

研究内容 本文旨在研究和解决气象参数和气象aqi指数实时预测准确度较低和速度较慢的问题&#xff0c;并结合所有空气质量监测站点以及气象监测站点的实际情况&#xff0c;将长短时记忆神经网络应用于气象基本指数的预测中&#xff0c;为日后的政府决策和人类出行活动提供一定的…