单网口ubuntu主机配置virt-manager传统桥接bridge网络

news2024/11/22 21:08:18

单网口ubuntu主机配置virt-manager传统桥接bridge网络

虚拟机的网络桥接bridge模式往往需要物理宿主机有两个网口,一个网口1连接外网配置ip,另一个网口2空闲不配置ip,在virt-manager里配置虚拟机的网卡绑定网口2,从而实现虚拟机桥接网络模式。

由于办公环境只有一台单网口的主机,通过手动配置arp与路由的方式可实现下方的网络拓扑关系。如果单网口主机有相同配置虚拟机传统桥接网络需求的话,可以参考本文。

先贴下网络拓扑图:
在这里插入图片描述
主机A、B、C处于同一个内网172.30.120.0/24里,其中虚拟机C的宿主物理机是B。
按本文操作最终可实现A<->B、A<->C、B<->C互通。

  1. 宿主物理机B为ubuntu14.04系统,只有一个物理网口,网口信息如下:
krokodil@krokodil-SY-ZL-H110N-D3V:~$ ifconfig
... ...
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.30.120.125  netmask 255.255.255.0  broadcast 172.30.120.255
        inet6 fe80::10f4:3d60:14c5:c457  prefixlen 64  scopeid 0x20<link>
        ether 00:e0:4c:5a:03:01  txqueuelen 1000  (以太网)
        RX packets 45804  bytes 15342946 (15.3 MB)
        RX errors 0  dropped 5188  overruns 0  frame 0
        TX packets 20896  bytes 3041221 (3.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
... ...
krokodil@krokodil-SY-ZL-H110N-D3V:~$ nm-connection-editor
  1. 在物理机B上通过nm-connection-editor创建桥接网络
  • 终端输入:nm-connection-editor
    在这里插入图片描述
  • 新建一项,类型选择网桥
    在这里插入图片描述
  • 添加设备
    在这里插入图片描述
  • 选择以太网
    在这里插入图片描述
  • 选中enp1s0物理网卡
    在这里插入图片描述
  • 配网络ip等信息
    在这里插入图片描述
  1. 物理机B上,关闭nm-connection-editor后,再重新打开可见多了“bridge0 port1”和“网桥连接1”。ifconfig发现多了bridge0网口:
    在这里插入图片描述
krokodil@krokodil-SY-ZL-H110N-D3V:~$ ifconfig
bridge0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.30.120.127  netmask 255.255.255.0  broadcast 172.30.120.255
        ether de:91:be:83:e7:72  txqueuelen 1000  (以太网)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.30.120.125  netmask 255.255.255.0  broadcast 172.30.120.255
        inet6 fe80::10f4:3d60:14c5:c457  prefixlen 64  scopeid 0x20<link>
        ether 00:e0:4c:5a:03:01  txqueuelen 1000  (以太网)
        RX packets 8250  bytes 7874949 (7.8 MB)
        RX errors 0  dropped 84  overruns 0  frame 0
        TX packets 6888  bytes 1845403 (1.8 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
... ...
krokodil@krokodil-SY-ZL-H110N-D3V:~$ 
  1. 物理机B上通过virt-manager创建新虚拟机,步骤略过,网络配置如下,配置成桥接模式,设备绑定到bridge0上:
    在这里插入图片描述
  2. 虚拟机C安装成功后,把虚拟机内网卡配置好ip:
    在这里插入图片描述
  3. 首先需要确保虚拟机C网口与物理机B的bridge0和enp1s0这两个网口互通,当前状态虚拟机C向物理机B ping包不通:
    在这里插入图片描述
  • 由于桥接原理,可知任意从虚拟机C eth0发出的包必会在物理机B bridge0网口抓到。配置好后,在虚拟机C内部ping物理机B网桥bridge0,同时对物理机B的bridge0与enp1s0抓包。
    在这里插入图片描述
    在这里插入图片描述
  • 发现虚拟机C的icmp request发到了物理机B bridge0上,但由于物理机B不知道虚拟机C网口ip172.30.120.120的mac地址,所以reply包无法发出。
  • 查询物理机B当前的arp规则,发现缺失网口enp1s0的ip为172.30.120.120的规则:
krokodil@krokodil-SY-ZL-H110N-D3V:~$ arp -n
地址                     类型    硬件地址            标志  Mask            接口
172.30.120.254                   (incomplete)                              bridge0
172.30.120.120                   (incomplete)                              enp1s0
172.30.120.120           ether   52:54:00:32:94:c2   C                     bridge0
172.30.120.254           ether   04:fe:8d:8e:31:e1   C                     enp1s0
krokodil@krokodil-SY-ZL-H110N-D3V:~$
  • 在物理机B配置一条arp规则,将虚拟机C内eth0的mac地址52:54:00:32:94:c2与ip172.30.120.120关联起来
krokodil@krokodil-SY-ZL-H110N-D3V:~$ sudo arp -s 172.30.120.120 52:54:00:32:94:c2 -i enp1s0
krokodil@krokodil-SY-ZL-H110N-D3V:~$ arp -n
地址                     类型    硬件地址            标志  Mask            接口
172.30.120.254                   (incomplete)                              bridge0
172.30.120.120           ether   52:54:00:32:94:c2   CM                    enp1s0
172.30.120.120           ether   52:54:00:32:94:c2   C                     bridge0
172.30.120.254           ether   04:fe:8d:8e:31:e1   C                     enp1s0
krokodil@krokodil-SY-ZL-H110N-D3V:~$ 
  • 再重复在虚拟机C内向ping 172.30.120.127 -c 1,同时在物理机B抓包,发现虚拟机C仍然ping不通物理机B
    在这里插入图片描述
    在这里插入图片描述
  • 这次抓包没有抓到arp,发现物理机B上reply包并没有从enp1s0转发到bridge0网口。
  • 查看物理机B路由:
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
0.0.0.0         172.30.120.254  0.0.0.0         UG    100    0        0 enp1s0
0.0.0.0         172.30.120.254  0.0.0.0         UG    20425  0        0 bridge0
10.10.100.0     0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 virbr0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.30.120.0    0.0.0.0         255.255.255.0   U     100    0        0 enp1s0
172.30.120.0    0.0.0.0         255.255.255.0   U     425    0        0 bridge0
  • 关于172.30.120.0/24网段的包在物理机B上有两条路由,但因为100跳数小于425,所以默认向172.30.120.0/24网段的包向enp1s0转发。这就是为什么上面的reply包没有被转发到bridge0网口。
  • 在物理机B添加一条关于172.30.120.120的路由规则,告知收到目的ip为172.30.120.120的包就直接转发给bridge0网口:
krokodil@krokodil-SY-ZL-H110N-D3V:~$ sudo route add 172.30.120.120 dev bridge0
krokodil@krokodil-SY-ZL-H110N-D3V:~$ route -n
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
0.0.0.0         172.30.120.254  0.0.0.0         UG    100    0        0 enp1s0
0.0.0.0         172.30.120.254  0.0.0.0         UG    20425  0        0 bridge0
10.10.100.0     0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 virbr0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.30.120.0    0.0.0.0         255.255.255.0   U     100    0        0 enp1s0
172.30.120.0    0.0.0.0         255.255.255.0   U     425    0        0 bridge0
172.30.120.120  0.0.0.0         255.255.255.255 UH    0      0        0 bridge0
krokodil@krokodil-SY-ZL-H110N-D3V:~$ 
  • 此时,虚拟机C内网口eth0可以和物理机B的bridge0网口、物理网口enp1s0互通。
  • 虚拟机C内ping包结果:
    在这里插入图片描述
  • 物理机B内ping包结果:
    在这里插入图片描述
  1. 宿主机B与虚拟机C互通后,可以进一步配置同网段内(172.30.120.0/24)机器A与虚拟机C互通。此台机器A的ip为172.30.120.121,已验证可ping通物理机B的两个网口ip 172.30.120.125和172.30.120.127。
  • 物理机A网口信息:
enaftgm1i0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.30.120.121  netmask 255.255.255.0  broadcast 172.30.120.255
        inet6 fe80::54fe:45f6:974e:8db3  prefixlen 64  scopeid 0x20<link>
        ether 00:07:3e:9d:55:8f  txqueuelen 1000  (以太网)
        RX packets 137322  bytes 43916437 (43.9 MB)
        RX errors 0  dropped 4476  overruns 0  frame 0
        TX packets 188258  bytes 22199429 (22.1 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 7  base 0xc000
root@sujing-GW-001N1B-FTF:~#
  • 在当前状态下,在同网段机器A(172.30.120.121)上ping 172.30.120.120 -c 1,发包不通:
PING 172.30.120.120 (172.30.120.120) 56(84) bytes of data.
From 172.30.120.121 icmp_seq=1 Destination Host Unreachable

--- 172.30.120.120 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
  • 在物理机A网口抓包,发现172.30.120.121不知道172.30.120.120的mac地址
tcpdump: listening on enaftgm1i0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:09:54.554190 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.30.120.120 tell 172.30.120.121, length 28
15:09:55.580834 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.30.120.120 tell 172.30.120.121, length 28
15:09:56.600821 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.30.120.120 tell 172.30.120.121, length 28
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel
root@sujing-GW-001N1B-FTF:~#
  • 查询物理机A(172.30.120.121)的arp表,看到这一条:
地址                     类型    硬件地址            标志  Mask            接口
172.30.120.254           ether   04:fe:8d:8e:31:e1   C                     enaftgm1i0
172.30.120.120                   (incomplete)                              enaftgm1i0
... ...
  • 在物理机A(172.30.120.121)上增加arp规则:注意!这里的mac地址要填写enp1s0的mac地址00:e0:4c:5a:03:01
root@sujing-GW-001N1B-FTF:~# sudo arp -s 172.30.120.120 00:e0:4c:5a:03:01 -i enaftgm1i0
root@sujing-GW-001N1B-FTF:~# arp -n
地址                     类型    硬件地址            标志  Mask            接口
172.30.120.254           ether   04:fe:8d:8e:31:e1   C                     enaftgm1i0
172.30.120.120           ether   00:e0:4c:5a:03:01   CM                    enaftgm1i0
... ... ... ...
  • 然后在物理机A上重新ping 172.30.120.120,同时对物理机B的两个网口抓包
    在这里插入图片描述
    在这里插入图片描述

  • 这次icmp request成功到达了物理机B的enp1s0网口,但是在bridge0网口看到虚拟机C 172.30.120.120发出的arp查询包。

  • 确认虚拟机C内arp表,确实缺少121的mac地址:
    在这里插入图片描述

  • 在虚拟机C内部配置arp规则172.30.120.121 de:91:be:83:e7:72 (注意!!这里要配置bridge0 mac地址)

在这里插入图片描述

  • 此时再在物理机A 172.30.120.121上ping包,就可通了。
root@sujing-GW-001N1B-FTF:~# ping 172.30.120.120 -c 1
PING 172.30.120.120 (172.30.120.120) 56(84) bytes of data.
64 bytes from 172.30.120.120: icmp_seq=1 ttl=63 time=0.731 ms

--- 172.30.120.120 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.731/0.731/0.731/0.000 ms
root@sujing-GW-001N1B-FTF:~#
  1. 至此,总结下:
    172.30.120.121物理机A需要添加一条arp规则:172.30.120.120 enp1s0的mac地址
    172.30.120.125与172.30.120.127物理机B需要添加一条路由规则:172.30.120.120 dev bridge0,以及一条arp规则172.30.120.120 eth0的mac地址
    172.30.120.120虚拟机C需要添加一条arp规则:172.30.120.121 bridge0的mac地址

从物理机A 网口向 虚拟机C ping一个包,抓包看整个过程:

  • 物理机A 172.30.120.121 enaftgm1i0(00:07:3e:9d:55:8f)向ip 172.30.120.120发request包,根据物理机A上的arp规则,向172.30.120.120发包的目的mac应配为00:e0:4c:5a:03:01(00:e0:4c:5a:03:01为物理机B 172.30.120.125 enp1s0的mac地址)。所以最终在网口enaftgm1i0抓到的request包,源mac地址是enaftgm1i0,目的mac地址是enp1s0。在通过内网的交换机与路由器时,此request包会被转发到00:e0:4c:5a:03:01所在的网口,即enp1s0网口。
root@sujing-GW-001N1B-FTF:~# tcpdump -i enaftgm1i0 -venn host 172.30.120.120
tcpdump: listening on enaftgm1i0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:14:10.131325 00:07:3e:9d:55:8f > 00:e0:4c:5a:03:01, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 51167, offset 0, flags [DF], proto ICMP (1), length 84)
    172.30.120.121 > 172.30.120.120: ICMP echo request, id 6552, seq 1, length 64
16:14:10.131851 00:e0:4c:5a:03:01 > 00:07:3e:9d:55:8f, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 63, id 54622, offset 0, flags [none], proto ICMP (1), length 84)
    172.30.120.120 > 172.30.120.121: ICMP echo reply, id 6552, seq 1, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel
root@sujing-GW-001N1B-FTF:~#
  • 物理机B enp1s0(00:e0:4c:5a:03:01)抓包可看到request包(源mac地址是enaftgm1i0,目的mac地址是enp1s0)已到达物理机B。根据物理机B的路由规则,172.30.120.120的包应转发给bridge0网口:
tcpdump: listening on enp1s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
16:14:10.163279 00:07:3e:9d:55:8f > 00:e0:4c:5a:03:01, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 51167, offset 0, flags [DF], proto ICMP (1), length 84)
    172.30.120.121 > 172.30.120.120: ICMP echo request, id 6552, seq 1, length 64
16:14:10.163690 00:e0:4c:5a:03:01 > 00:07:3e:9d:55:8f, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 63, id 54622, offset 0, flags [none], proto ICMP (1), length 84)
    172.30.120.120 > 172.30.120.121: ICMP echo reply, id 6552, seq 1, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel
root@krokodil-SY-ZL-H110N-D3V:~# 
  • bridge0(de:91:be:83:e7:72)抓包看到,获取到了request包(在enp1s0转发时,源mac地址替换成了bridge0,目的mac地址被替换成了eth0)。
tcpdump: listening on bridge0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
16:14:10.163315 de:91:be:83:e7:72 > 52:54:00:32:94:c2, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 63, id 51167, offset 0, flags [DF], proto ICMP (1), length 84)
    172.30.120.121 > 172.30.120.120: ICMP echo request, id 6552, seq 1, length 64
16:14:10.163677 52:54:00:32:94:c2 > de:91:be:83:e7:72, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 54622, offset 0, flags [none], proto ICMP (1), length 84)
    172.30.120.120 > 172.30.120.121: ICMP echo reply, id 6552, seq 1, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel
root@krokodil-SY-ZL-H110N-D3V:~# 
  • 172.30.120.120虚拟机C网口eth0抓包,抓到request和reply(源和目的mac分别是bridge0和eth0):
    在这里插入图片描述
  • reply包发送和路由原理相同,略,看抓包即可明白。

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

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

相关文章

81.门控循环单元(GRU)以及代码实现

1. 关注一个序列 做RNN的时候&#xff0c;处理不了太长的序列&#xff0c;因为把整个序列信息全部放在隐藏状态中&#xff0c;所有东西都放进去&#xff0c;当时间步很长的话&#xff0c;隐藏状态就会累积太多东西&#xff0c;就可能对很前面的信息不那么容易抽取出来了。 所…

Aftermath:一款针对macOS的免费开源事件响应框架

关于Aftermath Aftermath是一款针对macOS的事件响应框架&#xff0c;该工具基于Swift语言开发&#xff0c;是一款完全免费且开源的网络安全事件响应框架。 在Aftermath的帮助下&#xff0c;广大研究人员可以轻松收集并分析受感染主机的数据。除此之外&#xff0c;在理想情况下…

“深度学习”学习日记。误差反向传播法--Affine/Softmax层的实现

2023.1.17 Affine层&#xff1a; 在神经网络的正向传播中&#xff0c;为了计算加权信号的总和&#xff0c;使用矩阵乘积运算。 比如&#xff1a; import numpy as npx np.arange(6).reshape(2, 3) # (2,3) w np.arange(6).reshape(3, 2) # (3,2) b np.arange(4).resha…

LeetCode083_83. 删除排序链表中的重复元素

LeetCode083_83. 删除排序链表中的重复元素 一、描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1…

虚拟机或Linux安装Nginx及本地指定虚拟机域名

安装必要工具和依赖 yum -y install wget gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -----------------------------------废话开始------------------------------------------------- 上面这句话的意思:以下当废话 yum ---在线安装命令 inst…

82.长短期记忆网络(LSTM)以及代码实现

1. 长短期记忆网络 忘记门&#xff1a;将值朝0减少输入门&#xff1a;决定不是忽略掉输入数据输出门&#xff1a;决定是不是使用隐状态 2. 门 3. 候选记忆单元 4. 记忆单元 5. 隐状态 6. 总结 7. 从零实现的代码 我们首先加载时光机器数据集。 import torch from torch imp…

基于python手撕实现BP 神经网络实现手写数字识别(不调库,附完整版本代码)

本项目使用python实现全连接网络和梯度优化 方向传播并且实现了 手写数字识别项目: 神经网络 model 先介绍个三层的神经网络,如下图所示输入层(input layer)有三个 units( 为补上的 bias,通常设为 1)

安卓影像飞升时刻:vivo X90 Pro+打通HDR任督二脉

在手机产业中&#xff0c;大多数人会有一种刻板印象&#xff1a;一项新技术/功能&#xff0c;苹果发布会上展示意味着已经成熟&#xff0c;具有很高的产品完成度&#xff0c;好用且有效&#xff1b;而安卓厂商在发布会上展示出的一些炫酷技术&#xff0c;往往还需要时间观望&am…

多目标建模算法PLE

1. 概述 在现如今的推荐系统或者搜索中&#xff0c;都存在多个目标&#xff0c;多目标的算法在现如今的系统中已然成为了标配。在多目标的建模过程中&#xff0c;如果不同的学习任务之间较为相关时&#xff0c;多个任务之间可以共享一部分的信息&#xff0c;这样最终能够提升整…

Vue7-el和data的两种写法

1.el的两种写法 1创建Vue实例的时候通过el指定属性 2. 创建Vue实例之后&#xff0c;通过vm.$mount(#demo)进行挂载 console.log(v):此处的v是Vue的实例对象 在往下看__proto__属性&#xff0c;这里是Vue构造类的方法&#xff0c;其中的方法vue实例都可以使用&#xff0c;比如$…

Spring cache整合Redis详解 动态设置失效时间

文章目录1.spring cache简介2.spring cache集成redis3.spring cache与redisTemple统一格式4.SpEL标签5.Cacheable注解实现6.CachePut注解实现7.CacheEvict注解实现8.Caching注解实现9.自定义key生成器KeyGenerator10.自定义前缀CacheKeyPrefix11.多个CacheManager实现不同失效时…

【微信小程序】收藏功能的实现(条件渲染、交互反馈)

&#x1f3c6;今日学习目标&#xff1a;第十九期——收藏功能的实现(条件渲染、交互反馈) &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;35分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目录…

django框架

目录简介MVC与MTV模型MVCMTV创建项目目录生命周期静态文件配置&#xff08;无用&#xff09;启动django[启动](https://www.cnblogs.com/xiaoyuanqujing/articles/11902303.html)路由分组无名分组有名分组路由分发反向解析反向解析结合分组名称空间re_path与path自定义转换器视…

vue3项目怎么写路由 + 浅析vue-router4源码

在SPA项目里&#xff0c;路由router基本是前端侧处理的&#xff0c;那么vue3项目中一般会怎么去写router呢&#xff0c;本文就来讲讲vue-router4的一些常用写法&#xff0c;以及和Composition API的结合使用&#xff0c;同时简单讲讲实现原理&#xff0c;让你轻松理解前端route…

【04】FreeRTOS的任务挂起与恢复

目录 1.任务的挂起与恢复的API函数 1.1任务挂起函数介绍 1.2任务恢复函数介绍&#xff08;任务中恢复&#xff09; 1.3任务恢复函数介绍&#xff08;中断中恢复&#xff09; 2.任务挂起与恢复实验 3.任务挂起和恢复API函数“内部实现”解析 3.1vTaskSuspend() 3.2&#…

Prometheus基础

一、何为Prometheus Prometheus受启发于Google的Brogmon监控系统&#xff08;相似的Kubernetes是从Google的Brog系统演变而来&#xff09;&#xff0c;从2012年开始由前Google工程师在Soundcloud以开源软件的形式进行研发&#xff0c;并且于2015年早期对外发布早期版本。2016年…

【基础】Netty 的基础概念及使用

Netty基本概念理解阻塞与非阻塞同步与异步BIO 与 NIOReactor 模型Netty 基本概念Netty 的执行流程Netty 的模块组件Netty 工作原理Netty 的基本使用Netty ServerNetty Client参考文章基本概念理解 阻塞与非阻塞 阻塞与非阻塞是进程访问数据时的处理方式&#xff0c;根据数据是…

系分 - 案例分析 - 系统维护与设计模式

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录系分 - 案例分析 - 系统维护与设计模式典型例题 1题目描述参考答案典型例题 2题目描述参考答案系分 - 案例分析 - 系统维护与设计模式 典型例题 1 题目描述 某企业两年前自主研发的消防集中控制软件系统…

05-requests添加Cookies与正则表达式

第5讲 requests添加Cookies与正则表达式 整体课程知识点查看 &#xff1a;https://blog.csdn.net/j1451284189/article/details/128713764 本讲总结 request代理使用 request SSL request添加Cookies 数据解析方法简介 数据解析&#xff1a;正则表达式讲解 一、requests 代理 …

【23种设计模式】学习汇总(未完结+思维导图)

获取思维导图翻至底部底部&#xff0c;基本概览博客内容&#xff08;暂未完全完善&#xff0c;期待你的持续关注&#xff09; 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一.相关内容 在软件工程中&#xf…