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

DMVPN协议

DMVPN(Dynamic Multipoint VPN)动态多点VPN

对于分公司和分总公司内网实现通信环境下,分公司是很多的。我们不可能每个分公司和总公司都挨个建立ipsec隧道 ,而且如果是分公司和分公司建立隧道,就会很麻烦。此时我们需要在分公司和分公司之间建立按需链路(一旦只有数据传输的时候才会建立,没有数据传输的时候不建立隧道)

注意:DMVPN是思科私有的协议技术

DMVPN基于tunnel

  • tunnel:也叫做GRE(GRE:通用路由封装,是一个模型),VPN的模型,隧道的模型,内网到内网的模型,双IP报头的模型

  • image.png

  • 内网数据经过隧道口来进行一个二次封装,这个隧道口也可以起路由协议

  • 配置案列:封装双IP报头
    image.png

    en
    conf ter
    ip route 0.0.0.0 0.0.0.0 100.1.1.1
    int tunnel 0
    ip add 123.1.1.1 255.255.255.0
    tunnel source 100.1.1.2
    tunnel destination 200.1.1.2
    tunnel mode ipip //我们现在是处于封装双IP报头的形式
    exit
    router ospf 100
    router-id 2.2.2.2
    network 123.1.1.0 0.0.0.255 a 0
    network 172.16.1.1 0.0.0.0 a 0
    end
    
    en
    conf ter
    ip route 0.0.0.0 0.0.0.0 200.1.1.1
    int tunnel 0
    ip add 123.1.1.2 255.255.255.0
    tunnel source 200.1.1.2
    tunnel destination 100.1.1.2
    tunnel mode ipip //封装双IP报头
    exit
    router ospf 100
    router-id 1.1.1.1
    network 123.1.1.0 0.0.0.255 a 0
    network 192.168.1.1 0.0.0.0 a 0
    end
    

DMVPN基于NHRP(重点)

  • NHRP:下一条解析解析(有点像ARP)

    NHRP运用场景

  • Spoke 1和Spoke 2会把tunnel口的ip和连接运营商的公网ip做一个映射并且发给Hub,Hub此时收到两个映射关系
  • 但此时Spoke 1和Spoke 2都只有Hub的映射关系,假设Spoke 1去访问123.1.1.1,它会自动映射到11.1.1.2,但是如果Spoke 1去访问Spoke 2(Spoke 1里面并没有123.1.1.3映射的表),它会去找Hub发送请求(请求123.1.1.3,Hub端会把123.1.1.3的映射发给Spoke 1),此时Spoke 1获取的这个表项长时间没用是会超时的,下次要继续发送的时候会重新申请,Spoke 2访问Spoke 1同理

NHRP的配置案例(隧道之间使用RIP协议)

要求:彼此之间的环回口地址可以互通(环回口模拟内网)
image.png

Hub
en
conf ter
int tunnel 0
ip add 123.1.1.1 255.255.255.0
tunnel source 11.1.1.2 //不需要写tunnel destination(因为我们使用的是DMVPN,我们再这里面不知到是有多少个Spoke客户端的,不可能每个都去写)
tunnel mode gre multipoint //把隧道模式改为多点隧道模式(隧道模式默认情况下是点对点模式,而我们现在的环境是点对多点)//配置NHRP
ip nhrp network-id 111 //用于DMVPN的组的一个划分(有点像vtp里面的domain功能,大家都在这个网络号里面才是一个组)
ip nhrp authentication cisco //DMVPN不需要配置destination,防止有人知道我们的预共享密钥冒充连接上来,做一个身份认证)//开启DMVPN的组播功能
ip nhrp map multicast dynamic //让接收到的组播地址自动形成映射关系,因为Spoke端会自动刚给Hub端发送自己的映射(等下会在三台设备上面运行RIP协议,RIP协议是基于组播的,相当于ip nhrp map 224.0.0.9 22.1.1.2的作用,在DMVPN下组播和单播是分开处理的,DMVPN默认情况下是不支持组播的)
exit//隧道上起动态协议
router rip
version 2
no auto-summary
network 123.0.0.0
network 1.0.0.0
exit
//Hub
show ip nhrp

image.png

//Hub
show ip route

image.png

Spoke 1
en
conf ter
int tunnel 0
ip add 123.1.1.2 255.255.255.0
tunnel source 22.1.1.2
tunnel mode gre multipoint
ip nhrp network-id 111
ip nhrp authentication cisco
ip nhrp nhs 123.1.1.1 //配置NHRP的server端的tunnel口地址(他们是基于tunnel口来建立DMVPN的,确定谁是Hub端)//单播映射
ip nhrp map 123.1.1.1 11.1.1.2 //Hub端不会把自己的123.1.1.1对应11.1.1.2的映射发给Spoke端的,仅仅是Spoke端给Hub端发,只有在Spoke端请求的时候才会给他发//组播映射
ip nhrp map multicast 11.1.1.2 //只要是去往组播地址的数据,外面都会加一层公网IP的报头11.1.1.2,Hub端和Spoke端的流量分两种:1.组播流量:组播发送的,一般是服务于路由协议的;2.单播流量(业务流量):一对一发送的
exit//隧道上起动态协议
router rip
version 2
no auto-summary
network 123.0.0.0
network 2.0.0.0
exit
//Spoke 1
show ip nhrp

image.png

//Spoke 1
show ip route

image.png

为什么Hub的内网地址收到了,对端Sopke 2 的内网地址怎么没收到?

RIP的水平分割机制:从一个接口收到的路由不会再从这个接口发送出去(用于防环措施)

此时我们需要关闭RIP协议的水平分割机制

en
conf ter
int tu 0
no ip split-horizon
end
Spoke 2
en
conf ter
int tunnel 0
ip add 123.1.1.3 255.255.255.0
tunnel source 33.1.1.2
tunnel mode gre multipoint
ip nhrp network-id 111
ip nhrp authentication cisco
ip nhrp nhs 123.1.1.1
ip nhrp map 123.1.1.1 11.1.1.2
ip nhrp map multicast 11.1.1.2
exit//隧道上起动态协议
router rip
version 2
no auto-summary
network 123.0.0.0
network 1.0.0.0
exit
//Spoke 2
show ip nhrp

image.png

Spoke 1 ping Spoke 2 的内网地址查表过程

ping 3.3.3.3

//Spoke 1
show ip route

image.png

//Spoke 1
show ip nhrp

image.png

  1. Spoke1 ping 3.3.3.3,先查路由表,看到去往3.3.3.3的下一跳为123.1.1.1,去往123.1.1.1从tunnel 0口出去
  2. 进入tunnel 0口之后开始查NHRP表,123.1.1.3对应的是33.1.1.2的一个映射封装
验证

当Spoke 1 ping Spoke 2的tunnel口时候,此时你就能看见动态获得映射关系
image.png

show ip nhrp

image.png

NHRP的配置案例(隧道之间使用EIGRP协议)

要求:彼此之间的环回口地址可以互通(环回口模拟内网)
image.png

Hub
en
conf ter
int tunnel 0
ip add 123.1.1.1 255.255.255.0
tunnel source 11.1.1.2
tunnel mode gre mutipoint
ip nhrp network-id 111
ip nhrp authentication cisco
ip nhrp map multicast dynamic
exit//在隧道上起动态协议
router EIGRP 100
no auto-summary
network 123.1.1.0 0.0.0.255
network 1.1.1.0 0.0.0.255
exit//关闭EIGRP的水平分割
int tunnel 0
no ip split-horizon eigrp 100 //关闭EIGRP 100的水平分割
exit//关闭EIGRP承载下一跳功能
int tunnel 0
no ip next-hop-self eigrp 100 //关闭EIGRP 100的承载下一跳
//Hub
show ip route

image.png

  • 此时Hub端收到了Spoke 1和Spoke 2的路由条目
Spoke 1
en
conf ter
int tunnel 0
ip add 123.1.1.2 255.255.255.0
tunnel source 22.1.1.2
tunnel mode gre multipoint
ip nhrp network-id 111
ip nhrp authentication cisco
ip nhrp nhs 123.1.1.1
ip nhrp map 123.1.1.1 11.1.1.2
ip nhrp map multicast 11.1.1.2
exit//隧道上起动态协议
router EIGRP 100
no auto-summary
network 123.1.1.0 0.0.0.255
network 2.2.2.0 0.0.0.255
exit
//Spoke 1
show ip route

image.png

  • 此时Spoke 1上只收到了Hub的路由条目,没有收到对端Spoke 2的路由条目,和RIP的情况相同
  • 解决方法:在Hub的tunnel口上把EIGRP100的水平分割关掉
  • 水平分割关掉之后接着查看路由表
//Spoke 1
show ip route

image.png

  • 此时会发现去往3.3.3.3条目的下一条为123.1.1.1(Spoke1去往Spoke2的3.3.3.3得经过Hub端),出现了次优路径,不可能下面的分布去往任何一个分布,数据都得经过总部
  • 这个就是是EIGRP的特性:Spoke2把自己3.3.3.3的路由条目发给了Hub端,Hub端接收到了这个路由条目又发给Spoke1,路由按正常来说,谁发给我的,我收到的这个条目的下一跳地址就是谁(按道理来说没问题,但是在我们这个环境中就有问题了)
  • 为了解决这个问题,需要在Hub上面关闭承载下一跳功能(让它恢复原有的下一跳功能)
  • 关闭承载下一跳功能之后接着查看路由表
//Spoke 1
show ip route

image.png

  • 此时发现Spoke1去往3.3.3.3的下一条为123.1.1.3了
Spoke 2
en
conf ter
int tunnel 0
ip add 123.1.1.3 255.255.255.0
tunnel source 33.1.1.2
tunnel mode gre multipoint
ip nhrp network-id 111
ip nhrp authentication cisco
ip nhrp nhs 123.1.1.1
ip nhrp map 123.1.1.1 11.1.1.2
ip nhrp map multicast 11.1.1.2
exit//隧道上起动态协议
router EIGRP 100
no auto-summary
network 123.1.1.0 0.0.0.255
network 3.3.3.0 0.0.0.255
exit
//Spoke 2
show ip route

image.png

  • 此时Spoke 2上只收到了Hub的路由条目,没有收到对端Spoke 1的路由条目

NHRP的配置案例(隧道之间使用OSPF协议)

要求:彼此之间的环回口地址可以互通(环回口模拟内网)
image.png

Hub
en
conf ter
int tunnel 0
ip add 123.1.1.1 255.255.255.0
tunnel source 11.1.1.2
tunnel mode gre mutipoint
ip nhrp network-id 111
ip nhrp authentication cisco
ip nhrp map multicast dynamic
exit//在隧道上起动态协议
router ospf 100
router-id 1.1.1.1
net 1.1.1.0 0.0.0.255 a 0
net 123.1.1.0 0.0.0.255 a 0
exit//更改接口的网络类型
int tunnel 0
ip ospf network broadcast //更改tunnel 0接口的网络类型为广播
exit
  • 此时会发现每台设备上面都会有大量的报错信息
    image.png

  • 并且查看邻居时,邻居会不停的变换
    image.png
    image.png

  • 查看tunnel 0接口的状态

//Hub
show ip ospf interface tunnel 0

image.png | 900
参数信息查看

  • Network Type POINT-TO-POTIN(tunnel口的默认网络类型为点对点的网络类型,只能一次性建立一个邻居)
  • 但此时Hub端需要建立多个邻居关系,不能是点对点的网络类型
  • 解决方法,更改tunnel口的网络类型(建立ospf邻居的设备都要修改,因为ospf建立邻居需要都在同一个网络类型结构)
  • 在Hub和Spoke这种网络结构的情况下,需要让Hub为DR,这就需要设备其他Spoke不参与选举DB和BD(因为Spoke端都得把路由信息发给Spoke端,由Hub端去做同步),把建立邻居的端口的优先级设置为0就不会参与选举了
  • 如果Hub的tunnel口为广播类型,Spoke1和Spoke2的tunnel为点对点类型,此时会发现邻居起来了,但是没有路由条目
  • 查看ospf数据库的1类LSA
//Spoke 1
show ip ospf 100 database router

image.png

参数说明

  • Adv Router is not-reachable //表示通告路由器是不可达的(如果看一类条目有这个错误信息,大多数都是网络类型不同导致的)

  • 最后查看邻居建立的情况
    image.png

  • 此时会发现Hub已经是DR了,并且Spoke1和Spoke2不参与选举

Spoke 1
en
conf ter
int tunnel 0
ip add 123.1.1.2 255.255.255.0
tunnel source 22.1.1.2
tunnel mode gre multipoint
ip nhrp network-id 111
ip nhrp authentication cisco
ip nhrp nhs 123.1.1.1
ip nhrp map 123.1.1.1 11.1.1.2   
ip nhrp map multicast 11.1.1.2
exit//在隧道上起动态协议
router ospf 100
router-id 2.2.2.2
net 2.2.2.0 0.0.0.255 a 0
net 123.1.1.0 0.0.0.255 a 0
exit//更改接口的网络类型
int tunnel 0
ip ospf network broadcast //更改tunnel 0接口的网络类型为广播
exit//设置接口优先级,不参与选举DR和BDR
int tunnel 0
ip ospf priority 0
exit

最后查看建立邻居的情况

//Spoke 1
show ip ospf neighbors

image.png

Spoke 2
en
conf ter
int tunnel 0
ip add 123.1.1.3 255.255.255.0
tunnel source 33.1.1.2
tunnel mode gre multipoint
ip nhrp network-id 111
ip nhrp authentication cisco
ip nhrp nhs 123.1.1.1
ip nhrp map 123.1.1.1 11.1.1.2
ip nhrp map multicast 11.1.1.2
exit//在隧道上起动态协议
router ospf 100
router-id 3.3.3.3
net 3.3.3.0 0.0.0.255 a 0
net 123.1.1.0 0.0.0.255 a 0
exit//更改接口的网络类型
int tunnel 0
ip ospf network broadcast //更改tunnel 0接口的网络类型为广播
exit//设置接口优先级,不参与选举DR和BDR
int tunnel 0
ip ospf priority 0
exit

最后查看建立邻居的情况

//Spoke 2
show ip ospf neighbors

image.png

基于IPSEC

基于上面的配置开始做IPSec

image.png

Hub
en
conf ter
crypto isakmp policy 10
encryption 3des
hash md5
authentication pre-share
group 2
exit
crypto isakmp key 0 cisco address 0.0.0.0 //配置PSK(此时不能能够确定Spoke端是多少,假设有100个Spoke端,照之前的配置就跟做L2L差不多)
crypto ipsec transform-set X esp-md5-hmac esp-3des//创建一个IPSec简档,名为DMVPN
crypto ipsec profile DMVPN
set transform-set X
exit//挂载接口
int tunnel 0
tunnel protection ipsec profile DMVPN
end
//Spoke 1
show crypto engine connections active

image.png
此时我都没有发送数据,从哪里来的加密解密的数据?(RIP的周期跟新,30/s更新一次)

Spoke 1
en
conf ter
crypto isakmp policy 10
encryption 3des
hash md5
authentication pre-share
group 2
exit
crypto isakmp key 0 cisco address 0.0.0.0
crypto ipsec transform-set X esp-md5-hamc esp-3des
exit
crypto ipsec profile DMVPN
set transform-set X
exit
int tunnel 0
tunnel protection ipsec profile DMVPN
end
//Spoke1
show crypto isakmp sa

image.png

Spoke 2
en
conf ter
crypto isakmp policy 10
encryption 3des
hash md5
authentication pre-share
group 2
exit
crypto isakmp key 0 cisco address 0.0.0.0
crypto ipsec transform-set X esp-md5-hamc esp-3des
exit
crypto ipsec profile DMVPN
set transform-set X
exit
int tunnel 0
tunnel protection ipsec profile DMVPN
end

说说DMVPN是一个怎么样的形态

image.png

  • 分公司和总公司之间都建立隧道,但是分公司和分公司之间也可能有数据传输,此时总公司是固定的,分公司不是固定的,所有分公司和分公司之间不可能每一个都要建立隧道(数量太多了),所以让分公司和分公司之间一旦有需要的时候才建立按需链路
  • 分公司和分公司之间没有数据传输的时候是不建立隧道的,有数据传输的时候才动态的建立一条隧道
  • 这条隧道又是如何产生的呢?
    • 分公司和总公司之间有连接,从总公司这里获取到另外一个分公司的tunnel对应的公网IP(这里牵扯到一个map映射关系,这个映射关系就是总公司有所有分公司tunnel口对应的公网IP),一旦分公司有响应要跟另外一个分公司建立按需链路的时候,就要向总公司去请求这个的一个映射关系
    • 这时数据再传输的时候,数据就是通过DMVPN来建立的,通过IPSec来加密的,这个就是动态多点VPN
  • 这个按需链路的请求又怎么配置呢?
    • 这就需要用到NHRP(下一跳解析协议)
    • NHRP最主要的作用:总公司和分公司之间如何进行map的一个响应关系

相关文章:

DMVPN协议

DMVPN(Dynamic Multipoint VPN)动态多点VPN 对于分公司和分总公司内网实现通信环境下,分公司是很多的。我们不可能每个分公司和总公司都挨个建立ipsec隧道 ,而且如果是分公司和分公司建立隧道,就会很麻烦。此时我们需…...

leetcode动态规划(十八)-零钱兑换II

题目 322.零钱兑换II 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬…...

2024 CSP-J 题解

2024 CSP-J题解 扑克牌 ​ 题目给出了一整套牌的定义,但是纯粹在扯淡,完全没有必要去判断给出的牌的花色和点数,我们用一个循环来依次读入每一张牌,如果这个牌在之前出现过,我们就让答案减一。这里建议用map、unorde…...

GPU 服务器厂家:中国加速计算服务器市场的前瞻洞察

科技的飞速发展,让 GPU 服务器在加速计算服务器领域的地位愈发凸显。中国加速计算服务器市场正展现出蓬勃的生机,而 GPU 服务器厂家则是这场科技盛宴中的关键角色。 从市场预测的趋势来看,2023 年起,中国加速计算服务器市场便已展…...

Hadoop集群修改yarn队列

1.修改默认的default队列参数 注意&#xff1a; yarn.scheduler.capacity.root.队列名.capacity总和不能超过100 <property><name>yarn.scheduler.capacity.root.queues</name><value>default,hive,spark,flink</value><description>The…...

【GPIO】2.ADC配置错误,还是能得到电压数据

配置ADC功能时&#xff0c;GPIO引脚弄错了&#xff0c;P1写成P2&#xff0c;但还是配置成功&#xff0c;能得到电压数据。 首先一步步排查&#xff1a; 既然引脚弄错了&#xff0c;那引脚改为正确的引脚&#xff0c;能得到数据通过第一步判断&#xff0c;GPIO配置似乎是不起作…...

css-元素居中方式

<section class"wrapper"><div class"content">Content goes here</div> </section>1. 使用 Flexbox Flexbox 是一种现代的布局方法&#xff0c;可以轻松实现居中。 .wrapper {display: flex; /* 使用 Flexbox …...

redis内存打满了怎么办?

1、设置maxmemory的大小 我们需要给 Redis设置maxmemory的大小&#xff0c;如果不设置的话&#xff0c;它会受限于系统的物理内存和系统对内存的管理机制。 2、设置内存的淘汰策略 内存的淘汰策略分为 8 种&#xff0c;从淘汰范围来说分为从所有的key中淘汰和从设置过期时间…...

决策算法的技术分析

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)第一层级:分层状态机、分层决策树的想法(三个臭皮匠胜过一个诸葛亮)基于场景的固定规则化的分层决策核心思想(2)第二层级:数据管理的方…...

【Python爬虫】获取汽车之家车型配置附代码(2024.10)

参考大哥&#xff0c;感谢大哥&#xff1a;https://blog.csdn.net/weixin_43498642/article/details/136896338 【任务目标】 工作需要想更方便地下载汽车之家某车系配置清单&#xff1b;&#xff08;垃圾汽车之家不给下载导出表格&#xff0c;配置页叉掉了车系要出来还要重新…...

JVM 加载 class 文件的原理机制

JVM 加载 class 文件的原理机制 JVM&#xff08;Java虚拟机&#xff09;是一个可以执行Java字节码的虚拟机。它负责执行Java应用程序和应用程序的扩展&#xff0c;如Java库和框架。 文章目录 JVM 加载 class 文件的原理机制1. JVM1.1 类加载器1.2 魔数1.3 元空间 2. 类加载2.1 …...

NumPy学习第九课:字符串相关函数

前言 各位有没有注意到&#xff0c;NumPy从第八课开始其实基本上都是讲的是NumPy的函数&#xff0c;而且其实就是各种函数的调用&#xff0c;因为NumPy是一个很强大的函数库&#xff0c;这对我们以后再处理项目中遇到的问题时会有很大的帮助。我们将常用的函数进行一个列举&am…...

卷积神经网络(CNNs)在处理光谱特征的序列属性时表现不佳

卷积神经网络&#xff08;CNNs&#xff09;在处理光谱签名的序列属性时表现不佳&#xff0c;主要是由于其固有网络架构的局限性。具体原因如下&#xff1a; 局部感受野&#xff08;Local Receptive Field&#xff09;&#xff1a; CNN 的核心操作是卷积&#xff0c;它利用局部感…...

【IC】MCU的Tick和晶振频率

Tick 是指 MCU 内部时钟的一个周期&#xff0c;通常表示为一个固定的时间间隔。每个 tick 代表一个时间单位&#xff0c;通常以毫秒&#xff08;ms&#xff09;或微秒&#xff08;μs&#xff09;为单位。Tick 通常由 MCU 的定时器或计时器生成&#xff0c;作为系统时钟的一部分…...

从0到1学习node.js(npm)

文章目录 一、NPM的生产环境与开发环境二、全局安装三、npm安装指定版本的包四、删除包 五、用npm发布一个包六、修改和删除npm包1、修改2、删除 一、NPM的生产环境与开发环境 类型命令补充生产依赖npm i -S uniq-S 等效于 --save -S是默认选项npm i -save uniq包的信息保存在…...

【STM32 Blue Pill编程实例】-OLED显示DS18B20传感器数据

OLED显示DS18B20传感器数据 文章目录 OLED显示DS18B20传感器数据1、DS18B20介绍2、硬件准备及接线3、模块配置3.1 定时器配置3.2 DS18B20传感器配置3.3 OLED的I2C接口配置4、代码实现在本文中,我们将介绍如何将 DS18B20 温度传感器与 STM32 Blue Pill 开发板连接,并使用 HAL …...

STM32 从0开始系统学习3 启动流程

目录 写在前面 速通&#xff1a;做了什么&#xff1a; 分析I&#xff1a;分析2011年的startup文件所作 分析II&#xff1a;分析2017年的startup文件所作 Helps 2011 2017 Reference 写在前面 请各位看官看本篇笔记的时候首先了解一下计算机体系架构&#xff0c;了解基本…...

交换机:端口安全与访问控制指南

为了实现端口安全和访问控制&#xff0c;交换机通常通过以下几种机制和配置来保护网络&#xff0c;防止未经授权的访问和恶意攻击。 01-端口安全 定义及功能 端口安全功能允许管理员限制每个交换机端口可以学习的MAC地址数量。 通过绑定特定的MAC地址到交换机的某一端口上&a…...

【C++ | 数据结构】八大常用排序算法详解

1. 排序的稳定性 排序是我们生活中经常会面对的问题&#xff0c;小朋友站队的时候会按照从矮到高的顺序排列&#xff1b;老师查看上课出勤情况时&#xff0c;会按照学生的学号点名&#xff1b;高考录取时&#xff0c;会按照成绩总分降序依次录取等等。那么对于排序它是如何定义…...

Oracle 第7章:数据完整性约束

在Oracle数据库中&#xff0c;数据完整性是指确保存储在数据库中的数据的正确性和一致性。为了实现这一点&#xff0c;Oracle提供了多种机制来维护数据完整性&#xff0c;包括主键&#xff08;Primary Key&#xff09;、外键&#xff08;Foreign Key&#xff09;和唯一性约束&a…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...