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

通信与网络安全之IPSEC

IPSec(IP Security)是IETF制定的为保证在Internet上传送数据的安全保密性能的三层隧道加密协议。IPSec在网络层对IP报文提供安全服务。IPSec协议本身定义了如何在IP数据包中增加字段来保证IP包的完整性、 私有性和真实性,以及如何加密数据包。使用IPsec,数据就可以安全地在公网上传输。IPSec技术也可以实现数据传输双方的身份验证,避免黑客伪装成网络中的合法用户攻击网络资源。IPSec只能在IP网络中使用。

1.IPSEC 特性

IPSec通过以下技术实现在机密性、完整性、抗抵赖和身份鉴别方面提高端到端的安全性:

1)通过使用加密技术防止数据被窃听。 对称+非对称 数字信封 ,非对称使用DH

2)通过数据完整性验证防止数据被破坏、篡改。 HMAC 哈希算法

3)通过认证机制实现通信双方身份确认,来防止通信数据被截获和回放。 随机数+IV+数字信封 

IPSec技术还定义了:

  • 何种流量需要被保护。 使用ACL
  • 数据被保护的机制。 使用AH、ESP协议
  • 数据的封装过程。 使用DH 算法进行交换

2.IPSEC和IKE的关系

IKE(Internet Key Exchange)为IPSec提供了自动协商交换密钥、建立安全联盟的服务, 能够简化IPSec的使用和管理,大大简化IPSec的配置和维护工作。

IKE是UDP之上的一个应用层协议,端口号500,是IPSEC的信令协议。

IKE为IPSEC协商建立安全联盟,并把建立的参数及生成的密钥交给IPSEC。

IPSEC使用IKE建立的安全联盟对IP报文加密或验证处理。

IPSEC处理做为IP层的一部分,在IP层对报文进行处理。AH协议和ESP协议有自己的协议号,分别是51和50。

3.IPSec两种工作模式

3.1.传输模式

传输(transport):只是传输层数据被用来计算AH或ESP头,AH或ESP头和被加密的传输层数据被放置在原IP包头后面。(数据包,根据OSI七层模型,一层层封装,从最外层依次为MAC-IP-TCP/UDP-数据)

传输模式一个最显著的特点就是:在整个IPSec的传输过程中,IP包头并没有被封装进去,这就意味着从源端到目的端数据始终使用原有的IP地址进行通信。而传输的实际数据载荷被封装在IPSec报文中。对于大多数IPSec传输而言, IPSec的报文封装过程就是数据的加密过程,因此,攻击者截获数据后将无法破解数据内容,但却可以清晰地知道通信双方的地址信息。

由于传输模式封装结构相对简单(每个数据报文较隧道模式封装结构节省20字节),因此传输效率较高,多用于通信双方在同一个局域网内的情况。例如:网络管理员通过网管主机登录公司内网的服务器进行维护管理,就可以选用传输模式IPSec对其管理流量进行加密。

总结:对传输层数据进行处理(不对IP包头处理),IP包头暴露在外,存在一定风险。适合主机对主机的访问。

3.2.隧道模式

隧道(tunnel):用户的整个IP数据包被用来计算AH或ESP头,且被加密,对整个网络层数据包进行处理。AH或ESP头和加密用户数据被封装在一个新的IP数据包中。

隧道模式中, 将整个三层数据报文封装在IPSec数据内,再为封装后的数据报文添加新的IP包头。在AH、ESP处理之后再封装了一个外网IP头,主要用于Site-to-Site的应用场景

总结:对网络层整个包进行处理,添加新的IP包头。适合站点对站点。

4.IPSec的组成

IPSec包括AH(协议号51)和ESP(协议号50)两个协议。

1)AH(Authentication Header)报文验证头协议

主要提供的功能有数据源验证、数据完整性校验和防报文重放功能,可选择的散列算法有MD5、SHA1等。AH插到标准IP包头后面,它保证数据包的完整性和真实性,防止黑客截断数据包或向网络中插入伪造的数据包。AH采用了hash算法来对数据包进行保护。AH没有对用户数据进行加密。

在传输模式下,AH协议验证IP报文的数据部分和IP头中的不变部分。

在隧道模式下, AH协议验证全部的内部IP报文和外部IP头中的不变部分。

 AH(认证头协议)在RFC 2402中有明确定义,包括数据完整性、验证和保护数据回放攻击。

AH协议保护整个数据报文,但易变的字段除外,如IP包头中的TTL和TOS字段。

AH协议只能实现验证功能,而并未提供任何形式的数据加密。

AH模式无法与NAT一起运行,因为AH对包括IP地址在内的整个IP包进行hash运算,而NAT会改变IP地址,从而破坏AH的hash值。

2)ESP(Encapsulating Security Payload)报文安全封装协议

ESP协议将用户数据进行加密后封装到IP包中,以保证数据的私有性。同时作为可选项,用户可以选择使用带密钥的哈希算法保证报文的完整性和真实性。ESP的隧道模式提供了对于报文路径信息的隐藏。

在ESP协议方式下,可以通过散列算法获得验证数据字段,可选的算法同样是MD5和SHA1。与AH协议不同的是,在ESP协议中还可以选择加密算法,一般常见的是DES、3DES等加密算法。

ESP协议使用32比特序列号结合防重放窗口和报文验证,防御重放攻击。

在传输模式下,ESP协议对IP报文的有效数据进行加密(可附加验证)。

在隧道模式下,ESP协议对整个内部IP报文进行加密(可附加验证)。

另外,ESP协议加密功能的实现与采用何种连接模式相关。

ESP(Encapsulating Security Payload)是报文安全封装协议

ESP将需要保护的用户数据进行加密后再封装到IP包中,保证数据的完整性、真实性和私有性。 可选择的加密算法有DES,3DES等。

3)AH和ESP可协同工作

AH(Authentication Header)协议是认证头协议,AH协议通过使用带密钥的验证算法,对受保护的数据计算摘要。通过使用数据完整性检查,可判定数据包在传输过程中是否被修改;通过使用认证机制,终端系统或网络设备可对用户或应用进行认证,过滤通信流;认证机制还可防止地址欺骗攻击及重放攻击。

在使用AH协议时,AH协议首先在原数据前生成一个AH报文头,报文头中包括一个递增的序列号(Sequence number)与验证字段(空)、安全参数索引(SPI)等。AH协议将对新的数据包进行离散运算,生成一个验证字段(authentication data),填入AH头的验证字段。

5.IPSEC使用的算法

DH算法的使用:

使用公钥和私钥两个不同的秘钥进行加密和解密。用一个秘钥加密的数据仅能被另一个秘钥解密,且不能从一个秘钥推出另一个秘钥。常用的非对称加密算法有:RSA(使用三位数学家名字的首字母来命名)、DSA(digital signature algorithm,数字签名算法)、DH(diffie-hellman,迪菲赫尔曼)。前两种常用于验证功能,而DH一般被用来实现ipsec中的internet秘钥交换(IKE)协议

DH(diffie-hellman,迪菲赫尔曼)算法的原理与传统意义上的非对称加密算法的区别:通信双方交换公钥后,会用自己的秘钥和对方的公钥通过DH算法计算出一个共享秘钥,然后双方会使用这个共享秘钥加密传输数据。从算法原理看,可以说DH算法已经将对称加密算法和非对称加密算法综合在一起。

DH算法支持可变的秘钥长度,由于公钥和私钥的长度不同,因此通过DH算法计算出的共享密钥的有效长度也就不同。这些都是通过DH算法的密钥组定义的。Cisco的路由器只支持DH组1、2和5。其中DH组1的有效秘钥长度为768,DH组2的有效密钥长度为1024,DH组5的有效密钥长度为1536。密钥的有效长度越长,安全性也就越强。同时CPU的资源占用率也就越高。因此,选择合适的DH组要从网络的安全需求和设备本身的性能两个方面考虑。

密钥的产生是通过DH交换技术,DH交换(Diffie-Hellman Exchange)过程如下:

(1) 须进行DH交换的双方各自产生一个随机数,如a和b;

(2) 使用双方确认的共享的公开的两个参数:底数g和模数p各自用随机数a,b进行幂模运算,得到结果c和d,计算公式如下:

c =g a mod p, d=g b modp;

(3) 双方进行交换下图所示的信息;

(4) 进一步计算,得到DH公有值:

da mod p = c b mod p = g a b mod p

此公式可以从数学上证明。

若网络上的第三方截获了双方的模c和d,那么要计算出DH公有值gab mod p 还需要获得a或b,a和b始终没有直接在网络上传输过,如果想由模c和d计算a或b就需要进行离散对数运算,而p为素数,当p足够大时(一般为768位以上的二进制数),数学上已经证明,其计算复杂度非常高从而认为是不可实现的。所以,DH交换技术可以保证双方能够安全地获得公有信息。

6.IKE协议

IKE(Internet Key Exchange)因特网密钥交换协议是IPSEC的信令协议,为IPSec提供了自动协商交换密钥、建立安全联盟的服务,能够简化IPSec的使用和管理,大大简化IPSec的配置和维护工作。

使用UDP的500端口。

IKE是非常通用的协议,不仅可为IPsec协商安全关联,而且可以为SNMPv3、RIPv2、OSPFv2等任何要求保密的协议协商安全参数。

IKE属于一种混合型协议,由Internet安全关联和密钥管理协议(ISAKMP)和两种密钥交换协议OAKLEY与SKEME组成。IKE创建在由ISAKMP定义的框架上,沿用了OAKLEY的密钥交换模式以及SKEME的共享和密钥更新技术,还定义了它自己的两种密钥交换方式。

IKE不是在网络上直接传送密钥,而是通过一系列数据的交换,最终计算出双方共享的密钥,并且即使第三者截获了双方用于计算密钥的所有交换数据,也不足以计算出真正的密钥。IKE具有一套自保护机制,可以在不安全的网络上安全的分发密钥,验证身份,建立IPSEC安全联盟。

1)IKE的组件

ISAKMP:定义了信息交换的体系结构,也就是格式SKEME:实现公钥加密认证的机制

Oakley:提供在两个IPsec对等体间达成相同加密密钥的基本模式的机制

安全联盟(SecurityAssociation,简称SA)是两个通信实体经协商建立起来的一种协定,它们决定了用来保护数据包安全的IPsec协议、转码方式、密钥、以及密钥的有效存在时间等等。

2)IKE建立的两个阶段

IKE使用了两个阶段的ISAKMP

第一阶段,协商创建一个通信信道(IKE SA),并对该信道进行验证,为双方进一步的IKE通信提供机密性、消息完整性以及消息源验证服务;

第二阶段:使用已建立的IKE SA建立IPSec SA

第一个隧道ISAKMP SA是用于保护后续的再次协商,第二次隧道协商的参数是在完全加密的环境下进行的,之后得到的IPsecSA才真正为数据做加密!第一阶段策略集面向对象是第二阶段的协商包,第二阶段的转换集面向对象是最终的数据包。

IKE会构建一个SA数据库(SADB),由它来维护IPsec协议,用来保障数据包安全。 

SA是单向的:如果两个主机(比如A和B)正在通过ESP进行安全通信,那么主机A就需要有一个SA,即SA(OUT),用来处理外发的数据包,另外还需要有一个不同的SA,即SA(IN)用来处理进入的数据包。主机A的SA(OUT)和主机B的SA(IN)将共享相同的加密参数(比如密钥)。

SA要根据协议来区分:如果两个主机间同时使用ESP和AH,对于ESP和AH会生成不同的SA。 SA分为两种:IKE(ISAKMP)SA 协商对IKE数据流进行加密以及对对等体进行验证的算法(对密钥的加密和peer的认证)IPsec SA 协商对对等体之间的IP数据流进行加密的算法。

SA分为两种:

IKE(ISAKMP)SA:协商对IKE数据流进行加密以及对对等体进行验证的算法(对密钥的加密和peer的认证)

IPsec SA 协商对对等体之间的IP数据流进行加密的算法 

对等体之间的IKE SA只能有一个,对等体之间的IPsec SA可以有多个

7.IPSEC建立过程

1)第一阶段:建立ISAKMPSA协商

交换信息包括:

  • 对等体之间采用何种方式做认证,是预共享密钥还是数字证书。
  • 双方使用哪种加密算法(DES、3DES)
  • 双方使用哪种HMAC方式,是MD5还是SHA
  • 双方使用哪种Diffie-Hellman密钥组
  • 使用哪种协商模式(主模式或主动模式)
  • 协商SA的生存期。

IKE协商(第一阶段)过程中包含三对消息:

a)SA交换,是协商确认有关安全策略的过程;

b)密钥交换,交换Diffie-Hellman公共值和辅助数据(如:随机数),加密物在这个阶段产生;

c)ID信息和验证数据交换,进行身份验证和对整个SA交换进行验证。

主模式交换提供身份保护机制,经过三个步骤,共交换六条信息。三个步骤分布是策略协商交换、Diffie-Hellman共享值、nonce交换以及身份验证交换。

在主模式中,这三个任务是通过六个数据报文完成的:前两个数据包用于协商对等体间的管理连接使用何种安全策略(交换ISAKMP/IKEc传输集);中间的两个数据包通过DH算法产生并交换加密算法和HMAC功能所需的秘钥,最后两个数据包使用预共享秘钥等方式执行对等体间的身份验证。这里需要注意的是,前四个报文为明文传输,从第5个数据报文开始为密文传输,而前四个数据包通过各种算法最终产生的秘钥用于第5、地6个数据包及后续数据的加密。

野蛮模式交换分为三个步骤,但只交换三条信息,头两条消息协商策略、交换Diffile-Hellman公开值表要的辅助信息以及身份信息;第二条消息认证响应方;第三条消息认证发起,并为发起方提供在场的证据。

a)交换ISAKMP/IKE传输集

* ISAKMP/IKE传输集就是一组用来保护管理连接的安全措施,有些书籍称之为IKE策略或ISAKMP策略,它主要包括以下几个方面。

* 加密算法:DES,3DES或AES。

* HMAC功能:MD5或SHA-1。

* 设备验证的类型:预共享秘钥(也可以使用RSA签名等方法)。

* Diffie-Hellman秘钥组:cisco支持1、2、5、7(cisco的路由器不支持秘钥组7)。

* 管理连接的生存周期。

设备可能会有不止一个传输集,如果设备发起来接,它会将传输集列表(包括所有传输集)发送到远端对等体设备进行依次对比,直到找到匹配的结果。如果对比所有传输集后没有发现匹配的传输集,管理连接将无法建立,ipsec连接失败。例如,两端设备都只有一个传输集,且一端配置DES加密算法,另一端配置了3DES加密算法,就会导致IPSEC建立失败。如果给其另一端多配置一个传输集使用DES算法,对等体会自动找到与之匹配的传输集,管理连接便会建立起来。

b)通过DH算法实现秘钥交换

第一步只是协商管理连接的安全策略,而共享秘钥的产生与交换就要通过Diffie-Hellman来实现。

DH算法属于非对称加密算法,因此它将产生公钥和私钥对的组合,且彼此共享公钥。对等体用对方的公钥和自己的私钥通过一种功能运算产生一个安全的共享秘钥,即使有人截获数据,也会因为没有私钥而无法对出共享秘钥。

c)实现设备之间的身份验证

设备身份验证时最常使用的方法就是预共享秘钥,即在对等体之间通过带外的方式共享秘钥,并存储在设备的本地。设备验证的过程可以通过加密算法或HMAC功能两种方法实现,而加密算法很少用于身份验证,多数情况都会通过HMAC功能实现。

ISA/KMP/IKE阶段1相关配置命令

a)配置安全策略

ISAKMP/IKE策略包含以下参数:策略的序列号、加密算法、验证方法、DH组、生存周期。配置命令如下。(用于加密和验证阶段1第5、6个数据包)

Router(config)# crypto isakmp policy { 1-10000 } #建立ISAKMP/IKE管理连接策略,序列号越低,优先级越高
Router(config-isakmp)# encryption { des | 3des | aes } #指定加密算法
Router(config-isakmp)# hash { sha | md5 } #指定验证过程采用HMAC的验证功能
Router(config-isakmp)# authentication pre-share #采用预共享密钥方式进行身份验证
Router(config-isakmp)# group { 1 | 2 | 5 } #指定DH算法的密钥长度,默认为1,组号越大,算法越安全,占用设备资源越多        
Router(config-isakmp)# lifetime 86400 #指定管理连接的生存周期,默认86400s(24小时)
Router# show crypto isakmp policy #查看上述配置

b)配置预共享秘钥

Router(config)# crypto isakmp key { 0 | 6 } keystring address peer-address {subnet_mask}

参数解释:

0表示秘钥为明文,6表示秘钥被加密

Keystring表示秘钥的具体内容

Peer-address表示对端与之共享秘钥的对等体设备地址

Subnet_mask:这里为可选命令,如果没有指定,默认将使用255.255.255.255作为掩码

Router# show crypto isakmp key #查看密钥,秘钥处于明文和密文时,命令显示内容的差异

为了增强安全性,在IOS12.3(2)T版本中,增加选项来加密秘钥,但要求设备的IOS镜像必须支持AES加密:

Router(config)#key config-key password-encrypt
New key: #输入的秘钥至少为8个字母                 
Confirm key: #确认密钥                
Router(config)#password encryption aes

2)建立IPsecSA协商

具体协商内容包括:

  • 双方使用哪种封装技术,AH还是ESP
  • 双方使用哪种加密算法
  • 双方使用哪种HMAC方式,是MD5还是SHA
  • 使用哪种传输模式,是隧道模式还是传输模式

通过三条消息建立IPSec SA:

  • 头两条消息协商IPSec SA的各项参数值,并生成IPSec使用的密钥;
  • 第二条消息为响应方提供在场的证据;
  • 第三条消息为发现方提供在场的证据。

ISAKMP/IKE阶段2主要是在两个ipsec对等体间建立数据连接,其主要完成以下任务:

  • 定义对等体间需要保护何种流量。
  • 定义用来保护数据的安全协议。
  • 定义传输模式。
  • 定义数据连接的生存周期及秘钥刷新的方式。

其中,ipsec对等体一般是通过ACL来匹配那些需要加密传输的流量。

ISAKMP/IKE阶段2的建立程过

a)安全关联(sa)

Ipsec需要在两个对等体之间建立一条逻辑连接,这就要使用一个被称为安全关联的信令协议,这是因为ipsec需要无连接的IP协议在安全运行之前要成为面向连接的协议。SA的连接是在源点和终点之间的单向连接,如果需要双向连接,就需要两个SA连接,每个方向一个。SA连接由三个要素定义。

  • 安全参数索引(SPI):用于唯一表示每条SA连接。
  • 安全协议的类型:IPSEC定义了两种安全协议,即AH和ESP。
  • 目的IP地址。

ISAKMP/IKE阶段2具有这种特性,即ISAKMP/IKE的数据连接实际是通过两个单向连接建立的,而两个连接采用的加密或者认证方式都是相同的。这就使ISAKMP/IKE阶段2的这个特性不易被观察到。

ISAKMP/IKE阶段2的配置命令

ISAKMP/IKE阶段2的配置过程有三个部分组成。

a)配置Crypto ACL

定义何种流量需要被保护的一种方法就是建立一个crypto ACL,通过ACL匹配ipsec ***流量,其中,permit语句指定了需要被保护的流量,而deny语句定义了不需要保护的流量。通常情况,两端对等体设备上的crypto ACL互为镜像,否则阶段2的连接建立就会失败。配置命令如下:

Router(config)# access-list number{ deny | permit } protocol source mac destination mac

b)配置阶段2的传输集

在ipsec对等体之间可以配置多个数据连接的传输集,必须保证两端至少有一对匹配的传输集,这样ISAKMP/IKE阶段2的数据SA连接才能协商成功。设备的传输集由设备性能决定,如果所有对等体设备的性能相近,则共同使用一种传输集即可,如果设备间性能差异较为明显,通常就需要多个传输集了。配置如下。

Router(config)# crypto ipsec transform-set transform_set_name transform1[transform2[transform3]

参数解释:

Transform_set_name:为传输集名称,该名称具有唯一性,不能与任何其他传输集相同

Transform1:传输集选项,参考下表:

Router(cfg-crypto-tran)# mode { tunnel | transport } #定义传输模式,默认为隧道模式

如果在数据连接建立之后修改传输集的配置,并不会影响现有的SA设置,只有连接的生存周期到期,SA才会重新建立连接或者SA被手动清除(通过clear crypto sa或clear crypto ipsec sa命令)。

c)配置crypto map

Crypto map的功能就是将所有的信息组织在一起构建ipsec会话。通常路由器的接口上只对应一个crypto map,一台路由器可以在多个接口上实现流量保护,这时可能就需要多个crypto map了。

Crypto map有两种类型:静态的crypto map和动态的crypto。在构建L2L会话时通常会使用静态的。

Router(config)# crypto map map_name seq_num ipsec-isakmp #seq_num为map序列号,范围1-65535,值越小,优先级越高
Router(config-crypto-m)# match address ACL_name_or_num #调用ACL的名字或编号
Router(config-crypto-m)# set peer { hostname| IP_address} #指定对等体设备,即配置的设备与谁建立连接
Router(config-crypto-m)# set transform-set transform_set_name1 #指定传输集的名称,最多可以列出六个传输集的名称Router(config-crypto-m)# set pfs [ group1 | group2 | group5 ]  
Router(config-crypto-m)# set security-association lifetime {seconds seconds| kilobytes kilobytes}
Router(config-crypto-m)# set security-association idle-time seconds

命令解释:

* Set PFS:(PFS:perfect forward secrecy,完美转发保密)保证两个阶段中的秘钥只能使用一次,进一步增强了安全性,但使用PFS可能占用设备更多的资源。Set pfs命令用于启用这项功能并指定使用哪个DH秘钥组,这是一条可选命令。

* Set security-association lifetime:用于指定SA的生存周期。默认情况下,cisco的设备已经设定数据连接的生存周期为3600s或4608000KB,相当于一小时内以10Mb/s速率传输的流量。生存周期的阈值是由时间和流量两个方面的因素决定的。且相当于任何一项到达阈值的限制时,SA就会被重新协商建立。

如果在IPSEC对等体之间只设置lifetime,即使没有ipsec流量传递,SA也始终处于激活状态,如果在×××设备上配置了很多ipsec连接,这些暂时没有实际意义的SA就会占用设备的内存和CPU资源。从IOS12.2(15)T开始,cisco为数据SA引入空闲超时计时器,如果没有流量通过SA传输,SA就会被设备自动删除。

* Set security-association idle-time命令用于设定空闲超时计数器,范围为60-86400s。默认情况下,空闲超时计时器是关闭的。

相关文章:

通信与网络安全之IPSEC

IPSec(IP Security)是IETF制定的为保证在Internet上传送数据的安全保密性能的三层隧道加密协议。IPSec在网络层对IP报文提供安全服务。IPSec协议本身定义了如何在IP数据包中增加字段来保证IP包的完整性、 私有性和真实性,以及如何加密数据包。…...

Linux内核编译流程(Ubuntu24.04+Linux Kernel 6.8.12)

万恶的拯救者,使用Ubuntu没有声音,必须要自己修改一下Linux内核中的相关驱动逻辑才可以,所以被迫学习怎么修改内核&编译内核,记录如下 准备工作 下载Linux源码:在Linux发布页下载并使用gpg签名验证 即&#xff1a…...

什么是GAN?

一、基本概念 生成对抗网络(Generative Adversarial Network,GAN)是一种由两个神经网络共同组成深度学习模型:生成器(Generator)和判别器(Discriminator)。这两个网络通过对抗的方式…...

torch_geometric使用手册-Creating Graph Datasets(专题四)

虽然 PyG 已经提供了很多有用的数据集,但你可能希望创建自己的数据集,使用自己收集的数据或非公开的数据。 自己实现数据集是非常简单的,你可能想查看源代码,了解各种数据集是如何实现的。然而,这里简要介绍一下如何设置你自己的数据集。 我们提供了两个抽象类用于数据集…...

编程语言之Python

Python是一种高级编程语言,自其诞生以来,便因其简洁明了的语法、强大的功能和广泛的应用领域而备受青睐。以下是对Python的详细介绍,包括其历史、特点、应用领域,以及通过代码示例展示其语法、库、函数等关键概念。同时&#xff0…...

【Go】-调度器简介

目录 数据结构 G M P 调度器启动 创建 Goroutine 初始化结构体 运行队列 调度信息 调度循环 小结 数据结构 Go的运行时调度器的三个重要组成部分 — 线程 M、Goroutine G 和处理器 P: 图 6-29 Go 语言调度器 G — 表示 Goroutine,它是一个待…...

在Ubuntu 22.04上设置Python 3的Jupyter Notebook

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Jupyter Notebook 是一个作为 Web 应用程序的交互式计算命令 shell。该工具可与多种语言一起使用,包括 Python、Julia…...

通讯专题4.1——CAN通信之计算机网络与现场总线

从通讯专题4开始,来学习CAN总线的内容。 为了更好的学习CAN,先从计算机网络与现场总线开始了解。 1 计算机网络体系的结构 在我们生活当中,有许多的网络,如交通网(铁路、公路等)、通信网(电信、…...

将jar包导入maven

1.将jar包放repository 2.执行命令:mvn install:install-file -DgroupIdcom.oracle -DartifactIdojdbc7 -Dversion12.1.0.2 -Dpackagingjar -DfileD:\dev\utils\idea\repository\ojdbc7.jar -Dfile: 指定要安装的JAR文件的路径。 -DgroupId: 指定项目的groupId。 -…...

Mysql实现定时自动备份(Windows环境)

一.新建数据库备份目录 二.新建批处理文件 创建批处理文件mysql_backup.bat echo off set BACKUP_DIRD:\backup set MYSQL_USERroot set MYSQL_PASS123456 set MYSQL_HOSTlocalhost set DATABASE_NAMEphoenix set DATE%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time…...

kafka数据在服务端时怎么写入的

学习背景 接着上篇,我们来聊聊kafka数据在服务端怎么写入的 服务端写入 在介绍服务端的写流程之前,我们先要理解服务端的几个角色之间的关系。 假设我们有一个由3个broker组成的kafka集群,我们在这个集群上创建一个topic叫做shitu-topic&…...

2024算法基础公选课练习七(BFS1)

一、前言 还是偏基础的bfs&#xff0c;但是有几个题不是很好写 二、题目总览 三、具体题目 3.1 问题 A: 数据结构-队列-奇怪的电梯 我的代码 可以看成求一维平面的bfs最短路 #include <bits/stdc.h> using i64 long long; using pii std::pair<int,int>; co…...

算法刷题Day1

BM47 寻找第k大 第一天就随便记录吧&#xff0c;万事开头难&#xff0c;我好不容易开的头&#xff0c;就别难为自己&#xff0c;去追求高质量了。嘿嘿嘿 题目 传送门 解题思路一&#xff1a;维护一个大小为k的最小堆。最后返回堆顶元素。 代码&#xff1a; # # 代码中的类名…...

你还没有将 Siri 接入GPT对话功能吗?

由于各种原因&#xff0c;国内ios用户目前无缘自带 AI 功能&#xff0c;但是这并不代表国内 ios 无法接入 AI 功能&#xff0c;接下来手把手带你为iPhone siri 接入 gpt 对话功能。 siri 接入 chatGPT 暂时还无法下载 ChatGPT app&#xff0c;或者没有账号的读者可以直接跳到…...

LabVIEW 标准状态机设计模式

LabVIEW 标准状态机设计模式 LabVIEW 软件框架介绍LabVIEW编程模式及其应用分析状态机模式的类型分析标准状态机设计模式及状态机应用学习顺序结构它的一个缺点是什么&#xff1f; 状态机结构 LabVIEW 软件框架介绍 源于虚拟仪器技术的LabVIEW程序设计语言&#xff0c;从被创建…...

Scala学习记录,统计成绩

统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名&#xff0c;并保存结果到文件中 解题思路如下&#xff1a; 1.读入txt文件&#xff0c;按行读入 2.处理数据 &#xff08;1&#xff09;计算每个同学的总分平均分 import s…...

使用 client-go 实现 Kubernetes 节点 Drain:详解与实战教程

在 Kubernetes 中使用 client-go 实现 drain 功能涉及多个步骤&#xff0c;需要模仿 kubectl drain 的行为。这包括将节点标记为不可调度&#xff08;cordon&#xff09;、驱逐 Pod&#xff0c;并处理 DaemonSet 和不可驱逐 Pod 的逻辑。以下是实现 drain 的主要步骤&#xff1…...

C#VB.Net项目一键多国语言显示

如何在项目什么都不做一键支持多国语言显示 开始我们的一键快捷使用之旅 01.创建多语言项目 02.一键批量窗口开启本地化,添加选中内容添加Mu方法 03.一键快捷翻译 04.运行查看效果 01.创建多语言项目 创建多语言项目前,请先下载安装&#xff0c;注册并登录. 为了便于演示这…...

【关闭or开启电脑自带的数字键盘】

目录 一、按数字键盘左上角的按键【NumLK Scroll】 二、修改注册表中数字键盘对应的数值【InitialKeyboardIndicators】 1、步骤&#xff1a; 2、知识点&#xff1a; 一、按数字键盘左上角的按键【NumLK Scroll】 这是最简单快捷的方法。 关闭后若想开启&#xff0c;再按一…...

如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使主进程也返回一个非零的退出码?

文章目录 问题回答参考 问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成&#xff0c;并且当这其中任意一个子进程以非零退出码结束时&#xff0c;让该脚本也返回一个非零的退出码&#xff1f; 简单的脚本: #!/bin/bash for i in seq 0 9; docalculations $i & d…...

Asio2网络库

header only,不依赖boost库,不需要单独编译,在工程的Include目录中添加asio2路径,在源码中#include <asio2/asio2.hpp>即可使用;支持tcp, udp, http, websocket, rpc, ssl, icmp, serial_port;支持可靠UDP(基于KCP),支持SSL;TCP支持各种数据拆包功能(单个字符或字符串或用…...

Uniapp 微信小程序内打开web网页

技术栈&#xff1a;Uniapp Vue3 简介 实际业务中有时候会需要在本微信小程序内打开web页面&#xff0c;这时候可以封装一个路由页面专门用于此场景。 在路由跳转的时候携带路由参数&#xff0c;拼接上web url&#xff0c;接收页面进行参数接收即可。 实现 webview页面 新…...

学习线性表_3

单链表的删除 直接删除即可删除后要free //删除第i个位置的元素 //删除时L是不会变的&#xff0c;所以不需要加引用 bool ListDelect(LinkList L,int i) {//i 1,即删除头指针//拿到要删除结点的前一个结点LinkList p GetElem(L,i-1);if(NULLp){return false;}//拿到要删除的结…...

智能桥梁安全运行监测系统守护桥梁安全卫士

一、方案背景 桥梁作为交通基础设施中不可或缺的重要组成部分&#xff0c;其安全稳定的运行直接关联到广大人民群众的生命财产安全以及整个社会的稳定与和谐。桥梁不仅是连接两地的通道&#xff0c;更是经济发展和社会进步的重要纽带。为了确保桥梁的安全运行&#xff0c;桥梁安…...

Arrays.asList()新增报错,该怎么解决

一、前言 在 Java 开发中&#xff0c;Arrays.asList() 是一个常用的工具方法&#xff0c;它允许开发者快速将数组转换为列表。尽管这个方法非常方便&#xff0c;但许多开发者在使用时可能会遭遇一个常见的错误&#xff1a;尝试向由 Arrays.asList() 返回的列表中添加元素时抛出…...

28.UE5实现对话系统

目录 1.对话结构的设计&#xff08;重点&#xff09; 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图&#xff0c;也就是下图中的…...

会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场

11月26日&#xff0c;2024紫光展锐全球合作伙伴大会在上海举办&#xff0c;作为紫光展锐年度盛会&#xff0c;吸引来自全球的众多合作伙伴和行业专家、学者共同参与。美格智能与紫光展锐竭诚合作多年&#xff0c;共同面向5G、AI和卫星通信为代表的前沿科技&#xff0c;聚焦技术…...

IDEA报错: java: JPS incremental annotation processing is disabled 解决

起因 换了个电脑打开了之前某个老项目IDEA启动springcloud其中某个服务直接报错&#xff0c;信息如下 java: JPS incremental annotation processing is disabled. Compilation results on partial recompilation may be inaccurate. Use build process “jps.track.ap.depen…...

面对深度伪造:OWASP发布专业应对指南

从美国大选造谣视频到AI编写的网络钓鱼邮件&#xff0c;深度伪造&#xff08;deepfake&#xff09;诈骗和生成式人工智能攻击日益猖獗&#xff0c;人眼越来越难以辨识&#xff0c;企业迫切需要为网络安全团队制定AI安全事件响应指南。 深度伪造攻击威胁日益增加 全球范围内&…...

IDEA全局设置-解决maven加载过慢的问题

一、IDEA全局设置 注意&#xff1a;如果不是全局设置&#xff0c;仅仅针对某个项目有效&#xff1b;例在利用网上教程解决maven加载过慢的问题时&#xff0c;按步骤设置却得不到解决&#xff0c;原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面&#xff0c;点击f…...

【阅读笔记】Android广播的处理流程

关于Android的解析&#xff0c;有很多优质内容&#xff0c;看了后记录一下阅读笔记&#xff0c;也是一种有意义的事情&#xff0c; 今天就看看“那个写代码的”这位大佬关于广播的梳理&#xff0c; https://blog.csdn.net/a572423926/category_11509429.html https://blog.c…...

queue 和 Stack

import scala.collection.mutable //queue:队列.排队打饭.... //特点&#xff1a;先进先出 //Stack:栈 //特点&#xff1a;先进后出 class ob5 { def main(args: Array[String]): Unit { val q1 mutable.Queue(1) q1.enqueue(2)//入队 q1.enqueue(3)//入队 q1.enqueue(4)…...

C#窗体小程序计算器

使其能完成2个数的加、减、乘、除基本运算。界面如下图&#xff0c;单击相应的运算符按钮&#xff0c;则完成相应的运算&#xff0c;并将结果显示出来&#xff0c;同时不允许在结果栏中输入内容 代码如下&#xff1a; private void button1_Click(object sender, EventArgs e)…...

Linux——自定义简单shell

shell 自定义shell目标普通命令和内建命令&#xff08;补充&#xff09; shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令&#xff08;补充&#xff09; …...

大模型开发和微调工具Llama-Factory-->WebUI

WebUI LLaMA-Factory 支持通过 WebUI 零代码微调大模型。 通过如下指令进入 WebUI llamafactory-cli webui# 如果是国内&#xff0c; # USE_MODELSCOPE_HUB 设为 1&#xff0c;表示模型从 ModelScope 魔搭社区下载。 # 避免从 HuggingFace 下载模型导致网速不畅 USE_MODELSC…...

【网络】应用层协议HTTPHTTPcookie与sessionHTTPS协议原理

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.应用层协议HTTP 2.认识 URL 2.1 urlencode 和 urldecode 3.HTTP 协议请求与响应格式 3.1 HTTP 请求 3.2 HTTP 响应 …...

基于LSTM的文本多分类任务

概述&#xff1a; LSTM&#xff08;Long Short-Term Memory&#xff0c;长短时记忆&#xff09;模型是一种特殊的循环神经网络&#xff08;RNN&#xff09;架构&#xff0c;由Hochreiter和Schmidhuber于1997年提出。LSTM被设计来解决标准RNN在处理序列数据时遇到的长期依赖问题…...

Git忽略文件

在Git中&#xff0c;你可以通过修改 .gitignore 文件来忽略整个文件夹。以下是具体步骤&#xff1a; 打开或创建 .gitignore 文件 确保你的项目根目录下有一个 .gitignore 文件。如果没有&#xff0c;创建一个&#xff1a; touch .gitignore 在 .gitignore 文件中添加要忽略…...

Spring的事务管理

tx标签用于配置事务管理用于声明和配置事务的相关属性 transaction-manager指定一个事务管理器的引用&#xff0c;用于管理事务的生命周期。propagation指定事务的传播属性&#xff0c;决定了在嵌套事务中如何处理事务。isolation指定事务的隔离级别&#xff0c;用于控制事务之…...

java int值可以直接赋值给char类型 详解

在 Java 中&#xff0c;int 值可以直接赋值给 char 类型&#xff0c;但有一定的限制和机制。以下是详细的解释&#xff1a; 1. Java 中的 char 和 int 类型关系 char 的本质 char 是一个 16 位无符号整数类型&#xff0c;用于表示 Unicode 字符。范围为 0 到 65535&#xff0…...

淘宝商品数据获取:Python爬虫技术的应用与实践

引言 随着电子商务的蓬勃发展&#xff0c;淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品数据。这些数据对于市场分析、消费者行为研究、商品推荐系统等领域具有极高的价值。然而&#xff0c;如何高效、合法地从淘宝平台获取这些数据&#xff0c;成为了一个技术挑…...

【力扣】389.找不同

问题描述 思路解析 只有小写字母&#xff0c;这种设计参数小的&#xff0c;直接桶排序我最开始的想法是使用两个不同的数组&#xff0c;分别存入他们单个字符转换后的值&#xff0c;然后比较是否相同。也确实通过了 看了题解后&#xff0c;发现可以优化&#xff0c;首先因为t相…...

何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)

在管理数据库表时&#xff0c;考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外&#xff0c;使用正确的工具&#xff08;例如dbForge Studio for SQL Server&#xff09; &#xff0c;与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解…...

pnpm安装electron出现postinstall$ node install.js报错

pnpm install --registryhttp://registry.npm.taobao.org安装依赖包的时候出现了postinstall$ node install.js报错 找到install.js 找到downloadArtifact方法&#xff0c;添加如下代码 mirrorOptions:{mirror:"http://npmmirror.com/mirrors/electron/"}http://n…...

如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件

如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件 在使用 Hugging Face 的数据集进行模型训练时&#xff0c;有时我们并不需要整个数据集&#xff0c;尤其是当数据集非常大时。为了节省存储空间和提高训练效率&#xff0c;我们可以从数据集中随机采样一部分数…...

Rook入门:打造云原生Ceph存储的全面学习路径(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.2 获取rook最新版本3.3 rook资源文件目录结构3.4 部署Rook/CRD/Ceph集群3.5 查看rook部…...

AWS账号提额

Lightsail提额 控制台右上角&#xff0c;用户名点开&#xff0c;选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...

计算机网络(三)

一个IP包&#xff0c;其数据长度为4900字节&#xff0c;通过一个MTU为1220字节的网络时&#xff0c;路由器的分片情况如何&#xff1f;请用图表的形式表示出路由器分片情况。 已知 IP 包的数据长度为 4900 字节&#xff0c;IP 首部长度通常为 20 字节&#xff0c;所以整个 IP …...

去哪儿Android面试题及参考答案

TCP 的三次握手与四次挥手过程是什么? TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议 ,三次握手和四次挥手是其建立连接和断开连接的重要过程。 三次握手过程 第一次握手:客户端向服务器发送一个 SYN(同步序列号)包,其中包…...

探索温度计的数字化设计:一个可视化温度数据的Web图表案例

随着科技的发展&#xff0c;数据可视化在各个领域中的应用越来越广泛。在温度监控和展示方面&#xff0c;传统的温度计已逐渐被数字化温度计所取代。本文将介绍一个使用Echarts库创建的温度计Web图表&#xff0c;该图表通过动态数据可视化展示了温度值&#xff0c;并通过渐变色…...