Linux 计算机网络
目录
一、网络协议
1、 "协议" 是一种约定
2、协议分层
二、网络模型
1、OSI七层模型
2、TCP/IP五层(或四层)模型
三、网络传输基本流程
四、数据包封装和分用
五、网络中的地址管理
六、网络编程套接字
1、理解源IP地址和目的IP地址
2、端口号
理解 "端口号" 和 "进程ID"
理解源端口号和目的端口号:
3、认识TCP、UDP协议
4、网络字节序
5、网络字节序和主机字节序的转换
一、网络协议
1、 "协议" 是一种约定
网络协议确实是一种约定,它是规定数据在网络中传输的格式、规范、控制信息以及错误检测和恢复机制等一系列规则的集合。为了确保全球各地不同制造商生产的计算机、操作系统以及网络硬件设备能够无缝协同工作,共同理解彼此发送和接收的信息,网络协议的存在至关重要。
举例来说,就像人类社会中的人们用同一种语言交流一样,不同地区的方言各异,如果想要所有人无障碍沟通,就需要制定一个通用的语言规范,如普通话或国际通用的英语。
- 在网络世界里,TCP/IP协议族就扮演着这样的角色,它包含了多个子协议,如TCP(传输控制协议)和IP(互联网协议)等,这些协议共同定义了数据在网络中封装、传输、路由以及到达目的地后解包还原的过程。
举个具体的例子,TCP/IP协议确保了无论是Linux、Windows还是Mac OS操作系统的计算机,只要它们都遵循TCP/IP协议,就能够通过网络发送和接收数据,即便它们的内部实现、硬件配置千差万别。在网络协议的框架下,计算机之间通过特定的比特流(如通过高低电平或光脉冲强度表示的0和1)按照预先设定的格式编码信息,进而实现跨地域、跨平台、跨设备的有效通信。这就是网络协议在计算机通信中的核心作用。
2、协议分层
这张图片展示了一个协议分层的概念,通过一个打电话的例子来说明。在图中,协议被分为两个层次:语言层和通信设备层。
- 在语言层,有两个协议:汉语协议和英语协议。在通信设备层,也有两个协议:电话机协议和无线电协议。
- 通过这个例子,我们可以看到如何使用不同的协议来实现不同的人之间的通信。
- 例如,如果A和C都使用汉语协议,他们可以通过电话机进行通信。同样地,如果B和C都使用英语协议,他们也可以通过电话机进行通信。
分层的最大好处是封装。这意味着每个层次只关心它自己的功能,而不必关心其他层次的功能。这样可以使得系统更加模块化,更容易维护和扩展。
面向对象编程(OOP)也遵循类似的原理。在OOP中,我们把对象划分为不同的类,每个类都有自己的属性和方法。这些类之间可以通过接口进行交互,而不需要知道对方的具体实现细节。这样可以使代码更加清晰、易于理解和维护。
二、网络模型
1、OSI七层模型
OSI(Open System Interconnection,开放系统互连)七层网络模型是一个详尽的逻辑架构方案,它将复杂的网络通信过程分解为七个相互关联且功能独立的层次。这个参考模型不仅为计算机网络的设计和理解提供了一个标准框架,而且确保了不同类型的主机之间能够有效地进行数据传输和互操作。
在OSI七层模型中,每一层都对应着相应的功能集以及可能存在的物理设备组件,如路由器在第三层网络层处理数据包转发,交换机则主要在第二层数据链路层执行帧交换任务。该模型的重要特征在于,它将服务、接口和协议这三者的角色做出了清晰的区分,从而使得理论分析更为透彻、系统设计更为有序。
然而,尽管OSI七层模型在理论上具有高度完整性及一致性,但在实际应用中,由于其结构较为复杂且实施成本较高,导致并未被广泛采纳为直接的操作标准。相比之下,更为简洁且实用的TCP/IP四层模型或五层模型(因某些解释而异)成为了现代互联网通信的基础架构,它们虽然没有严格按照OSI的七层划分,但实现了类似的层次化功能分离,并且更适应实际网络环境的需求。
2、TCP/IP五层(或四层)模型
TCP/IP协议族不仅仅是一个协议名称,它实际上涵盖了众多相互协作的协议集合,共同构成了当今互联网通信的核心基础。这一协议簇采用了一种五层(或根据某些划分方式也可视为四层)的层级体系结构,每一层均依赖于其下一层提供的服务,以便完成自身的特定功能需求。
-
物理层:作为最底层,物理层关注的是数据传输的物理媒介与信号形式,它决定了数据在网络中的实际传输方式,包括传输速率、传输距离、抗干扰性能等因素。常见的物理层介质包括双绞线、同轴电缆、光纤以及无线电磁波等。集线器(Hub)即工作在物理层,仅负责信号的简单放大和转发。
-
数据链路层:这一层主要负责设备间的帧数据传输和识别。涉及的具体工作内容包括网卡驱动程序、帧同步机制(即如何识别新的数据帧起始点)、冲突检测与避免(如CSMA/CD机制)、错误检测与纠正等。以太网、令牌环网、无线局域网(WLAN)等均为数据链路层的标准实例。交换机(Switch)在此层面上运行,通过学习MAC地址表来实现数据帧的高效传输。
-
网络层:该层核心职责是进行地址管理和路径选择,其中最为人熟知的就是IP协议。网络层利用IP地址来唯一标识网络中的每一台主机,并通过维护和更新路由表来规划并决定数据报文在两台主机间的最佳传输路径。路由器(Router)便是在网络层工作的设备,它们基于路由算法指导数据包在不同网络间穿梭。
-
传输层:这一层次的主要任务是确保数据可靠地从源主机传送到目标主机。传输控制协议(TCP)就是一个典型的例子,它提供了面向连接、可靠的数据传输服务,保障了数据传输的顺序性和完整性。
-
应用层:位于模型顶层的应用层,专注于解决应用程序间的通信问题,它定义了一系列协议标准以支持各种网络应用服务,例如简单邮件传输协议(SMTP)、文件传输协议(FTP)、远程登录协议(Telnet)等。对于网络开发人员而言,日常工作中接触最多的便是应用层协议及其编程接口。
-
对于一台主机,其操作系统内核通常会全面实现从传输层直至物理层的所有功能,以确保主机能够在网络环境中进行高效且稳定的数据通信。
-
对于路由器设备,其核心功能集中在实现从网络层至物理层的协议,通过IP寻址和路由选择机制,保证数据包能在不同网络间正确传输。
-
在交换机层面,其主要实现从数据链路层至物理层的功能,负责在局域网内部根据MAC地址进行快速、准确的数据帧转发。
-
集线器作为一种较为基础的网络设备,仅仅实现了物理层的功能,即对信号进行放大和再生,再无其他智能处理能力。
然而,实际情况并不总是如此绝对。随着技术的发展,一些高端交换机产品也开始实现网络层的转发功能,能够进行类似于路由器的IP路由决策;同时,部分路由器也在原有功能基础上扩展了对传输层的支持,例如通过端口转发等技术实现更高层次的服务。这些发展反映了网络设备功能融合的趋势,进一步提升了网络通信的灵活性与效率。
三、网络传输基本流程

跨网段的主机的文件传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.
四、数据包封装和分用

在计算机网络通信过程中,数据包经过层层处理以确保信息能够在不同网络间有效传输。具体来说:
- 当应用层数据准备通过网络发送时,它会经历一个被称为封装(Encapsulation)的过程。在这一过程中,每经过一个协议层,原始数据就会被附加一个特定的协议头(header),这些头包含了关键的信息元数据。例如,它们记录了各自层协议的控制信息,诸如首部长度、负载(payload)数据大小,以及用于指示上层协议类型的字段等。
- 在传输层,原始数据会被封装成段(segment),如在TCP协议中;在网络层,数据进一步被打包为数据报(datagram),如在IP协议中;而在数据链路层,则形成帧(frame),如在以太网协议中。
- 封装完成后,数据帧便会被传输到物理介质上,跨越可能涉及多个网络节点的传输路径,直到达到目的地主机。
- 抵达目标主机后,数据包的逆向过程随之展开,即数据分用(Decapsulation)。每层协议会依据自身协议头信息,逐层剥离掉已不再需要的协议首部,直至恢复原始应用层数据。分用过程中,协议层会特别关注首部中的“上层协议字段”,以此识别并将解封后的数据递交给正确的上层协议进行进一步处理。这样,原本在网络中封装起来的复杂信息得以还原,并最终送达相应的目的应用程序。

五、网络中的地址管理
在计算机网络中,地址管理扮演着至关重要的角色,其中两个关键的地址类型分别为IP地址和MAC地址。
IP地址的理解 IP协议共分为两个主要版本:IPv4和IPv6。在本课程未作特殊声明的情况下,所提及的IP协议默认指的是IPv4版本。IP地址在IP协议体系中是用来唯一标识网络中各个主机和设备的一种逻辑地址。对于IPv4协议而言,IP地址是一个由四个字节组成、总计32位的二进制整数。为了便于人类阅读和记忆,IP地址通常采用“点分十进制”格式表示,例如“192.168.0.1”。这里的每一个点分隔的数字代表一个字节,取值范围是从0到255。
MAC地址的认知 MAC地址,即Media Access Control Address,主要用于在数据链路层识别网络中直接相连的节点,如网络适配器(网卡)。MAC地址的长度固定为48位,相当于6个字节。在实践中,MAC地址常以十六进制数串联并用冒号分隔的形式显示,例如“08:00:27:03:fb:19”。值得注意的是,MAC地址在网卡生产制造时就已经固化,并且在大多数情况下是不可更改的,因此理论上每块网卡的MAC地址应该是全球唯一的。不过,在虚拟化环境下,虚拟机可能会使用非真实物理硬件生成的MAC地址,这就可能导致MAC地址的重复;另外,也有部分网卡允许用户在一定程度上自定义MAC地址,但这并非普遍现象。
六、网络编程套接字
1、理解源IP地址和目的IP地址
在Internet协议(IP)层面,源IP地址和目的IP地址是核心的元素,它们共同构成了数据包在网络中传输的基础寻址信息。源IP地址是发送数据包设备的IP地址,而目的IP地址则是接收数据包设备的IP地址。通过这两个地址,网络中的路由器和其他网络设备能够正确地将数据包从源点转发到目的地。
然而,仅凭IP地址并不能完全实现应用程序间的具体通信。这是因为IP地址只是识别了网络上的特定主机,但它并没有指出在主机内部哪个进程或服务应该接收这个数据包。例如,在QQ消息传递的过程中,即使我们知道了对方主机的IP地址,也无法直接通过IP地址来判断数据应当被哪个QQ客户端程序接收。
为了更准确地定位到主机内部的服务或进程,我们需要另一层协议的帮助,这就是传输层的协议,如TCP(传输控制协议)或UDP(用户数据报协议)。在TCP/IP协议簇中,除了IP地址外,还使用端口号(Port Number)来标识主机上的特定服务或应用程序。当一个数据包到达目的主机时,它的目的IP地址帮助主机确定数据包是否为自己所有,而目的端口号则告诉主机的操作系统应该将这个数据包交给哪个正在监听该端口的应用程序去处理。
所以,为了完整地完成类似QQ消息这样的应用程序通信,不仅需要源IP地址和目的IP地址,还需要源端口号和目的端口号。这四个值共同组成了一对套接字(Socket),即(源IP,源端口,目的IP,目的端口),这样才能确保数据能准确地从发送方的一个进程传递到接收方的对应进程。
2、端口号
端口号(port number)是计算机网络中传输层协议(如TCP和UDP)的重要组成部分,用于标识主机上运行的应用程序或服务。端口号是一个16位的无符号整数,范围从0到65535,其中一些端口号是预先定义的标准服务端口号,例如HTTP服务使用80端口,FTP服务使用21端口等。
+-----------------+
| 客户端 |
| 进程 (A) |
| 端口 X |
+-----------------++-----------------+
| 网络层 |
+-----------------++-----------------+
| 服务器 |
| 进程 (B) |
| 端口 Y |
+-----------------+
假设有两个不同的IP地址(IPA和IPB),分别代表两个不同的机器或服务器。
在左侧,有一个软件客户端,它通过公网IP地址与服务器进行通信。这个过程涉及到客户端进程和服务器进程之间的交互。在正常情况下,我们可能会认为网络通信的目标是将数据发送到对方的机器上,但这并不是真正的本质。
实际上,网络通信的本质是进程间的通信。这意味着,当数据在网络中传输时,最终的目标是将这些数据交付给指定的进程。因此,将数据在主机之间转发只是一个手段,而不是目的本身。
为了实现这个目标,我们需要确保数据能够正确地路由到正确的进程。这通常涉及到使用端口号来标识不同的进程,并且需要在网络层面上进行相应的配置和管理。
理解 "端口号" 和 "进程ID"
端口号与进程ID(PID)的关系在于,它们都是用来标识主机内部资源的。
- 进程ID是操作系统为每一个运行中的进程分配的唯一标识符,而端口号则是为了让操作系统知道哪个进程应该接收特定网络数据流。
- 当一个进程打开一个网络套接字并请求绑定到一个特定端口时,操作系统会确保同一时刻没有其他进程也绑定到该端口,从而保证端口号与进程之间的一一对应关系。
- 不过,需要注意的是,一个进程实际上可以同时绑定并监听多个端口,但这并不意味着多个进程可以同时绑定同一个端口。
比如10086:在中国移动的客服系统中,10086就是一个众所周知的端口号,它可以被手机营业厅软件(一个进程)监听,当用户的手机向10086端口发起连接请求时,运营商的服务器就会将请求转交给监听该端口的特定进程处理。
理解源端口号和目的端口号:
- 源端口号:就像唐僧(发送者)从自家的佛经室(源端口)发出一份经书(数据包),这个源端口号告诉其他网络参与者,这份经书是从哪个源头发出的。
- 目的端口号:假设目标是孙悟空(接收者),那么目的端口号就如同孙悟空所在的花果山水帘洞(目的端口),经书最终是要送达这个地方由孙悟空接收并处理。
送快递例子:源端口号就好比快递员从A地发货站点(源地址+源端口)发出包裹,目的端口号则是收件人B地的收货地址(目的地址+目的端口)。在TCP/IP协议中,源端口号表示数据发送方的应用进程,目的端口号表示数据接收方的应用进程。数据段中的这两个端口号组合起来,就能确保数据被正确地从源进程传递到目的进程。
3、认识TCP、UDP协议
TCP(Transmission Control Protocol)作为传输层的核心协议之一,以其建立有序、可靠的数据传输通道而著称。
- 在通信开始阶段,TCP采用三次握手建立连接,确保双方的通信准备就绪。在数据传输过程中,TCP具备序列号与确认应答机制,能够确保数据包按序送达,同时,通过重传机制解决丢包问题,通过流量控制和拥塞控制策略优化网络资源利用。总之,TCP提供一种面向连接、可靠的字节流服务,确保数据的完整性、顺序性和稳定性。
UDP(User Datagram Protocol)同样位于传输层,但在设计哲学上更侧重于简洁与速度。
- UDP采用无连接的工作模式,即发送数据前无需预先建立连接,数据包能够独立发送,但这也意味着它不保证数据的可靠传输和顺序交付。每个UDP数据报被视为独立的信息单元,其传输过程可能丢失、乱序或重复,但这种特性使其非常适合于那些对延迟敏感、容忍一定丢包率且需要快速响应的应用场景,例如在线视频、实时通信、网络广播等。总的来说,UDP提供的是面向数据报的、无连接且不可靠的服务。
4、网络字节序
我们知道,在内存中存储多字节数据时存在大端和小端两种方式,它们决定了多字节数据在内存地址空间内的排列顺序。同样的,磁盘文件中的多字节数据相对于文件偏移地址也存在大端小端的差异。而在网络数据流中,数据的字节顺序同样是个重要问题。
对于网络数据流,尽管不存在具体的“地址”概念,但我们可以将其抽象理解为:发送主机将待发送缓冲区中的数据按照内存地址从低到高的顺序逐个发出;相应地,接收主机接收到网络上的字节流后,也会按照内存地址从低到高的顺序将这些数据依次存放在接收缓冲区中。基于此逻辑,我们约定在网络数据流中,先发送的数据视为低地址部分,后发送的数据则是高地址部分。
按照TCP/IP协议的规定,网络数据流应当采用大端字节序(Big-Endian),也就是说,高位字节存储在低地址处。无论是大端主机还是小端主机,在进行网络通信时都必须遵循这一网络字节序标准。
举例来说,如果我们想要将十六进制数0x1234abcd写入从0x0000开始的内存区域,那么依据大端和小端的不同字节序,存储结果如下:
-
大端模式(Big-Endian):
- 地址 0x0000 存储字节 0x12
- 地址 0x0001 存储字节 0x23
- 地址 0x0002 存储字节 0xab
- 地址 0x0003 存储字节 0xcd
-
小端模式(Little-Endian):
- 地址 0x0000 存储字节 0xcd
- 地址 0x0001 存储字节 0xab
- 地址 0x0002 存储字节 0x34
- 地址 0x0003 存储字节 0x12
所以,如果当前发送主机是小端系统,它在发送数据前需将本地小端格式转换为网络要求的大端格式;若主机本身就是大端系统,则可以直接按照大端格式发送数据。
5、网络字节序和主机字节序的转换
<arpa/inet.h>
库提供的四个转换函数来处理网络字节序与主机字节序之间的切换,从而提高程序的可移植性。这四个函数分别是: uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
这些函数名称的设计直观易记:“h”代表"host"(主机),"n"代表"network"(网络),"l"表示32位长整型,“s”表示16位短整型。具体含义如下:
htonl
:将32位的主机长整型数值转换为网络字节序。例如,在发送IP地址时,确保其符合网络传输的标准字节序。htons
:将16位的主机短整型数值转换为网络字节序。ntohl
:将32位的网络长整型数值转换为主机字节序。在接收网络数据时,确保数据能被正确解析。ntohs
:将16位的网络短整型数值转换为主机字节序。
在实际操作中,若主机是小端字节序(低位字节存储在低地址),调用这些函数时,会将输入的参数进行大小端转换后再返回结果。反之,如果主机已经是大端字节序(高位字节存储在低地址),这些函数则会原样返回输入的参数,无需进行任何转换操作。如此一来,无论在哪种类型的计算机系统上编译和运行,程序都能够正确处理网络数据的字节序问题。
相关文章:

Linux 计算机网络
目录 一、网络协议 1、 "协议" 是一种约定 2、协议分层 二、网络模型 1、OSI七层模型 2、TCP/IP五层(或四层)模型 三、网络传输基本流程 四、数据包封装和分用 五、网络中的地址管理 六、网络编程套接字 1、理解源IP地址和目的IP地址 2、端口号 理解 &q…...
bash脚本中‘-b -u -p’‘$# -eq’‘#!/bin/bash’‘sed -i “s/\r//“ $1’的用法说明
#!/bin/bash#!/bin/bash: 这是 Bash 脚本的开头,指定了要使用的解释器,即 Bash。 if [ $# -eq 0 ]; thenif [ $# -eq 0 ]; then: 检查脚本是否被调用时提供了参数。$# 表示参数的数量,-eq 0 表示等于 0,即无参数。 echo "p…...

【人工智能】Gitee AI 天数智芯有奖体验开源AI模型,一定能有所收货,快来体验吧
大家好,我是全栈小5,欢迎阅读小5的系列文章。 这是《人工智能》系列文章,每篇文章将以博主理解的角度展开讲解。 目录 前言两大赛道天数智芯1.模型地址2.天数智芯专区3.选择模型4.模型详情页5.部署模型6.成功部署7.执行例子8.移除模型 千模盲…...
Ceph学习 -8.认证管理-用户基础
文章目录 1.用户基础1.1 基础知识1.2 简单实践1.3 小结 1.用户基础 学习目标:这一节,我们从基础知识、简单实践、小结三个方面来学习。 1.1 基础知识 简介 Ceph集群管理员能够直接在Ceph集群中创建、更新和删除用户 注意:创建用户时&#x…...

大创项目推荐 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别
文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数:2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…...
Python小工具提升工作效率【附完整版,可下载word】
1、多个ppt汇总成一个ppt的python代码实现: import win32com.client as win32 import os import re def find(s): pat = re.compile(r"\d+") result = pat.match(s) return int(result.group(0)) def join_ppt(path:str): """ :param path: ppt所…...

k8s-Pod
文章目录 k8s-Podpod 配置文件详解pod 生命周期pod 探针StartupProbeLivenessProbeReadinessProbe探针使用建议 初始化容器钩子函数 k8s-Pod pod 是k8s 中可以调度的最小单位 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的…...

智能网络新纪元:机器学习赋能未来计算机网络高速发展
🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…...
大数据之kafka应用
大数据之kafka应用 2024启kafkakafka常见命令生产上重放信息jmxjmx的配置和开启jmx的使用jmx例子一 jmx例子二jmx例子三jmx例子四(special) 2024启kafka kafka常见命令 指定jmx端口启动kafka lsof -i :9999 JMX_PORT9999 /opt/kafka_2.12-3.1.0/bin/kaf…...

嵌入式操作教程_数字信号处理_音频编解码:3-6 AAC音频解码实验
一、实验目的 了解AAC音频格式,掌握AAC音频解码的原理,并实现将AAC格式的音频解码为PCM 二、实验原理 音频编解码的主要对象是音乐和语音,音频的编解码格式可分为无压缩的格式、无损压缩格式、有损音乐压缩格式、有损语音压缩格式和合成算…...

【从浅学到熟知Linux】冯诺依曼体系结构及进程概念详谈!
🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 🎯每天努力一点点,技术变化看得见 文章目录 冯诺依曼体系结构操作系统如何理解管理操作系统概念设计操作系统目的系统调用和库函数概念 进程基本概念描…...

word转pdf(前后端最全保姆级别)
word转pdf vue2java 文章目录 word转pdf vue2java一、前端 vue-pdf1、下载依赖2、封装的组件 二、java使用aspose(付费)1.引入库2.封装的工具类3、付费密钥文件 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、前端 vue…...

深度学习简介
深度学习简介 一、引言:深度学习的兴起 简短介绍深度学习的历史背景 深度学习,作为人工智能领域的一颗冉冉升起的新星,其根源可以追溯到上世纪的感知机学习算法。这种算法模拟人类的神经元行为,是最早期的尝试之一。然而&#x…...
深入探索:使用C++构建顶级性能的网络服务器
在数字化浪潮的推动下,网络服务器作为信息交互的核心枢纽,其性能与稳定性直接决定了互联网应用的服务质量和用户体验。C++,作为一种兼具高效性与灵活性的编程语言,已然成为构建高性能网络服务器的首选工具。本文旨在深入剖析C++在构建顶级性能网络服务器中的关键技术、最佳…...

SpringBoot学习笔记四
SpringBoot学习笔记四-监听机制 1. SpringBoot监听器1.1 无需配置1.1.1 CommandLineRunner使用1.1.2 ApplicationRunner的使用1.1.3 CommandLineRunner与ApplicationRunner的区别 1.2 需要创建META-INF文件,并在其中创建spring.factories,配置相关的信息…...

雄安建博会:中矿雄安新区的总部开工建设
中矿落位雄安:助力国家战略与新区发展 雄安新区,作为中国未来发展的重要战略支点,正迎来一系列央企总部的疏解与建设。最近,中国矿产资源集团有限公司(简称“中矿”)在雄安新区的总部项目正式开工建设&…...

蒙特卡洛方法【强化学习】
强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…...
构建第一个ArkTS之声明式UI描述
ArkTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑。 创建组件 根据组件构造方法的不同,创建组件包含有参数和无参数两种方式。 说明 创建组件时不需要new运算…...

pytest教程-25-生成覆盖率报告插件-pytest-cov
领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest多重断言插件pytest-assume,本小节我们讲解一下pytest生成覆盖率报告插件pytest-cov。 测量代码覆盖率的工具在测试套件运行时观察你的代码,并跟踪哪些行被运行,…...
特征工程总结
后期总结 Reference [1] 特征工程总结 - 知乎...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...

RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...

【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器
从本章节开始,进入到函数有多个参数的情况,前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参,ECX是整型的第一个参数的寄存器,那么多个参数的情况下函数如何传参,下面展开介绍参数为整型时候的几种情…...