网络学习:邻居发现协议NDP

目录

前言:

一、报文内容

二、地址解析----NS/NA

目标的被请求组播IP地址

邻居不可达性检测:

重复地址检测

路由器发现

地址自动配置

默认路由器优先级和路由信息发现

重定向


前言:

        邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议 替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器发现(Router Discovery),它定义了使 用ICMPv6报文实现地址解析,邻居不可达性检测,重复地址检测,路由器发现,重定向以及ND代理等功能。

一、报文内容

NDP协议中一共有五种ICMPv6报文类型,分别是RS,RA,NS,NA和Redirect报文

ICMPV6类型消息名称
type=133RS(Router Soliciation 路由器请求报文)
type=134RA(Router Advertisement 路由器公告报文)
type=135NS(Neighbor Solicitatio 邻居请求报文)
type=136NA(Neighbor Advertisement 邻居通告报文)
type=137Redirect(重定向报文)

NS和NA报文主要用于地址解析,RA和RS报文主要用于无状态地址自动配置,Redirect报文用于路由器重定向。

二、地址解析----NS/NA

在IPv4中,当主机需要和目标主机通信时,必须先通过ARP协议获得目的主机的链路层地址。在IPv6中,同 样需要从IP地址解析到链路层地址的功能。邻居发现协议实现了这个功能。

ARP报文是直接封装在以太网报文中,以太网协议类型为0x0806,普遍观点认为ARP定位为第2.5层的协议。 NDP本身基于ICMPv6实现,以太网协议类型为0x86DD,即IPv6报文,IPv6下一个报头字段值为58,表示 ICMPv6报文,由于NDP协议使用的所有报文均封装在ICMPv6报文中,一般来说,ND被看作第3层的协议, 在三层完成地址解析。与IPv4的ARP相比,IPv6地址解析技术工作在OSI参考模型的网络层,与链路层协议无 关。

主要带来以下几个好处:

  • 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。
  • 可以使用三层的安全认证机制避免地址解析攻击----ARP攻击、ARP欺骗。
  • 使用组播方式发送请求报文,减少了二层网络的性能压力-----二层网络会进行洪范,而使用组播可以圈 定目标主机,从而限定了报文传播范围,节省网络带宽。

地址解析过程中使用了两种ICMPv6报文:邻居请求报文NS(Neighbor Solicitation)和邻居通告报文NA (Neighbor Advertisement)。

  • NS报文:Type字段值为135,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP请求报文。
  • NA报文:Type字段值为136,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP应答报文。

Host A在向Host B发送报文之前它必须要解析出Host B的链路层地址,所以首先Host A会发送一个NS报文。

源IP地址为Host A的IPv6地址,目的IP地址为Host B的被请求节点组播地址,需要解析的目标IP为Host B的 IPv6地址,这就表示Host A想要知道Host B的链路层地址。源MAC地址为节点A的MAC地址,目标MAC是节点B的被请求节点组播MAC地址。同时需要指出的是,在NS报文的Options字段中还携带了Host A的链路层地址。

目标的被请求组播IP地址

在IPv6组播地址中,有一种特别的组播地址,称为被请求节点组播地址(Solicited-node Address)。 被请求节点组播地址是一种具有特殊用途的地址,主要用于重复地址检测和获取邻居节点的链路层地址时,代替IPv4中使用的广播地址。

该地址是通过计算得出: 被请求节点组播地址由前缀FF02::1:FF00::/104和单播地址的最后24位组成。对于节点或路由器的接口 上配置的每个单播和任播地址,都自动启用一个对应的被请求节点组播地址。被请求节点组播地址使 用范围为链路本地。这里使用2000::1/64举例:

最终2000::1的被请求组播IP地址为FF02::1:FF00::1/104。在例如:如4037::01:800:200E:8C6C对应 于FF02::1:FF0E:8C6C。

组播IPv6报文的目的IP地址是组播IPv6地址,而目的MAC地址则必须是组播MAC地址,并且该地址必 须与组播IPv6地址对应。33-33是专门为IPv6组播预留的MAC地址前缀,MAC地址的后32bit从对应的 组播IPv6地址的后32bit拷贝而来。

所以FF02::1:FF00::1/104的组播MAC地址为33-33-FF00-0001。

当Host B接收到了NS报文之后,就会回应NA报文,其中源地址为Host B的IPv6地址,目的地址为Host A的 IPv6地址(使用NS报文中的Host A的链路层地址进行单播),Host B的链路层地址被放在Options字段中。 这样就完成了一个地址解析的过程。

值得注意的是,因为IPV6地址这样的设定就导致可能出现IPV6网络中存在多个前缀不同但是后24位相同的 IPV6地址,从而产生多个主机使用了一个组播MAC地址,导致网络混乱,所以在ICMPV6数据包中会携带 Target Address字段2000::2,指示目标主机,只有对应的主机会接收该请求,其余主机会丢弃该数据包。

以上抓包,采用以下环境完成:

实际上这个过程大家也不用想的过于复杂,只不过涉及到了一些地址的计算。

类比IPV4的PING

路由器 AR1需要构造 ICMP echo request 报文,将PC1的IP地址 填入报文的目的 IP 地址字段。但在发送该 报文前, 路由器 A 需要确认它已经掌握了以下 4 个信息:

  • 目的 MAC 地址
  • 源 MAC 地址
  • 源 IP 地址
  • 目的 IP 地址

在这 4 个信息中,路由器 A 能轻松填上其中 3 个。

我们敲的命令是 “ping PC1” ,所以路由器 A 知道报文应该填写的目的 IP 地址为 PC1的地址,同时,路由器 R1自身已知自己的源MAC地址和源IP地址。

IPV6的PING

IPv6 中的 Ping 和 IPv4 非常类似,区别在于它使用的是 ICMPv6 echo request 报文。同样的,为了让报文 能顺利发到目的地址 2001:DB8::AB:2, 路由器 A 同样需要以下 4 个信息:

  • 目的 MAC 地址
  • 源 MAC 地址
  • 源 IPv6 地址
  • 目的 IPv6 地址

和 IPv4 情形类似,我们可以很轻松地得到上面 4 个信息中的 3 个。

  • 源 MAC 地址
  • 源 IPv6 地址
  • 目的 IPv6 地址

现在我们同样只差一项了:2000::2 对应的 MAC 地址。

那么现在轮到…额,等等。我们不能使用 IPv4 网络中的 ARP 了。为什么呢?因为 ARP 是广播,而 IPv6 压 根没有广播,那我们应该怎么做呢?

根据前面所学,我们知道了,如果一个接口上配置了 2000::2/64 这样一个全球单播地址,它会根据接口配置 的单播地址自己计算出一个对应的组播地址 FF02::1:FF00::2 并加入这个组播组。

那这个地址有什么作用呢?

类似IPV4协议,虽然R1并不知道PC1的MAC地址,但它至少知道PC1一定会侦听一个 MAC 地址:FF:FF-FFFF-FF-FF 这个广播地址。通过这个广播地址,路由器 R1就能与PC1 搭上话,询问 PC1对应的MAC 地址是多 少。事实上不止PC1会监听这个广播地址,所有位于这个广播域的设备都会监听,只不过只有PC1会回复。

而现在,尽管在 IPv6 没有广播了,但路由器 R1还是知道PC1 必然侦听的一个 MAC 地址:33-33-FF-FF-00- 02—这个MAC地址是根据2000::2的组播地址FF02::1:FF00::2计算得出。

这下子路由器R1就能和 PC1 通信了,它也就能获取到想要的单播地址对应的 MAC 地址了,这也被称为 IPv6 的邻居发现(Neighbor Discovery)

邻居不可达性检测:

通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障等。如果目的地失效,则恢复是不可能 的,通信失败;如果路径失效,则恢复是可能的。 因此节点需要维护一张邻居表,每个邻居都有相应的状 态,状态之间可以迁移。

邻居状态有5种,分别是:未完成(Incomplete)、可达(Reachable)、陈旧(Stale)、延迟(Delay)、 探查(Probe)。

display ipv6 neighbors —查看IPV6邻居表 

邻居状态迁移过程如下,其中Empty表示邻居表项为空,初始状态。

  1. 首先初始情况下Empty不是状态,只是代表没有发送NS报文之前,IPV6邻居为空
  2. 当A节点发送NS报文之后,自身会产生缓存消息,状态变为Incomplete—表示未完成
  3. 当A节点收到对方节点回复的NA报文,并且信息验证无误后,邻居状态由Incomplete变为Reachable (可达),否则固定时间后邻居状态由Incomplete变为Stale(陈旧)—默认时间为30S
  4. 经过30S邻居可达时间,状态由Incomplete变为Stale,意为未知目标是否可达 实际上stale状态是一个稳定状态,就是不会自己改变,因为正常情况下建立邻居后不会发送ICMP报 文,也就不会发送NS,所以实际上大部分的IPV6邻居都处于Stale状态。此时如果超过老化时间(缺省 情况下是20分钟),该表项没有被使用,也进入到DELAY状态。
  5. 如果在Reachable状态,A收到B的非请求NA报文,且报文中携带的B的链路层地址和表项中不同,则邻 居状态马上变为Stale。
  6. 在Stale状态若A要向B发送数据,则邻居状态由Stale变为Delay,并发送NS请求
  7. 向邻居发送NS报文,如果在指定时间内(缺省情况下是5秒)没有收到响应,则进入PROBE状态;若收 到NA应答,则变为REACH状态。其间若有NA应答,则邻居状态由Delay变为Reachable—,默认时 间5S
  8. 在Probe状态,按照RA报文发布的时间间隔Retrans Timer(或者主机配置值)发送单播邻居请求报文 NS,如果有应答,则进入REACH状态。如果无应答则邻居状态变为Empty,即删除表项。—时间间隔 默认3S。

重复地址检测

重复地址检测DAD(Duplicate Address Detect)是在接口使用某个IPv6单播地址之前进行的,主要是为了 探测是否有其它的节点使用了该地址。尤其是在地址自动配置的时候,进行DAD检测是很必要的。 一个IPv6 单播地址在分配给一个接口之后且通过重复地址检测之前称为试验地址(Tentative Address)。此时该接口 不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:ALL-NODES组播组和试验地址所对应的 Solicited-Node组播组。

IPv6重复地址检测技术和IPv4中的免费ARP类似:节点向试验地址所对应的Solicited-Node组播组发送NS报 文。NS报文中目标地址即为该试验地址。如果收到某个其他站点回应的NA报文,就证明该地址已被网络上 使用,节点将不能使用该试验地址通讯。

Host A的IPv6地址FC00::1为新配置地址,即FC00::1为Host A的试验地址。Host A向FC00::1的SolicitedNode组播组发送一个以FC00::1为请求的目标地址的NS报文进行重复地址检测,由于FC00::1并未正式指 定,所以NS报文的源地址为未指定地址。当Host B收到该NS报文后,有两种处理方法:

  • 如果Host B发现FC00::1是自身的一个试验地址,则Host B放弃使用这个地址作为接口地址,并且不会 发送NA报文。
  • 如果Host B发现FC00::1是一个已经正常使用的地址,Host B会向FF02::1发送一个NA报文,该消息中会 包含FC00::1。这样,Host A收到这个消息后就会发现自身的试验地址是重复的。Host A上该试验地址 不生效,被标识为duplicated状态。

从抓包结果来看,第一个NS包请求的是本地链路地址,R1路由器的0/0/0口除了自己配置的地址外,还存在 一个本地链路地址,这里R1上的本地链路地址为FE80::2E0:FCFF:FEF6:41EA,本地链路地址对应的组播地址 为 FF02::1:FFF6:41EA,这个数据包用来检测本地链路地址是否重复。也就是说实际上,IPV6地址检测会检测接口配置的IPV6地址是否冲突,同时也会检测本地链路地址是否会冲突。

https://support.huawei.com/enterprise/zh/doc/EDOC1100272823#ZH-CN_TOPIC_0000001467623457

路由器发现

路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数。

在IPv6中,IPv6地址可以支持无状态的自动配置,即主机通过某种机制获取网络前缀信息,然后主机自己生 成地址的接口标识部分。路由器发现功能是IPv6地址自动配置功能的基础,主要通过以下两种报文实现:

  • 路由器通告RA(Router Advertisement)报文:每台设备为了让二层网络上的主机和设备知道自己的 存在,定时都会组播发送RA报文,RA报文中会带有网络前缀信息,及其他一些标志位信息。RA报文的 Type字段值为134。
  • 路由器请求RS(Router Solicitation)报文:很多情况下主机接入网络后希望尽快获取网络前缀进行通 信,此时主机可以立刻发送RS报文,网络上的设备将回应RA报文。RS报文的Type字段值为133。

地址自动配置

IPv4使用DHCP实现自动配置,包括IP地址,缺省网关等信息,简化了网络管理。IPv6地址增长为128位,且 终端节点多,对于自动配置的要求更为迫切,除保留了DHCPV6作为有状态自动配置外,还增加了无状态自 动配置。无状态自动配置即自动生成链路本地地址,主机根据RA报文的前缀信息,自动配置全球单播地址 等,并获得其他相关信息。

IPv6主机无状态自动配置过程:

1. 根据接口标识产生链路本地地址。

接口激活IPV6服务后,将根据自身的接口MAC地址,生成本地链路地址。

2. 发出邻居请求,进行重复地址检测。

3. 如地址冲突,则停止自动配置,需要手工配置。

4. 如不冲突,链路本地地址生效,节点具备本地链路通信能力。

5. 主机会发送RS报文(或接收到设备定期发送的RA报文)。

6. 根据RA报文中的前缀信息和接口标识得到IPv6地址。

同时,值得注意的是上述所有报文均使用组播进行传递,NS—邻居发现报文使用被请求链路组播地址, RS/RA使用FF02::1用于在本地链路范围的所有节点的请求。

配置命令:

server端(R1)[Huawei]ipv6 —全局启动IPV6服务[Huawei-GigabitEthernet0/0/0]ipv6 enable —接口启动IPV6协议[Huawei-GigabitEthernet0/0/0]ipv6 address 2000::1 64—接口配置IPV6地址[Huawei-GigabitEthernet0/0/0]undo ipv6 nd ra halt —用来使能系统发布RA报文功能,重要配置 client端(R2)[Huawei]ipv6 —全局启动IPV6 [Huawei-GigabitEthernet0/0/0]ipv6 enable —接口启动IPV6服务[Huawei-GigabitEthernet0/0/0]ipv6 address auto global —接口无状态自动获取地址

默认路由器优先级和路由信息发现

当主机所在的链路中存在多个设备时,主机需要根据报文的目的地址选择转发设备。在这种情况下,设备通 过发布默认路由优先级和特定路由信息给主机,提高主机根据不同的目的地选择合适的转发设备的能力。

在RA报文中,定义了默认路由优先级和路由信息两个字段,帮助主机在发送报文时选择合适的转发设备。

主机收到包含路由信息的RA报文后,会更新自己的路由表。当主机向其他设备发送报文时,通过查询该列表 的路由信息,选择合适的路由发送报文。

主机收到包含默认设备优先级信息的RA报文后,会更新自己的默认路由列表。当主机向其他设备发送报文 时,如果没有路由可选,则首先查询该列表,然后选择本链路内优先级最高的设备发送报文;如果该设备故 障,主机根据优先级从高到低的顺序,依次选择其他设备。

重定向

当网关设备发现报文从其它网关设备转发更好,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关设备。重定向报文也承载在ICMPv6报文中,其Type字段值为137,报文中会携带更好的路径下 一跳地址和需要重定向转发的报文的目的地址等信息。

Host A需要和Host B通信,Host A的默认网关设备是Switch A,当Host A发送报文给Host B时报文会被送到 Switch A。Switch A接收到Host A发送的报文以后会发现实际上Host A直接发送给Switch B更好,它将发送 一个重定向报文给主机A,其中报文中更好的路径下一跳地址为Switch B,Destination Address为Host B。 Host A接收到了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往Host B的报文就直接发送 给Switch B。

当设备收到一个报文后,只有在如下情况下,设备会向报文发送者发送重定向报文:

  • 报文的目的地址不是一个组播地址。
  • 报文并非通过路由转发给设备。
  • 经过路由计算后,路由的下一跳出接口是接收报文的接口。
  • 设备发现报文的最佳下一跳IP地址和报文的源IP地址处于同一网段。
  • 设备检查报文的源地址,发现自身的邻居表项中有用该地址作为全球单播地址或链路本地地址的邻居存 在。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读——Rein

Stronger, Fewer, & Superior: Harnessing Vision Foundation Models for Domain Generalized Semantic Segmentation 一、引言 是一个对Domain Generalized Semantic Segmentation (DGSS)任务的视觉大模型的微调方法,即Rein。 Rein 专为 DGSS 任务量身定制&a…

数据结构——lesson8二叉树的实现

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

【玩转pandas系列】pandas数据结构—DataFrame

文章目录 前言一、DataFrame创建1.1 字典创建1.2 NumPy二维数组创建 二、DataFrame切片2.1 行切片2.2 列切片2.3 行列切片 三、DataFrame运算3.1 DataFrame和标量的运算3.2 DataFrame之间的运算3.3 Series和DataFrame之间的运算 四、DataFrame多层次索引4.1 多层次索引构造1.隐…

软考高级:架构描述语言 ADL 概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

【Linux】Ubuntu使用Netplan配置静态/动态IP

1、说明 Ubuntu 18.04开始,Ubuntu和Debian移除了以前的ifup/ifdown命令和/etc/network/interfaces配置文件,转而使用ip link set或者/etc/netplan/01-netcfg.yaml模板和sudo netplan apply命令实现网络管理。 Netplan 是抽象网络配置描述器,用于配置Linux网络。 通过netpla…

旧华硕电脑开机非常慢 电脑开机黑屏很久才显示品牌logo导致整体开机速度非常的慢怎么办

前提条件 电池需要20%(就是电池没有报废)且电脑接好电源,千万别断电,电脑会变成砖头的 解决办法 更新bios即可解决,去对应品牌官网下载最新的bios版本就行了 网上都是一些更新驱动啊

【Godot4.2】颜色完全使用手册

概述 本篇简单汇总Godot中的颜色的构造和使用,内容包括了: RGB、RGBA,HSV以及HTML16进制颜色值、颜色常量等形式构造颜色颜色的运算以及取反、插值用类型化数组、紧缩数组或PNG图片形式存储多个颜色 构造颜色 因为颜色是一种视觉元素&…

8-图像缩放

其实,就是开辟一个zoomwidth,zoomheight的内存,再分别赋值即可。 void CDib::Scale(float xZoom, float yZoom) { //指向原图像指针 LPBYTE p_data GetData(); //指向原像素的指针 LPBYTE lpSrc; //指向缩放图像对应像素的指针 LPBYTE lpDs…

基于grafana+elk等开源组件的 云服务监控大屏架构

本套大屏,在某云服务大规模测试环境,良好运行3年. 本文主要展示这套监控大屏的逻辑架构.不做具体操作与配置的解释. 监控主要分为三部分: 数据展示部分数据存储数据采集 1. 数据展示 数据展示方面主要使用grafana 2. 数据存储 根据数据种类和特性和用途的不同,本套监控采用…

Mysql的行级锁

MySQL 中锁定粒度最小的一种锁,是 针对索引字段加的锁 ,只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。行级锁和存…

Vue项目的搭建

Node.js 下载 Node.js — Download (nodejs.org)https://nodejs.org/en/download/ 安装 测试 winR->cmd执行 node -v配置 在安装目录下创建两个子文件夹node_cache和node_global,我的就是 D:\nodejs\node_cache D:\nodejs\node_global 在node_global文件下再创建一个…

ArkTS 基础组件

目录 一、常用组件 二、文本显示(Text/Span) 2.1 创建文本 2.2 属性 2.3 添加子组件(Span) 2.4 添加事件 三、按钮(Button) 3.1 创建按钮 3.2 设置按钮类型 3.3 悬浮按钮 四、文本输入(TextInput/TextArea)…

Flask学习(四):路由转换器

默认的路由转换器&#xff1a; string &#xff08;缺省值&#xff09; 接受任何不包含斜杠的文本int接受正整数float接受正浮点数 path类似 string&#xff0c;但可以包含斜杠uuid接受 UUID 字符串 代码示例&#xff1a; app.route(/user/<username>) def show_u…

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛——B 题:基于多模态特征融合的图像文本检索完整思路与源代码分享

一、问题背景 随着近年来智能终端设备和多媒体社交网络平台的飞速发展&#xff0c;多媒体数据呈现海量增长 的趋势&#xff0c;使当今主流的社交网络平台充斥着海量的文本、图像等多模态媒体数据&#xff0c;也使得人 们对不同模态数据之间互相检索的需求不断增加。有效的信…

【GPT-SOVITS-06】特征工程-HuBert原理

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

大数据 - Spark系列《十四》- spark集群部署模式

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《…

《前端系列》之前端学习路线

目录 1 前言2 前端学习路线2.1 入门阶段2.1.1 HTML2.1.2 CSS2.1.3 JavaScript2.1.4 网络基础 2.2 基础阶段2.2.1 前端框架2.2.2 深入JavaScript2.2.3 ES62.2.4 工程化知识 2.3 进阶阶段2.3.1 CSS2.3.2 Javascript2.3.3 单元测试2.3.4 性能优化 3 总结 1 前言 在技术更新迭代发…

Python数学建模-2.5Pandas库介绍

2.5.1Pandas基本操作 Pandas是一个强大的Python数据分析库&#xff0c;它提供了快速、灵活且富有表现力的数据结构&#xff0c;设计初衷是为了处理关系型或标记型数据。Pandas的基本操作涵盖了数据的读取、处理、筛选、排序、分组、合并以及可视化等多个方面。 以下是一些Pan…

【从零开始学习数据结构 | 第一篇】树

目录 前言&#xff1a; 树&#xff1a; 树结点之间的关系描述&#xff1a; 树的常见属性&#xff1a; 森林&#xff1a; ​编辑树的性质&#xff1a; 总结&#xff1a; 前言&#xff1a; 当谈论数据结构时&#xff0c;树&#xff08;Tree&#xff09;是一种极为重要且常…

测试人员Bug书写规范

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 在测试人员日常工作中&#xff0c;关于bug的编写和定义是一个比较经常的工作&#xff0c;如果bug编写描…