kubernetes网络(二)之bird实现节点间BGP互联的实验

news2024/9/24 17:22:09

摘要

上一篇文章中我们学习了calico的原理,kubernetes中的node节点,利用 calico 的 bird 程序相互学习路由,为了加深对 bird 程序的认识,本文我们将使用bird进行实验,实验中实现了BGP FULL MESH模式让宿主相互学习到对方的容器网段,从而达到容器网段能相互通信的目的。

bird 实验

bird简介

  • BIRD 实际上是 BIRD Internet Routing Daemon 的缩写,是一款可运行在 Linux 和其他类 Unix 系统上的路由软件,它实现了多种路由协议,比如 BGP、OSPF、RIP 等。

  • BIRD 会在内存中维护许多路由表,路由表根据不同的协议,通过与各种“其他事物”交换路由信息,来更新路由规则。这里说的“其他事物”可能是其他的路由表,也可能是外部的路由器,还可以是内核的某些 API。

  • 基本概念

路由表

路由表(Routing tables)是 BIRD 的核心,一个路由表是内存中一组路由规则的集合,BIRD 根据网络类型的不同会有多种路由表。默认情况下,BIRD 有master默认的路由表。除此外,你也可以创建其他的路由表。

协议与通道

协议(Protocols)将路由表和“其他事物”连接起来。“其他事物”可以是一个 Socket 对象,连接了外部的路由器,例如 BGP 路由协议;也可以是修改 FIB 的内核 API,例如kernel协议;也可以是空,比如静态路由static协议。一个协议可以实例化为多个对象,例如创建多个 BGP 协议的实例,以表示多个 BGP 邻居。协议也会提供一些路由属性,根据协议的不同路由属性也不同,比如使用 BGP 协议时,会有bgp_path属性。

本文的目标不是介绍bird的基础概念,重点在于bgp的实操,如果需要详细了解相关概念可以查阅文档:https://soha.moe/post/bird-bgp-kickstart.html

目标

  • 学习bird程序的安装方法
  • 学习bird.conf配置文件的语法
  • 学习使用bird实现三台宿主bgp full mesh 模式
  • 三台宿主的各个容器网段能相互通信

实验环境

系统版本bird版本宿主IP容器网段
ubuntu16.04BIRD 1.5.010.226.11.27192.168.227.0/24
ubuntu16.04BIRD 1.5.010.226.11.22192.168.222.0/24
ubuntu16.04BIRD 1.5.010.226.11.21192.168.221.0/24

实验拓扑

三台宿主在同一网段内,每个宿主各自下挂一个容器网段,下面实现三台服务器两两相互建立bgp peer,相互学习路由,最终目的是实现各个容器网段能相互通信。

创建模拟的容器网段

在这里插入图片描述

我们知道容器是通过linux 的 namespace 机制实现的一个隔离空间, 这里我们同样借助 namespace 机制 实现一个隔离空间,并为隔离出的命名空间配置网络,模拟一个宿主"挂了"一个容器网段。

  • 宿主10.226.11.22上创建模拟容器网段
# 创建命名空间 netns1
ip netns add netns1
# 创建 veth peer
ip link add veth1 type veth peer name veth2
# 将 veth1 放入 netns1
ip link set veth1 netns netns1
# 查看 veth
ip link show | grep veth
# 为 netns1 中的
ip netns exec netns1 ifconfig veth1 192.168.222.102/24 up
# 为 netns1 指定默认网关,网关是宿主1的网络协议栈
ip netns exec netns1 route add -net 0.0.0.0/0 gw 192.168.222.101
# 为宿主中的 veth2 配置IP地址,这样就实现了宿主与netns1 通过 veth2 与 veth1 的互联
ifconfig veth2 192.168.222.101/24 up
  • 宿主10.226.11.21上创建模拟容器网段
ip netns add netns1
ip link add veth1 type veth peer name veth2
ip link set veth1 netns netns1
ip link show | grep veth
ip netns exec netns1 ifconfig veth1 192.168.221.102/24 up
ip netns exec netns1 route add -net 0.0.0.0/0 gw 192.168.221.101
ifconfig veth2 192.168.221.101/24 up
  • 宿主10.226.11.27上创建模拟容器网段
ip netns add netns1
ip link add veth1 type veth peer name veth2
ip link set veth1 netns netns1
ip link show | grep veth
ip netns exec netns1 ifconfig veth1 192.168.227.102/24 up
ip netns exec netns1 route add -net 0.0.0.0/0 gw 192.168.227.101
ifconfig veth2 192.168.227.101/24 up

bird的安装

  • bird程序的安装
apt-get update
apt-get install bird
/etc/init.d/bird start

  • 检查是否安装成功
/etc/init.d/bird status
birdc show status

输出如下显示表示安装正常

root@10_226_11_21:/etc/bird# birdc show status
BIRD 1.5.0 ready.
BIRD 1.5.0
Router ID is 10.226.11.21
Current server time is 2024-09-23 15:03:28
Last reboot on 2024-09-22 20:22:36
Last reconfiguration on 2024-09-23 13:01:00
Daemon is up and running

bgp full-mesh模式的实现

宿主10.226.11.27上的/etc/bird/bird.conf配置
# This is a minimal configuration file, which allows the bird daemon to start
# but will not cause anything else to happen.
#
# Please refer to the documentation in the bird-doc package or BIRD User's
# Guide on http://bird.network.cz/ for more information on configuring BIRD and
# adding routing protocols.

#log syslog all;
log "/var/log/bird.log" all;
# Change this into your BIRD router ID. It's a world-wide unique identification
# of your router, usually one of router's IPv4 addresses.
router id 10.226.11.27;

filter export_filter_v4 {
	if net ~ [ 192.168.227.0/24 ] then accept; # 如果为默认路由则拒绝
	reject;
	#accept; # 接收所有其他路由
}
# The Kernel protocol is not a real routing protocol. Instead of communicating
# with other routers in the network, it performs synchronization of BIRD's
# routing tables with the OS kernel.
protocol kernel {
	debug { states };
	scan time 10;
	learn;
	persist;
	import none;  # kernel to bird map
	export all;   # Actually insert routes into the kernel routing table
}

# The Device protocol is not a real routing protocol. It doesn't generate any
# routes and it only serves as a module for getting information about network
# interfaces from the kernel.
protocol direct {
	interface "veth2";
}
protocol device {
}

# 与10.226.11.21建立bgp peer的配置
protocol bgp peer_10_226_11_21 {
	debug { states };
	local as 64512;
	neighbor 10.226.11.21 as 64512;
	source address 10.226.11.27;
	#multihop;
	password "passwd";
	direct;
	export filter export_filter_v4; # 使用过滤表 export_filter_v4 控制哪些路由可以发布给bgp peer
	import all; # 从 direct, device, static, kernel 等所有protocol的路由都导入bird 的 bgp 路由
}

# 与10.226.11.22建立bgp peer的配置
protocol bgp peer_10_226_11_22 {
	debug { states };
	# 配置 BGP 的 graceful restart
    	# 如果对端因为网络抖动或暂时崩溃而暂时下线,会导致所有传入路由瞬间消失
    	# 为了避免这种情况下数据转发中断,才有 graceful restart
    	# 建议打开
	graceful restart on;
	# 指定自己的 ASN 为 65550
	local as 64512;
	# 指定对端的 ASN 为 64512,IP 为 10.226.11.22
    	# 如果 ASN 和 local as 相同,那么 BIRD 会自动认为这是一个 iBGP,否则是 eBGP
    	# i 表示 internal(内部),e 表示 external(外部)
	neighbor 10.226.11.22 as 64512;
	# source: 定义本地地址作为BGP会话的源地址。Default:邻居所连接接口的本端地址。
	source address 10.226.11.27;
	#multihop;
	# password: 如果和对端约定了密码,在这里配置约定好的密码,否则不用写
	password "passwd";
	# direct: eBGP 默认启用可以不写
        # direct: iBGP 如果是直接连接的可以写这个来避免 multihop 被指定
	# 指定邻居为直连。邻居的IP地址必须在直接可达的IP范围内(即与路由器的接口有关联),
	# 否则BGP会话不会启动,而是等待这样的接口出现。另一种选择是多跳选项。默认值:使能eBGP。
	direct;
        #export all; # 将所有 bird 路由表中的路由都通过bgp发布给peer
	#export: 控制哪些路由可以发布给bgp peer
	export filter {
		# net 匹配的则被filter放行
		if net ~ [ 192.168.227.0/24 ] then accept;
		# 其他的路由全部被filter挡住,从而不会被发布给bgp peer
		reject;
	};
	import all;
}

由于配置文件较长,我们展开详细讲解。

Bird.conf配置详细说明

关于bird.conf配置文件的详细说明可以参考文档 https://soha.moe/post/bird-bgp-kickstart.html

log "/var/log/bird.log" all;

log的配置,表示bird日志单独记录的文件/var/log/bird.log; 如果你希望log记录到系统默认日志,可以使用

#log syslog all;

router id 10.226.11.27;

定义bgp节点的 router-id , bgp 协议中要求每个节点必须定义一个router-id,而且是全局唯一不能重复。

Protocol 表示

对 kernel 路由表的控制

protocol kernel {
	# 开启debug模式,日志输出更详细
	debug { states };
	# 参与安全重启恢复。如果启用了该选项,并且激活了优雅重启恢复,那么内核协议将推迟路由表的同步,直到恢复结束。注意,内核路由导入到BIRD不受影响。
	graceful restart on;
	# 每 10 秒扫描一次kernel路由表。这个路由表就是用户在宿主上执行ip route show 看到的表
	scan time 10;
	# 允许学习由其他路由守护进程或系统管理员添加到内核路由表中的路由。这只能在支持路由作者识别的系统上实现。
	# 缺省情况下,不引入由kernel(标记为“proto kernel”)创建的路由。使用learn all选项来导入这些路由。
	learn;
	# 告诉BIRD在退出时将所有路由留在路由表中(而不是清理它们)
	persist;
	# import 控制哪些路由被导入到 bird
	import none;  # kernel to bird map
	# export 控制哪些路由从 bird 插入到 kernel 路由表
	export all;   # Actually insert routes into the kernel routing table
}

对直连路由的控制

protocol direct {
	# interface 指定哪个接口的路由将被导入到bird路由表
	interface "veth2";
}

控制对bgp peer 10.226.11.22 的路由发布

protocol bgp peer_10_226_11_22 {
	debug { states };
	# 配置 BGP 的 graceful restart
    	# 如果对端因为网络抖动或暂时崩溃而暂时下线,会导致所有传入路由瞬间消失
    	# 为了避免这种情况下数据转发中断,才有 graceful restart
    	# 建议打开
	graceful restart on;
	# 指定自己的 ASN 为 65550
	local as 64512;
	# 指定对端的 ASN 为 64512,IP 为 10.226.11.22
    	# 如果 ASN 和 local as 相同,那么 BIRD 会自动认为这是一个 iBGP,否则是 eBGP
    	# i 表示 internal(内部),e 表示 external(外部)
	neighbor 10.226.11.22 as 64512;
	# source: 定义本地地址作为BGP会话的源地址。Default:邻居所连接接口的本端地址。
	source address 10.226.11.27;
	#multihop;
	# password: 如果和对端约定了密码,在这里配置约定好的密码,否则不用写
	password "passwd";
	# direct: eBGP 默认启用可以不写
        # direct: iBGP 如果是直接连接的可以写这个来避免 multihop 被指定
	# 指定邻居为直连。邻居的IP地址必须在直接可达的IP范围内(即与路由器的接口有关联),
	# 否则BGP会话不会启动,而是等待这样的接口出现。另一种选择是多跳选项。默认值:使能eBGP。
	direct;
        #export all; # 将所有 bird 路由表中的路由都通过bgp发布给peer
	#export: 控制哪些路由可以发布给bgp peer
	export filter {
		# net 匹配的则被filter放行
		if net ~ [ 192.168.227.0/24 ] then accept;
		# 其他的路由全部被filter挡住,从而不会被发布给bgp peer
		reject;
	};
	# import 控制对方bgp peer 发个我的路由,哪些会被我接收
	import all;
}

控制对bgp peer 10.226.11.21 的路由发布

protocol bgp peer_10_226_11_21 {
	debug { states };
	local as 64512;
	neighbor 10.226.11.21 as 64512;
	source address 10.226.11.27;
	#multihop;
	password "passwd";
	direct;
	export filter export_filter_v4; # 使用过滤表 export_filter_v4 控制哪些路由可以发布给bgp peer
	import all; # 从 direct, device, static, kernel 等所有protocol的路由都导入bird 的 bgp 路由
}

示意图
在这里插入图片描述

宿主10.226.11.22上的/etc/bird/bird.conf配置
# This is a minimal configuration file, which allows the bird daemon to start
# but will not cause anything else to happen.
#
# Please refer to the documentation in the bird-doc package or BIRD User's
# Guide on http://bird.network.cz/ for more information on configuring BIRD and
# adding routing protocols.

#log syslog all;
log "/var/log/bird.log" all;
# Change this into your BIRD router ID. It's a world-wide unique identification
# of your router, usually one of router's IPv4 addresses.
router id 10.226.11.22;

filter export_filter_v4 {
	if net ~ [ 192.168.222.0/24 ] then accept; # 如果为默认路由则拒绝
	reject;
	#accept; # 接收所有其他路由
};
# The Kernel protocol is not a real routing protocol. Instead of communicating
# with other routers in the network, it performs synchronization of BIRD's
# routing tables with the OS kernel.
protocol kernel {
	debug { states };
	scan time 10;
	learn;
	persist;
	import none;  # kernel to bird map
	export all;   # Actually insert routes into the kernel routing table
}

# The Device protocol is not a real routing protocol. It doesn't generate any
# routes and it only serves as a module for getting information about network
# interfaces from the kernel.
protocol direct {
	interface "veth2";
}
protocol device {
}

protocol bgp peer_10_226_11_21 {
	debug { states };
	local as 64512;
	neighbor 10.226.11.21 as 64512;
	source address 10.226.11.22;
	#multihop;  # multihop 用于source address 不是直连的情况,比如使用loopback地址互联
	direct;
	password "passwd";
	export all;
	import all;
}

protocol bgp peer_10_226_11_27 {
	debug { states };
	local as 64512;
	neighbor 10.226.11.27 as 64512;
	source address 10.226.11.22;
	direct;
	password "passwd";
	export all;
	import all;
}
宿主10.226.11.21上的/etc/bird/bird.conf配置
# This is a minimal configuration file, which allows the bird daemon to start
# but will not cause anything else to happen.
#
# Please refer to the documentation in the bird-doc package or BIRD User's
# Guide on http://bird.network.cz/ for more information on configuring BIRD and
# adding routing protocols.
log "/var/log/bird.log" all;
# Change this into your BIRD router ID. It's a world-wide unique identification
# of your router, usually one of router's IPv4 addresses.
router id 10.226.11.21;

filter filter_export_v4 {
	if net ~ [ 192.168.21.0/24 ] then accept;
	if net ~ [ 192.168.221.0/24 ] then accept;
	reject;
}
# The Kernel protocol is not a real routing protocol. Instead of communicating
# with other routers in the network, it performs synchronization of BIRD's
# routing tables with the OS kernel.
protocol kernel {
	learn;
	persist;
	scan time 10;
	import none;
	export all;   # Actually insert routes into the kernel routing table
}

# The Device protocol is not a real routing protocol. It doesn't generate any
# routes and it only serves as a module for getting information about network
# interfaces from the kernel.
protocol device {
}

protocol direct {
	interface "veth2";
}

protocol bgp peer_10_226_11_22 {
	debug { states };
	local as 64512;
	neighbor 10.226.11.22 as 64512;
        source address 10.226.11.21;
	#multihop;
	direct;
	password "passwd";
	export all;
	import all;
}

protocol bgp peer_10_226_11_27 {
	debug { states };
	local as 64512;
	neighbor 10.226.11.27 as 64512;
        source address 10.226.11.21;
	direct;
	password "passwd";
	export all;
	import all;
}

查看状态

登录宿主10.226.11.27查看其相关网络的状态

  • 查看 bgp peer 邻居状态

Established表示与bgp peer邻接关系已经建立,而且已经相互完成了路由学习

root@10_226_11_27:/work/code# birdc  show  protocol
BIRD 1.5.0 ready.
name     proto    table    state  since       info
kernel1  Kernel   master   up     16:06:17
direct1  Direct   master   up     16:06:17
device1  Device   master   up     16:06:17
peer_10_226_11_21 BGP      master   up     16:06:21    Established
peer_10_226_11_22 BGP      master   up     16:06:22    Established
  • bird 路由表
root@10_226_11_27:/work/code# birdc show route
BIRD 1.5.0 ready.
# 从 protocol direct 导入的路由
192.168.227.0/24   dev veth2 [direct1 16:06:17] * (240)
# 从 bgp peer_10_226_11_21 学习的路由 
192.168.221.0/24   via 10.226.11.21 on eth0 [peer_10_226_11_21 16:06:21] * (100) [i]
# 从 bgp peer_10_226_11_22 学习的路由 
192.168.222.0/24   via 10.226.11.22 on eth0 [peer_10_226_11_22 16:18:14] * (100) [i]
  • bird路由表的详细信息
root@10_226_11_27:/work/code# birdc show route all
BIRD 1.5.0 ready.
192.168.227.0/24   dev veth2 [direct1 16:06:17] * (240)
	Type: device unicast univ
192.168.221.0/24   via 10.226.11.21 on eth0 [peer_10_226_11_21 16:06:21] * (100) [i]
	Type: BGP unicast univ
	BGP.origin: IGP
	BGP.as_path:
	BGP.next_hop: 10.226.11.21
	BGP.local_pref: 100
192.168.222.0/24   via 10.226.11.22 on eth0 [peer_10_226_11_22 16:18:14] * (100) [i]
	Type: BGP unicast univ
	BGP.origin: IGP
	BGP.as_path:
	BGP.next_hop: 10.226.11.22
	BGP.local_pref: 100
  • kernel 路由表
root@10_226_11_27:/work/code# ip route show
default via 10.226.8.1 dev eth0
# 宿主 eth0接口 的直连路由
10.226.8.0/22 dev eth0  proto kernel  scope link  src 10.226.11.27
# 从bird 学习来的路由
192.168.221.0/24 via 10.226.11.21 dev eth0  proto bird
192.168.222.0/24 via 10.226.11.22 dev eth0  proto bird
# 宿主 veth2接口 直接的路由(模拟的容器网段)
192.168.227.0/24 dev veth2  proto kernel  scope link  src 192.168.227.101

网络测试验证

  • 从容器192.168.227.101 ping 容器192.168.222.101
root@10_226_11_27:/work/code# ip netns exec netns1 ping 192.168.222.101 -c 2
PING 192.168.222.101 (192.168.222.101) 56(84) bytes of data.
64 bytes from 192.168.222.101: icmp_seq=1 ttl=63 time=0.925 ms
64 bytes from 192.168.222.101: icmp_seq=2 ttl=63 time=0.252 ms

--- 192.168.222.101 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.252/0.588/0.925/0.337 ms
  • 从容器192.168.227.101 ping 容器192.168.221.101
root@10_226_11_27:/work/code# ip netns exec netns1 ping 192.168.221.101 -c 2
PING 192.168.221.101 (192.168.221.101) 56(84) bytes of data.
64 bytes from 192.168.221.101: icmp_seq=1 ttl=63 time=0.221 ms
64 bytes from 192.168.221.101: icmp_seq=2 ttl=63 time=0.251 ms

--- 192.168.221.101 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1011ms
rtt min/avg/max/mdev = 0.221/0.236/0.251/0.015 ms
  • 宿主10.226.11.27 ping 192.168.221.101
root@10_226_11_27:/work/code# ping 192.168.221.101 -c 2
PING 192.168.221.101 (192.168.221.101) 56(84) bytes of data.
64 bytes from 192.168.221.101: icmp_seq=1 ttl=64 time=0.886 ms
64 bytes from 192.168.221.101: icmp_seq=2 ttl=64 time=0.268 ms

--- 192.168.221.101 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1015ms
rtt min/avg/max/mdev = 0.268/0.577/0.886/0.309 ms

root@10_226_11_27:/work/code# traceroute -d 192.168.221.101
traceroute to 192.168.221.101 (192.168.221.101), 30 hops max, 60 byte packets
 1  192.168.221.101 (192.168.221.101)  0.261 ms  0.231 ms  0.225 ms
  • 容器192.168.227.102的路由
root@10_226_11_27:/work/code# ip netns exec netns1 ip route
default via 192.168.227.101 dev veth1
192.168.227.0/24 dev veth1  proto kernel  scope link  src 192.168.227.102

root@10_226_11_27:/work/code# ip netns exec netns1 ip route get 192.168.221.101
192.168.221.101 via 192.168.227.101 dev veth1  src 192.168.227.102
    cache

实验结论

  • 实现了三台宿主的bird的bgp full mesh 模式
  • 三台宿主通过bgp相互完成了路由学习
  • 通过实验我们对calico中的bird程序有了更深入的认知

参考文档

bird官网

BGP_example_1

Intro-to-BGP-with-BIRD

bird-bgp-kickstart

https://wiki.skywolf.cloud/quickstart/player.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个人行政复议在线预约系统开发+ssm论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1 JAVA技术 Java主要采用CORBA技术和安全模型,可以在互联网应用的数据保护。它还提供了对EJB(Enterprise JavaBeans)的全面支持,java servlet API,JSP(java server pages…

Pygame中Sprite实现逃亡游戏2

在《Pygame中Sprite实现逃亡游戏1》中实现了奔跑的玩家,接下来实现显示追赶玩家的飞龙以及对面过来的飞火。 1 显示飞龙 显示飞龙的代码如图1所示。 图1 显示飞龙的代码 其中,第93行代码创建了精灵类MySprite的实例dragon;第94行代码导入飞…

《十年国庆游,洞察中国旅游新趋势》

作者:侯炯 一、十年国庆旅游数据总览 过去十年,中国国庆旅游市场呈现出丰富的变化和强劲的发展态势。从接待游客人次来看,2014 年接待国内游客 4.75 亿人次,到 2019 年已增长至 7.82 亿人次,2023 年国内旅游出游人数更…

如何使用ssm实现新媒体视域下的中国古诗词展演+vue

TOC ssm678新媒体视域下的中国古诗词展演vue 绪论 课题背景 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提…

SpringBoot文档管理系统:架构与功能

第2章相关技术 2.1 Java技术介绍 Java语言擅长开发互联网类应用和企业级应用,现在已经相当的成熟,而且也是目前使用最多的编程语言之一。Java语言具有很好的面向对象性,可以符合人的思维模式进行设计,封装是将对象的属性和方法尽可…

FileLink:企业级跨网文件交换解决方案,效率与安全并存

在数字化转型的时代,企业面临着日益增长的文件交换需求。尤其是在跨网环境中,如何高效、安全地共享文件,成为企业运营的关键。FileLink 正是针对这一需求而生,为企业提供了一个高效、安全的文件交换解决方案。 一、FileLink的核心…

基本定时器的预分频器和技术周期的计算

从表中可见APB1和APB2他们的总线频率和时钟频率则是不一样的 APB1的总线频率是42MHZ 定时器的时钟频率则为84MHZ APB2的总线频率则为84MHZ 定时器则为168MHZ 如我们要使用某个寄存器则我们需要了解他们的定时器的频率则为多少 了解后则进行计算所需要的时间 列如:配置定时…

【CSS in Depth 2 精译_032】5.4 Grid 网格布局的显式网格与隐式网格(上)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

揭秘隐世秘学与千门八将的智慧,为什么说是你人生必学?

引言 在浩瀚的人类文化长河中,隐藏着无数神秘的隐世秘学,它们或源于古老的传说,或深植于民间的智慧之中。这些秘学不仅承载着人类对未知世界的探索与想象,更蕴含着丰富的哲理与策略。其中,“千门八将”以其独特的智慧体…

ITU标准引领车内通讯新纪元

在现代汽车科技更迭的今天,车内通讯与免提通话系统的性能与稳定性成为了消费者购车时不可忽视的重要因素。随着国际电信联盟(ITU)一系列标准的推出,车内通讯体验正迈向新的高度。本文将深入探讨ITU-T P.1100、P.1110、P.1120、P.1…

3D建模:Agisoft Metashape Professional 详细安装教程分享 Mac/win

Agisoft Metashape中文版(以前称为 PhotoScan)是一款独立软件产品,可对数字图像进行摄影测量处理并生成 3D 空间数据,用于 GIS 应用程序、文化遗产文献和视觉效果制作以及各种比例的物体的间接测量。 明智地实施数字摄影测量技术…

Qt/C++ 多线程同步机制详解及应用

在多线程编程中,线程之间共享资源可能会导致数据竞争和不一致的问题。因此,采用同步机制确保线程安全至关重要。在Qt/C中,常见的同步机制有:互斥锁(QMutex、std::mutex)、信号量(QSemaphore&…

数据结构--单链表创建、增删改查功能以及与结构体合用

一、作业要求 单链表操作,要求节点是结构体类型,实现以下功能: 1.尾插学生 2.任意位置插入学生 3.任意位置删除学生 4.逆置单链表 5.学生按学号排序 6.销毁单链表 二、实现过程 1.代码如下: (1)头…

scanning folder for git repositories 当前没有源代码管理提供程序进行注册

这个问题困扰了我好几天。尝试了各种方法,虽然有了解决方法 。但是感觉根本原因还是没找到。解决方案是更改git的 openRepositoryInParentFolders 为always 。我之所以觉着没找到根本原因是因为 我远程另一个主机仍然使用prompt 确是正常的。 解决方案原文 https://…

数据防泄密系统有哪些|盘点2024年8款好用的防泄密系统!

“安全重于泰山,数据泄露如蚁穴溃堤。 ”在信息化高速发展的今天,数据已成为企业的核心资产,其安全性直接关系到企业的生存与发展。 因此,构建一套高效、全面的数据防泄密系统显得尤为重要。 本文将为您盘点2024年几款好用的数据…

FastDFS的docker部署及实现头像上传

FastDFS的使用并实现头像上传 一、FastDFS概述二、安装FastDFS1. 拉取镜像2. 安装tracker3. 安装storage4. NGINX服务启动三、配置和依赖配置依赖四、头像上传一、FastDFS概述 概述 上传交互过程 两个服务:Tracker Server 和Storage Server Tracker Server 跟踪服务,负责调…

②大缓存ModbusRTU485数据集中采集器寄存器线圈重映射从站并发采集Modbus 串口RS485 转 RS485

大缓存ModbusRTU485数据集中采集器寄存器线圈重映射从站并发采集https://item.taobao.com/item.htm?ftt&id811821574300 关于产品的布线图和配置说明 以一分4路(MS-A1-C041)为例 布线图 RS485 在点到多点通信时,为了防止信号的反射和干…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算(化为基本型)1.5.1 主对角线行列式:主…

MMD模型及动作一键完美导入UE5-IVP5U插件方案(二)

1、下载并启用IVP5U插件 1、下载IVP5U插件, IVP5U,点击Latest下载对应引擎版本,将插件放到Plugins目录,同时将.uplugin文件的EnableByDefault改为false 2、然后通过Edit->Plugins启用插件 2、导入pmx模型 1、直接在Content的某个目录拖入pmx模型,选择默认参数 2、…

13年408计算机考研-计算机网络

第一题: 解析:OSI体系结构 OSI参考模型,由下至上依次是:物理层-数据链路层-网络层-运输层-会话层-表示层-应用层。 A.对话管理显然属于会话层, B.数据格式转换,是表示层要解决的问题,很显然答案…