零入门kubernetes网络实战-13->同一宿主机上的两个网络命名空间通信方案

news2024/9/21 2:39:27

《零入门kubernetes网络实战》视频专栏地址
https://www.ixigua.com/7193641905282875942

本篇文章视频地址(稍后上传)


本篇文章主要是想模拟一下,在同一个宿主机上,多个网络命名空间之间如何通信?

有哪些可以采取的方案。

可能存在的方案:

  • 方案一:使用一对veth pair将两个命名空间直接连接起来,两个命名空间处于同网段内
  • 方案二:为两个命名空间分别设置自己的veth pair
    • 场景一:两个命名空间处于同网段时的链接情况
    • 场景二:两个命名空间处于非同网段时的链接情况
  • 方案三:使用虚拟网桥将两个不同的命名空间链接起来

  • 方案一:使用价值并不是很大。
  • 方案二:具有一定的参考价值,为以后学期其他网络模式奠定基础
  • 方案三:使用价值最高。可以同时连接多个命名空间,使其通信。

1、方案一:使用一对veth pair将两个命名空间直接连接起来,两个命名空间处于同网段内

在这里插入图片描述

模拟测试将veth pair的两端分别加入两个不同的网络命名空间,测试一下连通性

ip link add veth1 type veth peer name veth2

ip netns add ns1
ip netns add ns2

ip link set veth1 netns ns1
ip link set veth2 netns ns2

ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1
ip netns exec ns2 ip addr add 10.244.1.3/24 dev veth2

ip netns exec ns1 ip link set veth1 up
ip netns exec ns2 ip link set veth2 up
ip netns exec ns1 ping -c 1 10.244.1.3
ip netns exec ns2 ping -c 1 10.244.1.2

在这里插入图片描述

在这里插入图片描述

在同一个宿主机下,veth pair链接的两个网络命名空间可以通过veth pair进行互相通信

2、方案二:为两个命名空间分别设置自己的veth pair

2.1、场景一:两个命名空间处于同网段时的链接情况

在这里插入图片描述

2.1.1、操作实战

ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2b

ip netns add ns1
ip netns add ns2

ip link set veth1a netns ns1
ip link set veth2a netns ns2

ip addr add 10.244.1.3 dev veth1b
ip addr add 10.244.1.4 dev veth2b
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns2 ip addr add 10.244.1.5/24 dev veth2a

ip link set veth1b up
ip link set veth2b up
ip netns exec ns1 ip link set veth1a up
ip netns exec ns2 ip link set veth2a up

2.1.2、测试

在执行下面的测试命令前,最好先把抓包分析的命令执行一下,

因为肯定是ping不通的。先执行抓包命令,可以观察到最初始的发包状态。

ip netns exec ns1 ping 10.244.1.5

在这里插入图片描述

2.1.3、抓包分析

分别对veth1a,veth1b, veth2a, veth2b进行抓包分析

2.1.3.1、在master节点上,进入ns1网络命名空间对veth1a

ip netns exec ns1 tcpdump -nn -i veth1a

在这里插入图片描述

2.1.3.2、在master节点上,进入ns2网络命名空间对veth2a进行抓包

ip netns exec ns2 tcpdump -nn -i veth2a

在这里插入图片描述

2.1.4、在master节点上,对veth1b抓包

tcpdump -nn -i veth1b

在这里插入图片描述

2.1.5、在master节点上,对veth2b抓包

tcpdump -nn -i veth2b

在这里插入图片描述

从抓包情况来看,至少存在一个问题

从veth1a可以正常发送ARP数据包,并且将ARP数据包直接转发到了veth1b网卡里,

veth1b网卡也发送了同样的数据包,但是,数据包从veth1b出来后,没有对应的路由;

再查看一下,当前的路由表
在这里插入图片描述

2.1.6、设置目的路由

给去往10.244.1.2,10.244.1.5的数据包添加相关路由

ip route add 10.244.1.2 dev veth1b
ip route add 10.244.1.5 dev veth2b
route -n

在这里插入图片描述

添加完路由后,抓包情况没有发生变化,不再重复截图了。

这个时候,需要关注一下内核参数proxy_arp了。

2.1.7、为什么需要设置proxy_arp参数了?

下面纯属于个人理解:

如果你了解ARP的原理,就会发现:

当veth1a发起的ARP请求到达veth1b后,veth1b网卡进行解析ARP请求,发现目的IP并非自己。

因此,我不需要回复此APR请求。

所以,程序就卡在这里了,veth1a不停的发送,Veth1b不停的丢弃。

因此,如果打破僵局的话,需要veth1b进行回复一下,代理别人回复一下。

就需要用到了proxy_arp参数了。

2.1.8、为veth1b设置一下proxy_arp参数

2.1.8.1、proxy_arp什么意思呢?

是否开启arp代理,开启arp代理的话则会以自己的mac地址回复arp请求,0为不开启,1则开启。

可以参考一下,下面的网址
https://imliuda.com/post/1015

2.1.8.2、为veth1b网卡设置proxy_arp参数

在宿主机上,执行下面的命令

echo 1 > /proc/sys/net/ipv4/conf/veth1b/proxy_arp

执行完,继续观察一下各网卡的发送情况

veth1a的抓包变化
在这里插入图片描述

veth1b对veth1a的ARP请求,进行了回复。也就是替10.244.1.5进行了回复,

这种行为,称为代理回复。

veth1b的抓包变化
在这里插入图片描述

veth1a收到ARP的回复后,就立刻发起了icmp请求,并且将数据包转发给了veht1b.

veth2b
在这里插入图片描述

veth1b发起的数据包,经过路由判断,将数据包发送给了veth2b

2.1.9、为veth2b设置proxy_arp参数

echo 1 > /proc/sys/net/ipv4/conf/veth2b/proxy_arp

在这里插入图片描述

2.1.10、重新测试

ip netns exec ns1 ping 10.244.1.5

在这里插入图片描述

2.1.11、下面提供一下,完整的创建命令

ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2b

ip netns add ns1
ip netns add ns2

ip link set veth1a netns ns1
ip link set veth2a netns ns2

ip addr add 10.244.1.3 dev veth1b
ip addr add 10.244.1.4 dev veth2b
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns2 ip addr add 10.244.1.5/24 dev veth2a

ip link set veth1b up
ip link set veth2b up
ip netns exec ns1 ip link set veth1a up
ip netns exec ns2 ip link set veth2a up

ip route add 10.244.1.2 dev veth1b
ip route add 10.244.1.5 dev veth2b

echo 1 > /proc/sys/net/ipv4/conf/veth1b/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/veth2b/proxy_arp

echo 1 > /proc/sys/net/ipv4/ip_forward

测试命令

ip netns exec ns1 ping 10.244.1.5

还可以进行日志追踪设置

iptables -t raw -A PREROUTING -p icmp -j TRACE

iptables -t raw -A OUTPUT -p icmp -j TRACE

查看日志

tail -f /var/log/messages

关于/proc/sys/net/ipv4/ip_forward

在这里插入图片描述

你可以做一些测试,在上面测试正常的情况下,将ip_forward关闭,看看还能ping通不。

在稍微总结一下
直接看下面的图
在这里插入图片描述

个人理解:

是将ICMP数据包封装到IP报文里,然后,将IP报文封装到以太网帧里。

因此,veth2b其实,收到的应该是以太网帧。为了简单,图里说的是IP报文。

veth2b收到IP报文后,对IP报文头进行解析,获得源IP是10.244.1.2,目的IP是10.244.1.5

veth2b第一次向veth2a进行转发时,不知道Veth2a的MAC地址,

因此向veth2a发起了ARP请求。从上面对veth2b进行抓包分析里,可以看出来。

veth2a收到ARP请求后,会进行回复

veth2b收到veth2a的回复后,会将IP报文发送给veth2a,

veth2a收到IP报文后,会进行解析,获取ICMP数据包,并进行反馈。

但是,veth2a并不知道10.244.1.2的Mac地址,因此,它也需要发起ARP请求。

因此,接下来,就是回复过程了,跟前面介绍原理一样了。

协议的封装过程,会在后面的tap章节进行介绍。

其实,这个解释,可能经不起推敲的;因为在上面的测试用例中,当在ns1 ping宿主机上的eth0网卡时,

只添加了路由,并没有为veth1设置proxy_arp参数;

2.1.12、请求过程,数据包的报文内容

下面是master节点上的
在这里插入图片描述

上面是ns1网络命名空间,下面是ns2网络命名空间

下面的分析,仅供参考

  • 当veth1b网卡接收到veth1a发送的数据包后,对报文进行解析
  • 发现目的MAC是自己的,因此,需要接收此数据包,
  • 继续解析,发现目的IP是10.244.1.5
  • 查询路由,发现去往10.244.1.5,需要通过veth2b网卡发送
  • 交由veth2b网卡处理,veth2b网卡发现目的IP是10.244.1.5,需要发送ARP协议,获取10.244.1.5IP对应的MAC地址
  • 获取到MAC地址后,经由网络协议栈重新封装,构建新的以太网帧
  • 交由veth2b网卡发送出去。

(主要是网卡的具体功能,以及跟网络协议栈调用顺序,并不是非常了解。)

2.1.13、请求过程,都经历了哪些iptables规则链

为了验证测试,需要在master节点添加日志埋点;

此过程,需要使用到rsyslog服务

2.1.13.1、安装rsyslog服务

2.1.13.1.1、安装rsyslog服务
yum -y install rsyslog
2.1.13.1.2、更新配置文件
echo "kern.*     /var/log/iptables.log" >> /etc/rsyslog.conf 

在这里插入图片描述

.*,表示所有等级的消息都添加到iptables.log文件里

信息等级的指定方式

  • .XXX,表示 大于XXX级别的信息
  • .=XXX,表示等于XXX级别的信息
    • 如,kern.=notice /var/log/iptables.log, 将notice以上的信息添加到iptables.log里
  • .!XXX, 表示在XXX之外的等级信息
2.1.13.1.3、重启rsyslog服务
systemctl restart rsyslog

systemctl status  rsyslog

在这里插入图片描述

2.1.13.2、在master节点上,添加日志埋点

将当前的日志统计清零

iptables -t nat -Z
iptables -t filter -Z

插入日志埋点前,先查看一下,当前的现状

iptables -t nat -nvL PREROUTING --line-number
iptables -t filter -nvL FORWARD --line-number
iptables -t nat -nvL POSTROUTING --line-number

插入日志埋点

iptables -t nat -A PREROUTING -p icmp -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t filter -A FORWARD -p icmp -j LOG --log-prefix "Filter-FORWARD-1-"
iptables -t nat -A POSTROUTING -p icmp -j LOG --log-prefix "Nat-POSTROUTING-1-"

实时查看日志

tail -f /var/log/iptables.log

2.1.13.3、重新发起请求

ip netns exec ns1 ping 10.244.1.5

在这里插入图片描述

再次查看日志
在这里插入图片描述

看上面的图,一共发送了5次请求

再看一下,iptables.log日志,一共有12条记录。

  • 前4条记录,是第1次请求和反馈经过的规则链,请求经过了PREROUTING->FORWARD-POSTROUTING,反馈经过了FORWARD链
  • 第5,6条记录,是第2次请求和反馈经过的规则链,请求和反馈都只经过FORWARD链
  • 第7,8条记录,是第3次请求和反馈经过的规则链,请求和反馈都只经过FORWARD链
  • 第9,10条记录,是第4次请求和反馈经过的规则链,请求和反馈都只经过FORWARD链
  • 第11,12条记录,是第5次请求和反馈经过的规则链,请求和反馈都只经过FORWARD链

2.1.13.4、经历的iptables规则链

在这里插入图片描述

2.2、场景二:两个命名空间处于非同网段时的链接情况

2.2.1、网络拓扑

在这里插入图片描述

接下来,我们提供两种方式来实现上面的网络拓扑

2.2.2、操作实战一(arp代理应答方案)

ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2b

ip netns add ns1
ip netns add ns2

ip link set veth1a netns ns1
ip link set veth2a netns ns2

ip addr add 10.244.1.3 dev veth1b
ip addr add 10.244.2.2 dev veth2b
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns2 ip addr add 10.244.2.3/24 dev veth2a

ip link set veth1b up
ip link set veth2b up
ip netns exec ns1 ip link set veth1a up
ip netns exec ns2 ip link set veth2a up

ip route add 10.244.1.2 dev veth1b
ip route add 10.244.2.3 dev veth2b
ip netns exec ns1 route add -net 10.244.2.0/24 dev veth1a
ip netns exec ns2 route add -net 10.244.1.0/24 dev veth2a

echo 1 > /proc/sys/net/ipv4/conf/veth1b/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/veth2b/proxy_arp

echo 1 > /proc/sys/net/ipv4/ip_forward

该方式,完全跟同网段是一样的。

从ns1里ping ns2

ip netns exec ns1 ping 10.244.2.3

在这里插入图片描述

从ns2里ping ns1也是可以的

ip netns exec ns2 ping 10.244.1.2

2.2.3、操作实战二(可以认为是路由方案)

ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2b

ip netns add ns1
ip netns add ns2

ip link set veth1a netns ns1
ip link set veth2a netns ns2

ip addr add 10.244.1.3 dev veth1b
ip addr add 10.244.2.2 dev veth2b
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns2 ip addr add 10.244.2.3/24 dev veth2a

ip link set veth1b up
ip link set veth2b up
ip netns exec ns1 ip link set veth1a up
ip netns exec ns2 ip link set veth2a up

ip route add 10.244.1.0/24 dev veth1b
ip route add 10.244.2.0/24 dev veth2b
ip netns exec ns1 route add -net 10.244.2.0/24 gw 10.244.1.3 dev veth1a
ip netns exec ns2 route add -net 10.244.1.0/24 gw 10.244.2.2 dev veth2a

echo 1 > /proc/sys/net/ipv4/ip_forward

将宿主机作为路由器来使用。

在这里插入图片描述

测试,如下:

ip netns exec ns1 ping 10.244.2.3

2.3、方案三:使用虚拟网桥将两个不同的命名空间链接起来

本方案,可以参考后续的网桥相关文章

3、总结

  • 如果你已经看过<<基于veth pair+snat技术实现内部网络访问本局域网的其他宿主机>>的文章后,可以思考一下,为什么在这篇文章里,没有使用proxy_arp代理转发参数呢?同样,在场景二里的操作实战二中也没有使用proxy_arp代理转发参数?

    • 本篇文章里使用了proxy_arp代理转发参数,是因为?
      • snat文章里,设置默认路由,并指定了网关地址,将veth1b网卡设置为网关了,当数据包去往10.211.55.0/24路由时,都会将数据包发送给网关,通过ARP是可以获取网关的MAC地址的。
      • 而本篇文章里没有在ns1网络命名空间里设置默认路由,因此,当veth1a发送ARP协议获取10.244.1.5IP对应的MAC地址时,veth1b网卡虽然收到了ARP数据包,发现目的IP并非是自己,就丢弃了;因此,需要让veth1b代理回答一下arp协议。
  • 本测试用例,实际中,就是同一个节点上容器之间如何通信

可以重点关注几个事情?

是否跨网段了,是否设置了路由,指定了网关,通过哪个网卡发送出去的?

ARP协议用来干什么的?

proxy_arp代理转发?什么时候使用代理转发

网桥不用设置代理转发,应该是默认支持的。

网卡之间数据包转发时,经过了哪些链?第一次,跟第二次,,,,,经过的链是否一样?

当然,一开始,总结不好,等时间长了,做了很多练习,就会发现。

好像,来来回回,就这些东西。

只是,一开始,比较乱而已。


点击 下面 返回 专栏目录

<<零入门kubernetes网络实战>>技术专栏之文章目录

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

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

相关文章

【GD32F427开发板试用】6. 定时器运用之精确定时1s

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…

MySQL:连explain的type类型都没搞清楚,怎敢说精通SQL优化?

我们在使用SQL语句查询表数据时&#xff0c;提前用explain进行语句分析是一个非常好的习惯。通过explain输出sql的详细执行信息&#xff0c;就可以针对性的进行sql优化。 今天我们来分析一下&#xff0c;在explain中11种不同type代表的含义以及其应用场景。 1&#xff0c;sys…

如何在dom节点上使用fixed定位?实现基于父节点而不是浏览器的滚动定位?一眼看懂,简单明了。

文章目录一、想要实现的功能场景二、父相子绝方式实现dom节点内元素滚动定位2.1、父相子绝代码2.2、实现效果三、iframe中使用fixed方式实现3.1、fixed代码3.2、实现效果四、总结一、想要实现的功能场景 想在一个node节点中实现滚动&#xff0c;但是我的文本要基于这个元素在滚…

云计算关键技术

在云计算数据中心的构建过程中&#xff0c;离不开一些关键的技术&#xff0c;比如&#xff0c;虚拟化技术&#xff0c;分布式数据存储技术&#xff0c;云计算平台管理软件以及其它诸如HBase&#xff0c;Hadoop等相关技术。目录 虚拟化技术 计算虚拟化技术-KVM 分布式数据存储技…

基于 YAML 接口自动化测试框架设计

在设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08;如Excel、YAML、CSV&#xff09;&#xff0c;或者数据库中&#xff0c;实现脚本与数据解耦&#xff0c;方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测…

Allegro如何设置自动保存和自动保存的时间操作指导

Allegro如何设置自动保存和自动保存的时间操作指导 做PCB设计的时候,自动保存软件是一个必要的功能,Allegro同样支持设置自动保存,而且可以设置自动保存的时间。 如下图 具体操作如下 点击Setup点击User Preferences

都说高速信号过孔尽量少,高速先生却说有时候多点反而好?

作者&#xff1a;一博科技高速先生成员 黄刚过孔在高速领域可谓让硬件工程师&#xff0c;PCB设计工程师甚至仿真工程师都闻风丧胆&#xff0c;首先是因为它的阻抗没法像传输线一样&#xff0c;通过一些阻抗计算软件来得到&#xff0c;一般来说只能通过3D仿真来确定&#xff0c;…

二叉树的性质与推导及常见习题整理

目录 一、性质推导 二、常见的二叉树性质习题 1. 某二叉树共有 399 个结点&#xff0c;其中有 199 个度为 2 的结点&#xff0c;则该二叉树中的叶子结点数为&#xff08;&#xff09;。 2.在具有 2n 个结点的完全二叉树中&#xff0c;叶子结点个数为&#xff08;&#xff…

字母板上的路径[提取公共代码,提高复用率]

提取公共代码前言一、字母版上的路径二、贪心1、idea2、go3、代码不断拆分复用的过程总结参考文献前言 写代码&#xff0c;在提高效率的同时&#xff0c;要方便人看&#xff0c;这个人包括自己。大函数要拆分成一些小函数&#xff0c;让每个函数的宏观目的和步骤都显得清晰&am…

分享微信点餐小程序搭建步骤_微信点餐功能怎么做

线下餐饮实体店都开始摸索发展网上订餐服务。最多人选择的是入驻外卖平台&#xff0c;但抽成高&#xff0c;推广还要另买流量等问题&#xff0c;也让不少商家入不敷出。在这种情况下&#xff0c;建立自己的微信订餐小程序&#xff0c;做自己的私域流量是另一种捷径。那么&#…

分类模型评估:混淆矩阵、准确率、召回率、ROC

1. 混淆矩阵 在二分类问题中&#xff0c;混淆矩阵被用来度量模型的准确率。因为在二分类问题中单一样本的预测结果只有Yes or No&#xff0c;即&#xff1a;真或者假两种结果&#xff0c;所以全体样本的经二分类模型处理后&#xff0c;处理结果不外乎四种情况&#xff0c;每种…

反应-扩散方程(Reaction-diffusion system)

文章目录单组分反应-扩散方程双组分反应-扩散方程三组分和更多组分的反应-扩散方程Fishers equationKPP方程Belousov–Zhabotinsky reaction历史化学机理变体Noise-induced order数学背景Briggs–Rauscher reactionZFK equation行波解渐近解外部区域内部区域KPP-ZFK 转变Clavin…

13-PHP使用过的函数 121-130

121、bindColumn 将字段绑定到变量上 // while,foreach,list()进行结果数组的解构&#xff0c;解构到变量中; //!要在预处理对象上调用bindColumn函数 $stmt->bindColumn(id,$id); $stmt->bindColumn(name,$name); $stmt->bindColumn(sex,$sex); $stmt->bindColumn…

flink solt概念详解

ask是flink中的一个逻辑概念&#xff0c;一个任务由一个或者多个算子组合而成(多个算子构成一个任务是需要满足一定的条件才可以&#xff0c;有兴趣的老铁可以来了解一下 Operator Chain),为了提升任务执行的效率&#xff0c;可以对任务配置并行度&#xff0c;使任务在实际运行…

【服务器数据恢复】FreeNAS层UFS2文件系统数据恢复案例

服务器数据恢复环境&#xff1a; Dell存储服务器&#xff0c;采用esxi虚拟化系统&#xff0c;esxi虚拟化系统里有3台虚拟机&#xff1b;上层iSCSI使用FreeNAS构建&#xff0c;通过iSCSI方式实现FCSAN功能&#xff1b;FreeNAS层采用UFS2文件系统。 esxi虚拟化系统里有3台虚拟机中…

python中使用numpy包的向量矩阵相乘

一直对np的线性运算不太清晰&#xff0c;正好上课讲到了&#xff0c;做一个笔记整个理解一下 1.向量和矩阵 在numpy中&#xff0c;一重方括号表示的是向量vector&#xff0c;vector没有行列的概念。二重方括号表示矩阵matrix&#xff0c;有行列。 代码显示如下&#xff1a; …

VMware 复制已有的虚拟机并修改IP地址

第一步&#xff1a;关闭当前机器第二步&#xff1a;在VMware中右键要克隆的机器 选择管理-->克隆第三步&#xff1a;启动新克隆的虚拟机 修改主机名 如 hostname slave2第四步&#xff1a;修改克隆的虚拟机的ip地址和mac地址&#xff08;注意&#xff1a;由于slave2是克隆出…

直流电机驱动模块开发,为电子设备提供动力之源

直流电机分为有刷直流电机和无刷直流电机两种&#xff0c;有刷直流电机连接上直流电就能转动&#xff0c;但是想要做到精准的转速和方向控制离不开电机驱动模块&#xff1b;无刷直流电机则必须要有驱动才能转动&#xff0c;直流电机驱动模块能够充分利用和有效发挥电源的能量功…

MQTT X 1.9.1 发布:资源消耗降低 80%,稳定性大幅提升

经过两个 Beta 版本迭代&#xff0c;近日&#xff0c;MQTT 5.0 客户端工具 MQTT X 正式发布了 1.9.1 稳定版本。 该版本通过大规模性能优化以及已知问题修复实现了稳定性的飞跃提升。特别是在性能方面&#xff0c;以接收大量消息场景为例&#xff0c;v1.9.1 相比于上一版本&am…

【数据结构与算法】单调队列 | 单调栈

&#x1f320;作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《数据结构与算法要啸着学》 &#x1f387;座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;…