ARP-地址解析协议(在实践中深入理解ARP协议)


在同一个网络(无特别说明,均指以太网络)中进行通信的主机,必须要拥有目标主机的MAC地址才能够正确地将数据发送给目标主机,那么如何知道目标主机的MAC地址呢?可以通过ARP协议。ARP协议就是用来获取目标IP地址所对应的MAC地址的,也就是说,ARP协议可以动态地在三层IP地址和二层MAC地址之间建立一种映射关系。可以用如下示意图来形象表示其作用:

wKioL1cHdYrzdFoQAABCVOaI8VA489.png

可以看到上面的图示是把ARP协议划分到网络层,也既是认为它是一个网络层的协议,这是出于它为网络层的IP协议提供服务而考虑的。但实际上,由于ARP协议用以解析出IP地址(逻辑地址)所对应数据链路层中的地址(物理地址/硬件地址),所以把其划分在数据链路层也是没有问题的,这并没有严格的定义。

我们下面将通过具体的实践过程来分析四种常见的ARP包:ARP请求包、ARP响应包、无偿ARP包与IP地址冲突检测,同时也会分析一下ARP代理的发生过程。

这里会使用的环境如下:

网络设备模拟器:GNS3

抓包软件:Wireshark


1.网络环境搭建

为了简洁起见,这里不设置一个较大的网络环境来满足前面四种情况ARP包分析的需要,而是在分析不同的ARP情况时分别搭建较小的网络环境,这样可以使我们的分析更有针对性。


2.ARP包报文格式

 

如下:

wKiom1cGFGHRkO7MAAB5efhRsBY432.jpg

注意我们关注的是28字节的ARP包,只不过上面的图还包含了以太网首部字段信息(显然以太网首部的帧类型为ARP,在分析IP协议时提到过,这是一个数据分用的概念)。

因为对于ARP包的分析,其实我们更关心的应该是ARP请求包、ARP响应包、无偿ARP包或者ARP代理相关的知识,而后面的实践也主要是分类地进行讨论。所以下面先给出一个普通ARP包(请求包)的实际结构,然后再给出每一个字段的具体含义(参考了《TCP/IP详解 卷1:协议》的部分内容),先作一个基本的了解,最后再详细分析这些包产生的过程:

  • 一个普通ARP包(请求包的实际结构)

    wKioL1cHfA6QwK28AACIULqKkL8900.png

    • ARP包各字段具体含义(对比上面实际抓到的包)

      字段 含义
      硬件类型

      占16位

      表示硬件地址的类型,值为1即表示以太网地址,也就是MAC地址

      协议类型

      点16位

      表示要映射的协议地址类型,值为0x0800即表示IP地址,因为本文都是在IP协议的基础上进行分析的(即网络层逻辑地址为IP地址),所以所抓到的包的该字段类型都为0x0800

      硬件地址长度

      占8位

      指出硬件地址的长度,单位为字节,因为本文针对的是以太网,而以太网地址为MAC地址,占48位,即6字节,所以后面抓到的包中该字段的值都为6,不再作特别说明

      协议地址长度

      占8位

      指出三层逻辑地址的长度,单位为字节,因为本文针对的是以太网地址和IP地址的映射,而IP地址占32位,即6字节,所以后面抓到的包中该字段的值都为4,不再作特别说明

      操作字段

      指出操作类型,对应的值如下:

      ARP请求:1

      ARP响应:2

      RARP请求:3

      RARP响应:4

      但因为RARP现在已经很少使用了,所以本文不会讨论

        发送端以太网地址

        占48位

        准确上说是“发送端硬件地址”,但因为本文只针对以太网进行讨论,所以表述为“发送端以太网地址”

        发送端IP地址

        占32位

        准确上说是“发送端网络层逻辑地址”,但因为本文只针对的是以太网地址和IP地址的映射的讨论,所以表述为“发送端IP地址”

        目的以太网地址 占48位
        目的IP地址 占32位

         


        3.在实践中分析ARP的实现过程:ARP请求、ARP响应

        (1)网络环境搭建

        本节主要是抓取ARP请求包和ARP响应包来分析ARP请求与响应的一个详细过程,以及对应ARP包中相关字段的含义,这个实践的网络环境比较简单,如下:

        wKioL1cH9t3A3IpcAAAYFDS8dzg450.png

        在R1路由器上做如下配置:

        R1#conft
        R1(config)#intf0/0
        R1(config-if)#noshu
        R1(config-if)#ipadd192.168.1.1255.255.255.0
        R1(config-if)#dowr

        在R2路由器上做如下配置:

        R2#conft
        R2(config)#intf0/0
        R2(config-if)#noshu
        R2(config-if)#ipadd192.168.1.2255.255.255.0
        R2(config-if)#dowr

        然后在R1路由器上查看arp缓存表:

        R1#showarp
        ProtocolAddressAge(min)HardwareAddrTypeInterface
        Internet192.168.1.1-cc01.127f.0000ARPAFastEthernet0/0

        可以看到arp缓存表中并没有192.168.1.2的MAC地址,所以如果待会R1发送数据给R2,必然会有ARP请求发生,所以这里请确保R1中确实没有192.168.1.2的MAC地址,如果有的话,建议重启两个路由器。(虽然可以在路由器上执行clear arp-cache来清除arp缓存表,但是清除过后又会马上生成,所以这里建议直接重启)

        (2)抓取并分析ARP请求包和ARP响应包

        首先在R1和R2的链路上启动Wireshark,监测R1的接口。(这是GNS3的功能,可以直接抓取通过两个路由器之间链路的数据包)

        在R1上执行如下命令:

        Router#ping192.168.1.2Typeescapesequencetoabort.
        Sending5,100-byteICMPEchosto192.168.1.2,timeoutis2seconds:
        .!!!!
        Successrateis80percent(4/5),round-tripmin/avg/max=44/62/76ms

        !表示数据发送成功,可以看到第一个是".",则表示数据发送失败,这是因为,第一个包在发送时,R1中并没有192.168.1.2的MAC地址,于是就去发送ARP请求来获得其MAC地址,但是当获得MAC地址之后,第一个包已经超时了(等待MAC地址超时),并没有发送出去,可以看下面抓到的包:

        wKioL1cH-e3xXuGhAADU7E7LgVU534.png

        可以看到已经有2个ARP包(1个请求和1回答)和8个ICMP包(4个请求和4个回答),这里我们主要分析的是ARP包。

        • ARP请求包

          数据包结构如下:

          wKiom1cH-kLC3NwiAABfmtjo-0M195.png

          字段分析如下:

          a.硬件类型、协议类型、硬件地址长度、协议地址长度

          这几个字段的内容跟前面讨论的一样,因为针对的是以太网和IP地址

          b.操作字段Opcode

          可以看到Opcode的值为request(1),所以这是一个ARP请求包。

          c.发送端以太网地址

          我们是从R1向R2发送数据的。

          从前面的命令执行结果:

          R1#showarp
          ProtocolAddressAge(min)HardwareAddrTypeInterface
          Internet192.168.1.1-cc01.127f.0000ARPAFastEthernet0/0

          这确实是R1的MAC地址(配置了192.168.1.1 IP地址的接口的MAC地址)。

          d.发送端IP地址

          发送端也确实是192.168.1.1,也就是R1。

          e.目的以太网地址

          可以看到这里为全0,在ARP请求包中,会把目的以太网地址字段的值置为全0,因为此时并不知道目的以太网地址是什么(也就是不知道192.168.1.2的MAC地址是多少)。

          f.目的IP地址

          数据包是从R1发送给R2的,所以目的IP地址就是192.168.1.2,R2收到这个ARP请求包之后,如果看到这个字段的内容是自己的IP地址,就会回复这个ARP包,也就是会发送一个ARP响应包。

          其实字段内容并不难理解,不过这里需要注意一点是,查看这个ARP请求包的数据链路层的目的MAC地址:

          wKioL1cH_3eSuNofAABuEHLgQXk437.png

          会发现其是一个广播地址,这也就意味着,发送一个ARP请求包,以太网中的所有主机都能够收到该ARP请求包,但是并不是所有的主机都会回复这个ARP请求包,只有当接收者的IP地址与ARP请求包中的Target IP address中标识的目的IP地址一致时才会进行回复。

          • ARP响应包

            数据包结构如下:

            wKiom1cIAIjD5WhMAABfYHDqc2M769.png

            对比ARP请求包来分析,其实发现并没有相关多少,只是有以下几点区别:a.ARP响应包的操作字段Opcode值为reply(2)

            b.ARP响应包的二层目的MAC地址为ARP请求包发送者的MAC地址

            也就是说,ARP请求包是以广播的形式发送的,但ARP则是以单播的形式发送的,那么发给谁呢?ARP请求包是谁发送的,ARP响应包就发给谁,对应的二层目的MAC地址就是ARP请求包发送者的MAC地址

            c.发送端以太网地址、发送端IP地址、目的以太网地址、目的IP地址

            跟ARP请求包的内容相反,只不过ARP响应包中的所有地址字段的值都是已知的,这个很容易理解,不过需要注意的是,在这个时候,ARP响应包到底要发给谁,已经很明确了,所以ARP响应包是一个单播包。

            正如上面看到的,理解常规的ARP请求包和ARP响应包的过程并不复杂,只要知道了网络通信的基本原理,各个字段的值也就很容易理解了。


            4.在实践中分析ARP的实现过程:无偿ARP与IP地址冲突检测

            • 有偿ARP

              前面在获取某个IP地址对应的MAC地址是,都需要先发送一个ARP请求包,然后再通过接收一个ARP响应包来知道该IP地址所对应的MAC地址,因为需要发送ARP请求包,我们可以认为这是“有偿”的,即要付出一些代价。

              • 无偿ARP

                而所谓无偿ARP,指的就是,我不需要发送一个ARP请求包,对方就会“无偿”地把一个ARP响应包发给我(其实也主是主动发送过来),以此来告诉我它的MAC地址。

                (1)网络环境搭建

                但是在总结什么时候对方会主动把一个ARP响应包发送过来之前,我们先实践一下,网络环境还是用上面的那个:

                wKioL1cH9t3A3IpcAAAYFDS8dzg450.png

                不过我们需要修改一下R2的IP地址,修改为192.168.1.252(在这个过程中抓包软件Wireshark要打开),如下:

                R2>en
                R2#conft
                R2(config)#intf0/0
                R2(config-if)#ipadd192.168.1.252255.255.255.0

                 

                (2)抓取并分析ARP请求包和ARP响应包

                这样做之后打开Wireshark软件,会发现抓到下面这样一个包:

                wKioL1cIBo6T_ObPAAAgd1QXSaA867.png可以看到Info一列,有个Gratutous的标识,中文意思就是“无偿,免费”的意思,我们可以查看一下数据包的结构:

                wKiom1cIBo7w_G8_AABrB1Dg3DE060.png

                通过查看操作字段Opcode的值,其实可以发现,无偿ARP其实也是一个ARP响应包(不过普通的ARP响应包是以单播的形式发送的,而无偿ARP是以广播的形式发送的),只不过这个ARP响应包比较特别,它是主动发送的,即它是gratuitous,无偿的。

                另外需要注意的是,发送端IP地址和目的IP地址是一样,这正是无偿ARP有别于普通ARP响应包的地方,当这个数据包被网络中的其他主机(显然我们这里的网络环境比较简单,所以只有R1)接收到之后,它会让这些主机使用新的IP和MAC地址关系更新它们的ARP缓存表。因为这个ARP数据包是未经请求的,即导致客户端更新ARP缓存,所以会称为无偿ARP。

                在分析了无偿ARP之后,给出下面的几种情况,都会有无偿ARP过程的发生:

                a.更改了设备的IP地址

                b.某些操作系统在启动完成之后就会发送无偿ARP(Windows和Linux都会)

                 

                (3)IP地址冲突检测

                再分析一下,无偿ARP有什么好处呢?如下:

                a.可以让以太网中的主机及时地更新其ARP缓存表,这样可以确保在数据发送时可以准确地封闭正确的地址信息

                b.检测IP地址是否有冲突

                关于这一点,可以给R2重新配置一个IP地址,并且与R1的相同:

                R2>en
                R2#conft
                R2(config)#intf0/0
                R2(config-if)#ipadd192.168.1.1255.255.255.0

                几乎马上就可以在R1和R2的控制台上看到错误日志的输出:

                R1>
                *Mar100:54:39.007:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
                *Mar100:55:09.043:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
                *Mar100:55:39.739:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
                *Mar100:56:10.011:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
                *Mar100:56:40.715:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000
                *Mar100:57:10.947:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc02.1a18.0000R2(config-if)#
                *Mar100:45:48.135:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
                *Mar100:46:18.623:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
                *Mar100:46:48.927:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
                *Mar100:47:19.651:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
                *Mar100:47:49.959:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
                *Mar100:48:21.623:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000
                *Mar100:48:51.919:%IP-4-DUPADDR:Duplicateaddress192.168.1.1onFastEthernet0/0,sourcedbycc01.127f.0000

                这里因为在修改了R2的IP地址时,它发送了无偿ARP包,R1通过检查发现其IP地址跟自己的一样,于是就会在控制台上报错,但是R2为什么又会报错呢?因为在R1发现地址有冲突时,也发送了表示IP地址冲突的无偿ARP包,如下:

                wKiom1cIDHXA6ONRAAAiRKTdoDQ454.png注意这是一个广播包,所以R2必然也能收到,查看它的包结构:

                wKioL1cIDbfy14eCAACn4FWd_YA806.png

                根据数据包的内容,R2也知道发生了IP地址冲突,所以也就会在控制台上输出错误日志了。


                4.在实践中分析ARP的实现过程:ARP代理

                如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答这个请求,这个过程就称为ARP代理。这是非常精简和通俗易懂的解释,我们可以通过下面的实践来进行体会。

                (1)网络环境搭建

                如下:

                wKiom1cID2miLu1zAAA2DvoUiiU886.png

                在前面的基础上,R1增加如下配置:

                R1>en
                R1#conft
                R1(config)#iproute0.0.0.00.0.0.0f0/0

                R2增加如下配置:

                R2>en
                R2#conft
                R2(config)#intf1/0
                R2(config-if)#noshu
                R2(config-if)#ipadd192.168.2.2255.255.255.0
                R2(config-if)#dowr

                R3则配置如下:

                R3>en
                R3#conft
                R3(config)#intf0/0
                R3(config-if)#noshu
                R3(config-if)#ipadd192.168.2.3255.255.255.0
                R3(config-if)#iproute0.0.0.00.0.0.0f0/0
                R3(config-if)#dowr

                 

                (2)抓取ARP包并分析ARP代理过程

                在R1和R2的链路上启动Wireshark,然后在R1上执行如下命令:

                R1#ping192.168.2.3Typeescapesequencetoabort.
                Sending5,100-byteICMPEchosto192.168.2.3,timeoutis2seconds:
                ...!!
                Successrateis40percent(2/5),round-tripmin/avg/max=36/50/64ms

                即R1给R3发送数据,我们查看抓到的包:

                wKioL1cIFBqD1BVYAAAsVzmbz4c606.png再分别查看详细的包结构:

                • ARP请求包

                  wKiom1cIE7KhNZgoAABfyXIa4cY502.png

                  可以看到ARP请求包跟平常一样,并没有什么区别,即R1希望知道192.168.2.3的MAC地址。

                  • ARP响应包

                    wKioL1cIFLjAqjNgAABfrw-cHVk558.png

                    看起来普通的ARP响应包也没有什么区别,其实真的是没有什么区别,但不妨在R2上执行下面的命令,查看一下ARP缓存表:

                    R2#sharp
                    ProtocolAddressAge(min)HardwareAddrTypeInterface
                    Internet192.168.1.13cc01.127f.0000ARPAFastEthernet0/0
                    Internet192.168.2.2-cc02.1a18.0010ARPAFastEthernet1/0
                    Internet192.168.2.33cc03.2327.0000ARPAFastEthernet1/0
                    Internet192.168.1.2-cc02.1a18.0000ARPAFastEthernet0/0

                    在这个ARP缓存表中,192.168.2.3对应的MAC地址是cc03.2327.0000,并不是上面看到的数据包结构中的cc02.1a18.0000!!!cc02.1a18.0000是192.168.1.2对应的MAC地址!!!可以分析如下:

                    R1想要知道192.168.2.3的MAC地址,于是发送ARP请求包,但很显然,192.168.2.3跟192.168.1.1并不在同一个网络中;当192.168.1.2接口接收到这个ARP请求包时,R2发现虽然192.168.2.3并不是自己,但是它可以到达192.168.2.3所在的网络,即192.168.2.0/24这个网络,于是它就向R1发回了一个ARP响应包,告诉R1,192.168.2.3的MAC地址是自己(即配置了192.168.1.2的接口的MAC地址)。虽然这是一种“谎言”,但由于这样做确实是可以帮R1把数据发送到R3,所以有时候我们也把ARP代理称作“善意的谎言”。

                    那么通过上面的实践过程和分析之后也就非常清楚什么是ARP代理了。即如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答这个请求,这个过程就称为ARP代理。

                    上面这个过程需要体会一下,这样一来的话,相信对计算机网络通信又会有了更深入的了解。


                    5.下一步要做什么

                    首先有时间当然是自己也尝试把上面的实践完成一遍,好好分析一下ARP协议,其实ARP协议所涉及到的重要的内容,上面的实践过程基本上都已经全部给出,真的不能错过。

                    如果觉得自己已经掌握了的话,可以尝试去了解一下ARP欺骗的原理,看看其实是不是很简单。

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

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

    相关文章

    Maven私服

    1 Maven私服简介 Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。 1.1 下载构件顺序 建立私服后,当局域网内的用户需要某个构件时&a…

    Unity3d--跨平台(一)

    转自:https://www.cnblogs.com/murongxiaopifu/p/4211964.html前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇。到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在。所以&#xff0…

    linux定时任务的用法详解

    crontab的基本格式: f1  f2  f3  f4  f5  command 分  时 日  月  周  命令 第一列f1代表分钟1~59:当f1为表示每分钟都要执行;为/n表示每n分钟执行一次;为a-b表示从第a分钟到第b分钟这段时间要执行;为a,…

    Unity3d-跨平台(二)

    转自:http://www.jiandaima.com/blog/archives/945.html 是如何输出到多平台的? 我的第一篇文章,选择了一个不那么简单的主题,但是是我近期比较感兴趣的。这周,我和一个朋友,谈到了游戏开发和Unity3D&#…

    svn冲突解决方案

    解决方法 步骤一、清空svn的队列 1、进入到项目的.svn目录中,查看是否存在wc.db文件 C:\Users\Administrator>D:D:\>cd D:\BBK_SVN\I3_TrunkD:\BBK_SVN\I3_Trunk>cd .svnD:\BBK_SVN\I3_Trunk\.svn>dirVolume in drive D has no label.Volume Serial Nu…

    redis集群搭建与配置

    redis集群搭建与配置

    keepalived的安装与添加服务

    keepalived的安装与添加服务

    Mr. Bender and Square

    Description Mr. Bender has a digital table of size n  n, each cell can be switched on or off. He wants the field to have at least c switched on squares. When this condition is fulfilled, Mr Bender will be happy. Well consider the table rows numbered from…

    keepalived+nginx保持高可用配置

    安装nginx、keepalived nginx安装 keepalived安装与添加服务在/etc/keepalived目录下新建nginx_check.sh(两台服务器都需要) 配置keepalived.conf: #配置邮箱 global_defs {notification_email {# acassenfirewall.loc# failoverfirewall.loc# sysadmin…

    nginx+keepalived详细配置信息

    Nginx Keepalived 第一步: 下载keepalived地址:http://www.keepalived.org/download.html 解压安装: tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/ yum install -y openssl openssl-devel(需要安装一个软件包&#xff09…

    毕业3年,为何技术能力相差越来越大?

    导读:毕业三年,每个人在技术能力跑道上,有了或大或小的差距。有些人永远在重复的劳动,有些人却能从中总结和解决问题。今天我们来探讨下,如何避免让战术上的勤奋掩盖战略上的懒惰,使得真正掌握好的知识点慢…

    Periodic Signal

    描述 Profess X is an expert in signal processing. He has a device which can send a particular 1 second signal repeatedly. The signal is A0 ... An-1 under n Hz sampling. One day, the device fell on the ground accidentally. Profess X wanted to check whether …

    boost stacktrace堆栈打印

    在windows下最方便的是minidump,其他2个平台麻烦不少,google-breakpad使用起来又太麻烦. 最近boost1.65版本出了个stacktrace使用起来简单方便,只是无法看实际数据,对于快速定位BUG还是很有帮助的. 要注意的是异常的处理需要写文件,应用重启之后再读取查看~ 用其他应用读取或…

    Windows下dump文件生成与分析

    一、 生成Dump文件方式 1.1任务管理器 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出,此种方法只适用于程序崩溃但没有立即自行退出的情…

    迪杰斯特拉算法 两点间最短路径的选择

    百度首页 登录 注册 新闻网页贴吧知道音乐图片视频地图百科文库进入词条搜索词条帮助首页分类艺术科学自然文化地理生活社会人物经济体育历史特色百科历史上的今天数字博物馆史记2015城市百科二战百科非遗百科用户蝌蚪团燃梦计划百科任务百科商城权威合作合作模式常见问题联系方…

    TLS--线程局部存储

    转自:https://blog.csdn.net/u013761036/article/details/54960277 这个东西并不陌生了,之前写过了一个关于这个的应用,利用静态TLS姿势实现代码段静态加密免杀或者所谓的加壳思路。地址在这:http://blog.csdn.net/u013761036/article/detai…

    向量内积(点乘)和外积(叉乘)概念及几何意义

    向量的内积(点乘) 定义 概括地说,向量的内积(点乘/数量积)。对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,如下所示,对于向量a和向量b: a和b…

    SVN分支/合并

    转自:https://blog.csdn.net/e3002/article/details/21469437 先说说什么是branch。按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在…

    prim算法 求最小生成树

    最小生成树Prim算法理解 标签: Prim算法理解最小生成树Prim2014-08-16 18:49 18482人阅读 评论(5) 收藏 举报版权声明:本文为博主原创文章,未经博主允许不得转载。 MST(Minimum Spanning Tree,最小生成树)问…