注:本文为 “ARP” 相关文章合辑。
未整理去重。
以太网完整协议
yundanfengqing_nuc 于 2017-05-03 15:54:31 发布
一、以太网中数据帧结构
以太网是目前最流行的一种局域网组网技术(其他常见局域网组网技术还有令牌环局域网、无线局域网、ATM 局域网),以太网技术的正式标准是 IEEE 802.3 标准,它规定了在以太网中传输的数据帧结构,如下图所示。
在物理层上看,一个完整的以太网帧有 7 个字段,事实上,前两个字段并不能算是真正意义上的以太网数据帧,它们是以太网在物理层上发送以太网数据时添加上去的。为了实现底层数据的正确阐述,物理层使用 7 个字节前同步码(0 和 1 交替的 56 位(55-55-55-55-55-55-55))实现物理层帧输入 / 输出同步;使用 1 个字节的 SFD(帧首定界符,固定为 10101011)标识帧的开始。
上图中剩下的 5 个字段是真正的以太网数据,其中包含了目的地址和源地址,它们都是 6 字节长度(通常每个网卡都有 1 个 6 个字节 MAC 地址,以在以太网中唯一地标识自己)。网卡接收数据时,通过将目的地址字段和自身的 MAC 地址做比较,判断是否接收该数据包。通常,将这里的 6 字节目的地址按照下面的格式来书写,如:00-01-02-03-04-05。这 6 个字节在以太网中是按照从左到右的顺序发送的,同时对每个字节来说,最先发送的是最低位 bit0,最后是最高位 bit7。
在以太网帧中,目的地址可以分为三类:单播地址、多播地址和广播地址。单播地址通常与一个具体网卡的 MAC 地址相对应,它要求第一个字节的 bit0(即最先发出去的位)必须是 0;多播地址则要求第一个字节的 bit0 为 1,这样,在网络中多播地址不会与任何网卡的 MAC 相同,多播数据可以被很多个网卡同时接收;广播地址的所有 48 位全为 1(即 FF-FF-FF-FF-FF-FF),同一局域网中的所有网卡可以接收广播数据包。
上图中的长度 / 类型具有两个意义,当这两个字节的值小雨 1518 时,那么它就代表其后数据字段的长度;如果这两个字节的值大于 1518,则表示该以太网帧中的数据属于哪个上层协议(例如 0x800,代表 IP 数据包;0x806,代表 ARP 数据包等。)
在使用网卡进行数据包的发送与接收时,网卡已为我们完成了物理层的所有工作,驱动程序要做的是,在发送数据时,将目的地址、源地址、类型 / 长度、数据和填充这些值写入网卡,网卡自动计算其 CRC 并添加在数据帧尾部,同时对数据帧进行物理层的封装,最后将数据帧发送出去;在接收数据时,网卡会自动检测并接收数据包,验证校验和并把上述四个字段的值放在内部 SRAM 中供控制器读取。
TCP/IP 协议有自己的地址:32bit 的 IP 地址(网络地址),网络层发送数据包时只知道目的地址的 IP 地址,而底层接口(如以太网驱动程序)必须知道对方的硬件地址才能将数据发送出去。
二、ARP 协议
2.1 ARP 缓存表
ARP 的功能是在 32bit 的 IP 地址和采用不同网络技术的硬件地址之间提供动态映射,为上层将底层的物理地址差异屏蔽起来,这样上层的因特网协议就可以灵活地使用 IP 地址进行通信了。ARP 协议的基本功能是使用目标主机的 IP 地址,查询其对应的 MAC 地址,以保证底层链路上数据包通信的进行。为了实现在网络接口物理地址与 IP 地址间的转换,ARP 协议中引入了 ARP 缓存表的概念。ARP 缓存表中记录了一条一条的 < IP 地址,MAC 地址 > 对,他们是主机最近运行获得的关于周围其他主机的 IP 地址到物理地址的绑定,当需要发送 IP 数据包时,ARP 层根据目的 IP 地址来查找 ARP 缓存表,并将匹配的 MAC 地址装入以太网帧首部,最后发送以太网数据。
ARP 缓存表的建立与 ARP 数据包是密切相关的。在以太网中,ARP 数据包和 IP 数据包是两个独立的部分,它们都封装在以太网帧中发送。ARP 数据包的种类有两种:一是 ARP 请求包,它是通过以太网广播的方式发送的,用于向具有某个 IP 地址的主机发送请求,希望该主机返回其 MAC 地址;二是 ARP 应答包,收到 ARP 请求的主机会比对该数据包中的 IP 地址与自己的 IP 地址是否符合,若是,则该主机向源主机返回一个 ARP 应答包。向源主机报告自己的 MAC 地址。源主机通过提取 ARP 应答包中的相关字段来更新 ARP 缓存表。在 Windows 控制台上输入 arp -a,可以查看操作系统中使用的 ARP 缓存表。
举一个简单的例子来看看 ARP 的功能。假如我们的主机(192.168.1.11)需要向开发板(192.168.1.37)发送一个 IP 数据包,当发送数据时,主机会在自己的 ARP 缓存表中寻找是否有目标 IP 地址。如果找到了,也就知道了目标 MAC 地址为(04-02-35-00-00-01),此时,主机直接把目标 MAC 地址写入以太网首部发送就可以了;如果在 ARP 缓存表中没有找到相对应的 IP 地址,此时比较不幸,我们的数据需要被延迟发送,随后主机会先在网络上发送一个广播(ARP 请求,以太网目的地址为 FF-FF-FF-FF-FF-FF),广播的 ARP 请求表示同一网段内所有主机将会收到这样一条信息:“192.168.1.37 的 MAC 地址是什么?请回答”。网络 IP 地址为 192.168.1.37(开发板)的主机接收到这个帧后,它有义务做出这样的回答(ARP 应答):“192.168.1.37 的 MAC 地址是(04-02-35-00-00-01)”。这样,主机就知道了开发板的 MAC 地址,先前被延时的数据包就可以被发送了,此外,主机将这个地址对保存在缓存表中,以便后续数据包发送时使用。
ARP 协议的核心就是对 ARP 缓存表的操作。发送数据包时,查找缓存表以得到目的 MAC 地址,此外,ARP 还需要不断地处理 ARP 请求包和 ARP 应答包,以保证缓存表中各个表项的有效性。ARP 的实质就是对缓存表的建立、更新、查询等操作。
2.2 ARP 报文
要在源主机上建立关于目标主机的 IP 地址与 MAC 地址对应表项,则源主机和目的主机的基本信息交互式必须的,简单地说就是,源主机如何告诉目的主机:我需要你的 MAC 地址;而目的主机如何回复:这就是我的 MAC 地址。这时 ARP 报文(ARP 数据包)就派上用场了。
ARP 请求和 ARP 应答都是被组装在一个 ARP 数据包中发送的,ARP 包的组成结构如下图所示。需要注意的是:ARP 包时被封装在以太网帧中发送的,所以在图中也列出了以太网帧头部。
以太网帧头部中的前两个字段是以太网的 MAC 地址和源 MAC 地址,目的地址为全 1 的特殊地址是以太网广播地址。在 ARP 表项建立前,源主机只知道目的主机的 IP 地址,并不知道其 MAC 地址,所以在数据链路上,源主机只有通过广播的方式将 ARP 请求数据包发送出去,同一网段上的所有以太网接口都会接收到广播的数据包。
两个字节长的以太网帧类型表示帧中数据的类型。对于 ARP 包来说,该字段值为 0x0806;对 IP 包来说,该字段的值为 0x0800。接下来就是 ARP 数据包部分了,第一个硬件类型字段表示发送方想要知道的硬件接口类型,对于以太网 MAC 地址,它的值为 1. 协议类型字段表示要映射的协议地址类型,它的值为 0x0800 时,即表示要映射为 IP 地址,该值与以太网数据帧头中的类型字段的值使用相同的一组值。
接下来的两个单字节长度的字段,称为硬件地址长度和协议地址长度,它们分别指出硬件地址和协议地址的长度,长度单位为字节。对于以太网上 ARP 请求或应答来说,它们的值分别为 6 和 4,代表 MAC 地址的长度和 IP 地址的长度。在 ARP 协议包中流出硬件地址长度和协议地址长度字段可以使得 ARP 协议在任何网络中被使用,而不仅仅只在以太网中。
操作字段 op 指出 ARP 数据包的类型,它们可以使 ARP 请求(值为 1)、ARP 应答(值为 2)。
接下来的四个字段是发送端的以太网 MAC 地址、发送端的 IP 地址、目的端的以太网 MAC 地址和目的端的 IP 地址。
三、网际协议(IP)
IP 是整个 TCP/IP 协议的核心,传输层协议,如 UDP 和 TCP 都需要 IP 提供服务,而像 ICMP 和 IGMP 等网络层协议也是基于 IP 来传送协议数据。常见的广域网络路由器就工作在 IP 层,它们负责将 IP 数据报从源主机发送至目的主机,主机间的区分是通过 IP 地址来实现的。主机上的 IP 协议需要完成的工作很多,最基本的是数据报发送和递交,在特殊情况下它还要完成数据报的分片和重装的功能,在更特殊的情况下,它还要完成数据报的转发等工作。
ARP 原理
ARP(Address Resolution Protocol)地址解析协议,是根据 IP 地址获取物理地址的一个 TCP/IP 协议。
OSI 网络七层模型中,IP 地址在 OSI 模型第三层,MAC 地址在第二层,彼此不直接通信。
在通过以太网发送 IP 数据包时,需要封装第三层(32 位 IP 地址)和第二层(48 位 MAC 地址)的报头。由于发送数据包时,只知道目标 IP 地址,不知道其 MAC 地址,而又不能跨越第二、三层,所以需要使用 ARP 地址解析协议。
TCP/IP 协议栈加人 ARP 过程是给发送端设备提供一种询问机制,“ 谁的 IP 地址是这个地址,与它相关的物理地址(硬件 MAC )是什么?”
ARP 报文和 IP 报文不同。ARP 报文和 IP 报文一样可以嵌在以太网帧或任何 LAN 帧中。ARP 帧仅在特定的局域网网段中才有效,而且它也不会离开本地局域网(也就是说,ARP 报文不可以被路由)。
代理 ARP
代理 ARP 就是通过使用一个指定的设备(通常是路由器)使用其 MAC 地址来对另一设备的 ARP 请求作出应答。
路由器的重要功能之一就是把局域网的广播包限制在该网内,阻止其扩散,否则会造成网络风暴。
ARP 请求是个广播包,它查寻的对象如果在同一个局域网内,就会收到应答,但如果不在同一个局域网该如何处理?
路由器就提供的代理 ARP 为该问题提供了解决方案。
举例:两台主机 A 和 B 处于同一网段但不同的广播段时,主机 A 发送 ARP 请求主机 B 的 MAC 地址时,因为路由器不转发广播包的原因,ARP 请求只能到达路由器。
如果路由器启用了代理 ARP 功能,并知道主机 B 属于它连接的网络,那么路由器就用自己接口的 MAC 地址代替主机 B 的 MAC 地址来对主机 A 进行 ARP 应答。主机 A 接收 ARP 应答,但并不知道代理 ARP 的存在。
ARP 报文格式
ARP 报文结构如图所示
上图中展示了 28 字节的 ARP 报文,因为其包括了 1 字节、2 字节、4 字节和 6 字节等不同长度的字段,因此不能直接以普通 32 位的方式显示。前五个字段构成了报文头部。紧接着的 4 个字段表示发送端和目的端 IP 地址与 MAC 地址。一般来说,目的 MAC 地址需要用地址解析得出。ARP 报文还可以由一串个数不定的 0 结尾。
在以太网局域网中,ARP 报文有自己的以太网类型值 (0x0806)。然而有些 ARP 实现使用了 IP 分组中 “常规的” 以太网类型 (0x0800),因为 IP 网络可以很容易地识别出帧内部是 IPv4 报文(报文以 0x04 开头),还是 ARP 报文(报文以 0x0001 开头)。
以下主要的字段在 ARP 请求和应答报文中都会出现。硬件类型 —— 用 2 字节的字段标识硬件地址的类型 (其常见的当然是以太网类型的 MAC 地址,其值 = 1)。
协议类型 —— 用 2 字节的字段标识第三层(网络层)所用到的协议类型(ARP 消息不是 IP 报文,不止用于 IP 地址解析)。这个值和以太网帧中字段的值是一样的,所以 IP 是 0x0800。
硬件地址长度 —— 6 字节,标识硬件以太网 MAC 地址的长度。
协议地址长度 —— 4 字节,标识第三层协议 IP 地址的长度。
操作 —— 2 字节,标识 ARP 报文的目的。
操作 op 共有 4 种类型
值为 1. ARP 请求
值为 2. ARP 应答
值为 3. RARP 请求
值为 4. RARP 应答
例如,当 ARP 发起一个请求(询问谁有这个 IPv4 地址),该字段的值就为 1,收到的应答报文的该字段值为 2。剩下的字段都没有固定的长度,其长度取决于硬件长度字段和协议长度字段的值。在以太局域网中,硬件地址长度是 6 字节(MAC 地址),协议地址长度是 4 字节(IPv4 地址)。在这种情况下,这些字段的长度和功能如下所示。
发送端的以太网地址 —— 6 字节,标识了发送端的以太网地址。它应该与以太网帧中的源地址相同。
发送端的 IP 地址 —— 4 字节,标识了发送端的以太网 IP 地址 (这是目的端可以在不请求更多 ARP 的情况下将信息填人 ARP 缓存的方式)。
目的端以太网地址 —— 6 字节,标识了目的端主机的以太网地址。该字段在发送请求的时候全置为 0,应答时才填入内容,并把操作字段改为 “应答”。
目的端 IP 地址 —— 4 字节,标识目的端主机的 IPv4 地址。
ARP 报文是广播帧,会被发送给所有站点。当目的端设备在数据包的 IP 层中看到目的 IP 地址与自己的 IP 地址匹配时,就直接响应发送端。目的端设备发送响应的时候,只是简单地把 ARP 数据包中的源 IP 地址和目的 IP 地址反转
。目的端设备在帧和报文中也使用自己的硬件地址作为源地址。
ARP 报文的封装
ARP报文被封装成一个数据链路帧
ARP 封装使用类型字段(Type field)标识为 0x0806,表示这是一个地址解析协议(ARP)数据包。不需要带有 Preamble 和 SFD。ARP 消息直接嵌套在以太网帧或其他局域网帧中,这些帧已经包含了前导码和帧起始定界符。
ARP 解析过程 by charsek
posted @ 2020-11-06 13:55 charseki
ARP(Address Resolution Protocol)地址解析协议,根据 IP 地址获取物理地址的一个 TCP/IP 协议。
由于 OSI 模型把网络分为七层,IP 地址在 OSI 模型第三层,MAC 地址在第二层,彼此不直接通信。在通过以太网发送 IP 数据包时,需要封装第三层(32 位 IP 地址)和第二层(48 位 MAC 地址)的报头,由于发送数据包时,只知道目标 IP 地址,不知道其 MAC 地址,而又不能跨越第二、三层,所有需要使用地址解析协议。
ARP 报文格式
字段 1:ARP 请求的目的以太网地址,全 1 时,代表广播地址。
字段 2:发送 ARP 请求的以太网地址。
字段 3:以太网帧类型表示后面的数据类型,ARP 请求和 ARP 应答此字段为:0x0806。
字段 4:硬件地址类型,硬件地址不止以太网一种,是以太网类型时,值为 1。
字段 5:表示要映射的协议地址的类型,要对 IPv4 地址进行映射,此值为 0x0800。
字段 6 和 7:表示硬件地址长度和协议地址长度,MAC 地址占 6 字节,IP 地址占 4 字节。
字段 8:是操作类型字段,值为 1,表示进行 ARP 请求;值为 2,表示进行 ARP 应答;值为 3,表示进行 RARP 请求;值为 4,表示进行 RARP 应答。
字段 9:是发送端 ARP 请求或应答的硬件地址,这里是以太网地址,和字段 2 相同。
字段 10:是发送 ARP 请求或应答的 IP 地址。
字段 11 和 12:是目的端的硬件地址和 IP 地址。
ARP 解析过程
(1)当 PC1 想发送数据给 PC2,首先在自己的本地 ARP 缓存表中检查主机 PC2 匹配的 MAC 地址
(2)如果 PC1 缓存中没有找到响应的条目,它将询问主机 PC2 的 MAC 地址,从而将 ARP 请求帧广播到本地网络的所有主机。该帧中包括源主机 PC1 的 IP、MAC 地址,本地网络中的所有主机都接收到 ARP 请求,并且检查是否与自己的 IP 地址相匹配。如果发现请求中 IP 地址与自己 IP 不匹配,则丢弃 ARP 请求。
(3)主机 PC2 确定 ARP 请求中得 IP 地址与自己的 IP 地址匹配,则将主机 PC1 的地址和 MAC 地址添加到本地缓存表中。
(4)主机 PC2 将包含其 MAC 地址的 ARP 回复消息直接发送回主机 PC1(数据帧为单播)。
(5)主机 PC1 收到 PC2 发挥的 ARP 回复消息,将 PC2 的 IP 和 MAC 地址添加至自己 ARP 缓存表中,本机缓存是有生存期的,默认 ARP 缓存表有效期 120s。当超过该有效期后,则将重复上面过程。主机 PC2 的 MAC 地址一旦确定,主机 PC1 就能向主机 PC2 发送 IP 信息
arp 报文总共 42 bytes。其中以太网首部 14 bytes,arp 字段 28 字节
ARP 返回报文
硬件类型:表示硬件地址的类型(其中,值为 1 表示以太网地址,其他还可能表示令牌环地址)。
协议类型:表示要映射的协议地址类型(其中,0x0800 表示 IP 地址,其他还可能是 ICMP/IGMP)。
硬件地址长度:指出该报文中硬件地址的长度(ARP 报文中,它的值为 6)。
协议地址长度:指出该报文中协议地址的长度(ARP 报文中,它的值为 4)。
op:操作字段,共有 4 种类型(1.ARP 请求,2.ARP 应答,3.RARP 请求,4.RARP 应答)。
发送者 mac 地址:发送方设备的硬件地址。
发送者 ip 地址:发送方设备的 IP 地址。
目的 mac 地址:接收方设备的硬件地址。
目的 ip 地址:接收方设备的 IP 地址。
ARP,这个隐匿在计网背后的男人
cxuan 2021-01-12 08:01
只要确定了 IP 地址后,就能够向这个 IP 地址所在的主机发送数据报,这是我们所熟知的事情。
但是再往深了想,IP 地址只是标识网络层的地址,那么在网络层下方数据链路层是不是也有一个地址能够告诉对方主机自己的地址呢?
是的,这个地址就是MAC 地址
。
认识 MAC 地址
MAC ( Media Access Control
,媒体访问控制)地址是网络上以太网或网络适配器的唯一标识符。它能够区分不同的网络接口,并用于多种网络技术,尤其是大多数 IEEE 802 网络。
MAC 地址也称为物理地址,硬件地址。
MAC 地址主要用于识别数据链路中互联的节点,如下图所示
MAC 地址长 48 bit,网卡 (NIC)
中的 MAC 地址是烧入 ROM 中的。MAC 地址的结构如下
MAC 地址中的 3 - 24 位表示 OUI(Organizationally unique identifier ,组织唯一标识符),每个 NIC 厂商都有特定唯一的识别数字。25 - 48 位是厂商内部为识别每个网卡而用 EUI(Extended Unique Identifier,扩展唯一标识符),以保证全世界不会有相同 MAC 地址的网卡。
MAC 地址也有例外情况,即 MAC 地址也会有重复的时候,但是问题不大,只要两个 MAC 地址是属于不同的数据链路层就不会出现问题。
ARP 是什么
ARP ( Address Resolution Protocol
,地址解析协议 )是一个用于实现从 IP 地址到 MAC 地址的映射 的一种协议。ARP 协议在 IPv4 中极其重要。
注意:ARP 只用于 IPv4 协议中,IPv6 协议使用的是 NDP(
Neighbor Discovery Protocol
,邻居发现协议),已被纳入 ICMPv6 中。
简而言之,ARP 就是一种解决地址问题的协议,它以 IP 地址为线索,定位下一个应该接收数据分包的主机 MAC 地址。如果目标主机不在同一个链路上,那么会查找下一跳路由器的 MAC 地址。
ARP 工作机制
下面探讨一下 ARP 的工作机制是怎样的。
假设 A 和 B 位于同一链路,不需要经过路由器的转换,主机 A 向主机 B 发送一个 IP 分组,主机 A 的地址是 192.168.1.2 ,主机 B 的地址是 192.168.1.3,它们都不知道对方的 MAC 地址是啥,主机 C 和 主机 D 是同一链路的其他主机。
主机 A 想要获取主机 B 的 MAC 地址,主机 A 会通过广播
的方式向以太网上的所有主机发送一个 ARP 请求包
,这个 ARP 请求包中包含了主机 A 想要知道的主机 B 的 IP 地址的 MAC 地址。
主机 A 发送的 ARP 请求包会被同一链路上的所有主机 / 路由器接收、解析并检查 ARP 请求包中的信息,如果 ARP 请求包中的目标 IP 地址
和自己的相同,就会将自己主机的 MAC 地址写入响应包返回主机 A
由此,可以通过 ARP 从 IP 地址获取 MAC 地址,实现同一链路内的通信。
如果是不同链路怎么办呢?
这就要使用到 代理 ARP
了,通常 ARP 会被路由器隔离,但是采用代理 ARP (ARP Proxy) 的路由器可以将 ARP 请求转发给临近的网段。使多个网段中的节点像是在同一网段内通信。
ARP 缓存
现在,我们知道了发送一次 IP 分组前通过发送一次 ARP 请求就能够确定 MAC 地址。那么是不是每发送一次都得经过广播 -> 封装 ARP 响应 -> 返回给主机这一系列流程呢?
想想看,浏览器是如何做的呢?浏览器内置缓存能够缓存你最近经常使用的地址,那么 ARP 也是一样的。
ARP 高效运行的关键就是维护每个主机和路由器上的 ARP 缓存(或表)
。这个缓存维护着每个 IP 到 MAC 地址的映射关系。通过把第一次 ARP 获取到的 MAC 地址作为 IP 对 MAC 的映射关系到一个 ARP 缓存表中,下一次再向同一地址发送数据报时就不再需要重新发送 ARP 请求了,而是直接使用这个缓存表中的 MAC 地址进行数据报的发送。每发送一次 ARP 请求,缓存表中对应的映射关系都会被清除。
通过 ARP 缓存,降低了网络流量的使用,在一定程度上防止了 ARP 的大量广播。
一般来说,发送过一次 ARP 请求后,再次发送相同请求的几率比较大,因此使用 ARP 缓存能够减少 ARP 包的发送。除此之外,不仅仅 ARP 请求的发送方能够缓存 ARP 接收方的 MAC 地址,接收方也能够缓存 ARP 请求方的 IP 和 MAC 地址,如下所示
不过,MAC 地址的缓存有一定期限,超过这个期限后,缓存的内容会被清除。
我们可以在 Linux 或者 Windows 中使用 arp
命令查看 ARP 缓存。选项 -a
用于显示两个系统缓存中所有的缓存项。
在 Linux 中使用 arp 查询缓存
主要包含五项
- 主机名 — 对应一个 IP 地址
- 硬件地址类型
- 硬件地址
- 标志
- 本地网络接口
标志主要分为三类
: C 、M 或 P。
C 表示的是由 ARP 协议动态学习。
M 类可以通过 arp -s 增加一条。
P 类表示的是 发布
,对于任何 P 类项目,主机对输入的 ARP 请求都返回一个 ARP 响应。这个选项用于配置代理 ARP。
比如我们在 Windows 中进行 ARP 缓存查询
Windows 中的 ARP 程序显示了 IPv4 的地址,它的接口是十六进制数,Windows 版本还指出地址是手动输入还是 ARP 动态学习的。在上面的例子中,既有静态的也有动态的。48 位的 MAC 地址被显示为 6 个十六进制数,在 Linux 中使用 :
号,在 Windows 中使用 -
进行分隔。
ARP 结构
我们上面说到,ARP 对想要知道 MAC 地址的目标主机会首先发送 ARP 请求,那么这个请求中都携带哪些信息呢?
下面是在以太网中转换一个 IPv4 的地址常用的 ARP 请求或响应的报文格式。
前面 14 个字节
构成标准以太网的首部
,前两个字段 DST 和 SRC 分别表示 以太网的目的地址
和 以太网的源地址
,以太网的目的地址如果是 ff:ff:ff:ff:ff:ff
全部为 1 表示广播地址,在同一广播域中的所有以太网接口可以接收这些帧。后面紧跟着的是 ARP 请求的长度/类型,ARP 请求 和 ARP 应答值为 0x0806
。
硬件类型
表示硬件地址的类型,硬件地址常见的有 MAC 物理或者以太网地址,对于以太网来说,值为 1。协议类型
指出映射的协议地址类型,对于 IPv4 地址,值是0x0800
。硬件大小
和协议大小
分别指出硬件地址和协议地址的字节数。对于以太网中使用 IPv4 的 ARP 请求或应答,它们的值分别是 6 和 4。Op
字段指出如果是 ARP 请求 Op = 1,ARP 应答 Op = 2,RARP 请求 Op = 3,RARP 应答 Op = 4。- 紧跟在 Op 之后的是
发送方硬件地址(MAC 地址)
,发送方的协议地址(IPv4 地址)
,目的硬件地址
和目的协议地址
。
ARP 抓包实战
我们分别演示在 Mac 和 Linux 下的 ARP 报文的截获
在 Mac 环境下,我这边使用的是 WireShark
进行抓包,可以从官网地址下载
https://www.wireshark.org/download.html
下载完成后按照安装说明的手册提示需要安装两个插件,安装即可,然后我们打开 WireShark ,开始报文拦截,下面是我截获的 ARP 数据包
这款软件很好的一个地方是对不同的数据包会有不同的颜色标识。
然后我们查看 ARP 请求
可以看到一个完整的 ARP 请求包,我们使用的硬件类型是以太网,协议类型是 IPv4 ,默认值是 0x0800,然后硬件大小是 6 字节,协议大小占用 2 字节,Op 的全称是 Opcode ,Op = 1 表示这是一个 ARP 请求,然后是发送方的硬件地址和协议地址,接收方的硬件地址和协议地址。
ARP 响应如下
可以看到 Op = 2,表示这是一个 ARP 响应。
在 Linux 环境下,你可以使用 tcpdump
截获 ARP 数据包,如果 tcpdump not found ,你可以使用以下命令安装
yum install -y tcpdump
使用 tcpdump -i ens33
可以打印出在 ens33 地址下的数据包,下面是我截取的 ARP 数据包。
ARP 缓存超时
缓存超时通常与 ARP 缓存中的项有关系,arp 命令可以允许管理员设置永不超时。ARP 把保存在高速缓存中的每一映射地址都设置生存时间,一般为 20 分钟。如果是不完整的映射,那么缓存超时为 3 分钟,不完整的映射通常会强制发送一条不存在主机的 ARP 请求。
RARP
与 ARP 相对的,RARP(Reverse Address Resolution Protocol
,反向地址解析协议 ) 是将 ARP 反过来,从 MAC 地址定位 IP 地址的一种协议,将打印机服务器等小型嵌入式设备接入网络时会使用到。
平常我们设置 IP 地址一般会有两种方式,手动设置
和 DHCP 动态获取
但是对于嵌入式设备来说,它没有任何输入接口,也无法通过 DHCP 获取动态地址。
在这种情况下,就要使用到 RARP 了,你需要准备一个 RARP 服务器,并在服务器上注册设备的 MAC 地址和 IP 地址,然后将设备接入网络,设备会发出一条 IP 和 MAC 地址的查询请求给服务器,服务器会告诉设备其 IP 地址和 MAC 地址。
ARP 攻击
ARP 是一种非常不安全的协议,目前已经有很多涉及 ARP 的攻击,最主要的就是使用代理 ARP 功能假扮主机,对 ARP 请求作出应答,通过伪造 ARP 数据包来窃取合法用户的通信数据,造成影响网络传输速率和盗取用户隐私信息等严重危害。
ARP 攻击类型
ARP 主要攻击方式分为下面这几种
-
ARP 泛洪攻击
通过向网关发送大量 ARP 报文,导致网关无法正常响应。首先发送大量的 ARP 请求报文,然后又发送大量虚假的 ARP 响应报文,从而造成网关部分的 CPU 利用率上升难以响应正常服务请求,而且网关还会被错误的 ARP 缓存表充满导致无法更新维护正常 ARP 缓存表,消耗网络带宽资源。
-
ARP 欺骗主机攻击
ARP 欺骗主机的攻击也是 ARP 众多攻击类型中很常见的一种。攻击者通过 ARP 欺骗使得局域网内被攻击主机发送给网关的流量信息实际上都发送给攻击者。主机刷新自己的 ARP 使得在自己的ARP 缓存表中对应的 MAC 为攻击者的 MAC,这样一来其他用户要通过网关发送出去的数据流就会发往主机这里,这样就会造成用户的数据外泄。
-
欺骗网关的攻击
欺骗网关就是把别的主机发送给网关的数据通过欺骗网关的形式使得这些数据通过网关发送给攻击者。这种攻击目标选择的不是个人主机而是局域网的网关,这样就会攻击者源源不断的获取局域网内其他用户韵数据.造成数据的泄露,同时用户电脑中病毒的概率也会提升。
-
中间人攻击
中间人攻击是同时欺骗局域网内的主机和网关,局域网中用户的数据和网关的数据会发给同一个攻击者,这样,用户与网关的数据就会泄露。
-
IP地址冲突攻击
通过对局域网中的物理主机进行扫描,扫描出局域网中的物理主机的 MAC 地址,然后根据物理主机的 MAC 进行攻击,导致局域网内的主机产生 IP 地址冲突,影响用户的网络正常使用。
总结
ARP 是 TCP/IP 实现中的一个基本协议,它通常在应用程序或用户没有察觉到的情况下运行。ARP 可以用于映射 IP 地址为 MAC 地址。
计算机网络学习:分组转发和路由选择、ARP 协议
陆海潘江小 C 于 2021-04-13 21:13:53 发布
一、网络层的任务和服务
计算机网络的学习已经到网络层部分了,从物理层、数据链路层,逐渐接近五层协议结构的上层。
网络层是数据链路层的上一层,它的工作任务,也是核心功能,一共有两个:分组转发和路由选择。
1、分组转发
网络层的主要任务就是将分组从源主机传送到目的主机,最核心的设备无非就是路由器了。路由器维护了一个转发表,在转发分组时候,根据分组数据的首部标识在转发表中查询,然后转发到目标地址。
2、路由选择
当分组从发送方传送到接收方,网络层需要决定这些分组要走的路径,这就是路由选择(Routing)。路由选择的结果就是生成转发表。
路由选择的方式包括:集中式、分布式。分布式自动路由选择需要再路由器上运行路由选择协议,互相交换路由信息并计算路由。实际上,该过程直接生成的是路由表,再生成转发表。
在网络层,提供了面向连接和无连接的服务。
面向连接服务的网络成为虚电路网络;无连接服务的网络成为数据报网络。
- 虚电路网络的特点
- 可靠的通信由网络来保证;
- 终点地址仅在连接建立阶段使用,每个分组使用短的虚电路号;
- 属于同一条虚电路的分组均按照同一个路由进行转发,按发送顺序到达终点;
- 所有通过故障结点的虚电路都不能工作;
- 容易实现,可以将通信资源提前分配给每一条虚电路。
- 数据报网络的特点
- 可靠通信由用户保证;
- 每个分组都有完整的终点地址,达到终点可能不按顺序;
- 每个分组独立选择路由进行转发;
- 出故障的结点可能丢失分组,路由可能发生变化;
- 很难实现。
二、ARP 协议原理
网络层中重要的协议:IP 协议,是 TCP/IP 体系中最重要的协议之一。
IP 协议配套的 4 个协议是:地址解析协议(ARP)、逆地址解析协议(RARP)、网际控制报文协议(ICMP)、网际组管理协议(IGMP)。
ARP 和 RARP 协议解决了已知目标 IP 地址,需要获得对应的物理地址;和反过程,已知目标物理地址,需要获得相应的 IP 地址。
RARP 协议现在已经没有单独使用,DHCP 协议中已经包含 RARP 协议的功能。
这里我主要记录一下 ARP 工作过程。
在支持广播的局域网中可以使用 ARP 协议解决IP 地址和物理地址的动态映射关系问题。方法:每台主机都有 ARP 高速缓存,在其中存放了一个 IP 地址 - 物理地址的映射表,并且不断动态更新。
ARP 工作过程,总结如下:
1、目标物理地址在 ARP Cache 中
当 A 主机要发送 IP 数据报给同一局域网的主机 B,A 主机查询自己的 ARP Cache,发现存在 B 的 IP 地址和物理地址映射条目,因此就把 MAC 地址写入 MAC 帧通过局域网发送到 B 的物理地址。
2、目标物理地址不在 ARP 高速缓存中
(1)第一步,A 主机的 ARP 进程在局域网内部发送一个广播 ARP 请求分组,该分组封装在数据链路层的广播帧中。主要内容是:我的 IP 地址是 10.1.1.1,MAC 地址 00-00-25-AB-EE-9C,我想知道 IP 地址为 10.1.1.2 的 MAC 地址。
(2)第二步,局域网内部的所有主机上的 ARP 进程都会收到这个 ARP 请求分组。
(3)第三步,主机 B 发现 ARP 请求分组中的 IP 地址和自己的匹配,立即向 A 主机发送响应分组,写入自己的 MAC 地址,主要内容是:我的 IP 地址是 10.1.1.2,MAC 地址 00-ED-00-AB-24-9C。此时的响应分组是数据链路层单播,因为只从源地址发送给目标地址 A 主机。
(4)最后,主机 A 收到主机 B 的 ARP 响应分组,就在自己的 ARP 高速缓存中写入 B 的 IP 地址 - MAC 地址映射。
在这个过程完成了主机 A 对主机 B 的 MAC 地址信息的获取,当然,主机 B 会把主机 A 的 IP 地址 - MAC 地址写入自己的 Cache,方便之后可能的通信,不用发送 ARP 广播,减少网络的通信量。
看到这里,我们会发现前提是在同一局域网下主机之间的数据传送,在不用局域网中,主机 A 发送的广播不会被主机 B 接收到,因此,需要通过路由器对主机 A 的请求进行转发,再继续上面的 ARP 工作过程。
三、ARP 的 4 种典型情况
-
发送方是主机,IP 数据报要发送到本网络的另一个主机,这时用 ARP 找到目的物理地址。
-
发送方是主机,IP 数据报要发送到另一局域网的一个主机,这是 ARP 先找到局域网中的一个路由器,剩下工作由路由器完成。
-
发送方是路由器,IP 数据报要发送到本网络的另一个主机,这时用 ARP 找到目的物理地址。
-
发送方是路由器,IP 数据报要发送到另一局域网的一个主机,这是 ARP 先找到局域网中的另一个路由器,剩下工作由这个路由器完成。
这样,通过多次使用 ARP,实现全网的通信。
ARP 的产生当然有它的优势所在,全世界存在大量不同的网络,它们使用不同形式的物理地址,这些异构网络要互相通信,统一的 IP 地址格式加上 ARP 地址解析协议解决了这个问题,ARP 的实现过程是计算机软件自动进行的,用户并未感知到。
ARP 讲解(免费 ARP、ARP 代理、ARP 攻击)
静下心来敲木鱼已于 2023-12-30 20:31:46 修改
普通 ARP 与免费 ARP
ARP(Address resolution protocol)地址解析协议
ARP 的基本概念
ARP 的分类
ARP 主要分为普通的 ARP、免费 ARP 和代理 ARP(此处主要介绍普通 ARP 和免费 ARP)
普通 ARP 和免费 ARP 的作用
1、通过 ARP 的请求和应答报文,可以根据目的 IP 地址来解析其对应的 MAC 地址
2、发送免费 ARP 请求,可以探测本机的 IP 地址在广播域内是否冲突、告知其他网络节点自己的 IP 地址和 MAC 地址、更新其他网络节点的 ARP 缓存表
ARP 报文中涉及的全 0-MAC 地址和全 F-MAC 地址
全 F 为数据链路层封装的 MAC,表示二层广播发送(免费 ARP 应答的 Target MAC 也为全 F,表示该目的 IP 对应的 MAC 为非未知的)
全 0 为 ARP 请求报文的 Target MAC 封住的,表示目的 MAC 未知
ARP 缓存表
用于缓存 IP 地址和 MAC 地址的映射关系,动态获取到的 ARP 条目老化时间为 20 分钟,1200s
ARP 缓存表和 MAC 地址表的区别
ARP 缓存表缓存的是 IP 地址和 MAC 地址之间的关系;MAC 地址表缓存的是端口和 MAC 地址之间的关系
ARP 缓存表主要用于自身进行数据转发;MAC 地址表用来指导别人进行数据转发
动态 ARP 老化时间 1200s;动态 MAC 地址老化时间 300s
普通 ARP 报文讲解
什么情况下发送 ARP
当主机去访问其它主机时,需要二层封装 MAC 地址,如果此时本地的 ARP 缓存表没有目标主机相应的 MAC 地址,就需要发送 ARP 报文进行请求
通过案例介绍 ARP 流程以及 ARP 的报文结构
案例场景
PC1 发送 ARP 请求(此处 ARP 报文的 Target MAC 显示错误,应该为全 0)
数据链路层:源 MAC 为自己 PC1 的 MAC 地址,目的 MAC 为广播 MAC
ARP 报文:Sender IP 为自己 PC1 的 IP 地址,Sender MAC 为自己 PC1 的 MAC 地址
Target IP 为目的 PC2 的 IP 地址,Target MAC 为全 0(表示该 MAC 地址未知)
PC2 收到后发送 ARP 应答
数据链路层:源 MAC 为自己 PC2 的 MAC 地址,目的 MAC 为 PC1 的 MAC
ARP 报文:Sender IP 为自己 PC2 的 IP 地址,Sender MAC 为自己 PC2 的 MAC 地址
Target IP 为目的 PC1 的 IP 地址,Target MAC 为目的 PC1 的 MAC 地址
免费 ARP 报文讲解
什么时候发送免费 ARP
1、当设备端口配置 IP 地址时,都会连续发送三次免费 ARP 来判断自己所配地址在广播域内是否冲突(如果没有收到免费 ARP 应答,则表示此地址不冲突)
2、VRRP 协议的主设备也会发送免费 ARP 把报文
免费 ARP 请求和应答的特点
免费 ARP 请求也是 ARP 请求的一种,不同的是免费 ARP 的发送者和接收者 IP 地址都是自己
免费的 ARP 应答也是 ARP 应答的一种,不同的是免费 ARP 的发送者和接收者 IP 地址都是自己,并且接收者的 MAC 地址为全 1
通过案例介绍免费 ARP 流程以及免费 ARP 的报文结构
案例场景
PC1 发送免费 ARP 请求
数据链路层:源 MAC 为自己 PC1 的 MAC 地址,目的 MAC 为广播 MAC
ARP 报文:Sender IP 和 Target IP 都为自己 PC1 的 IP 地址
Sender MAC 为自己 PC1 的 MAC 地址,Target MAC 为全 0(表示该 MAC 地址未知)
PC2 发送免费 ARP 应答(告知此 IP 地址已经被自己使用)
数据链路层:源 MAC 为自己 PC2 的 MAC 地址,目的 MAC 为广播 MAC
ARP 报文:Sender IP 和 Target IP 都为自己 PC2 的 IP 地址
Sender MAC 为自己 PC2 的 MAC 地址,Target MAC 为全 F
ARP 代理讲解
ARP 代理类型
代理 ARP 场景下,设备通过 ARP 请求获得的 MAC 地址为 ARP 代理设备的 MAC 地址(不是目的 IP 对应的真实物理地址)
路由式 ARP 代理(常说的 ARP 代理就是此类型的)
应用场景
如果 ARP 请求是从一个网段的主机发往同一网段但不再同一物理网络上(被隔离)的主机,那么连接这两个网络的具有 ARP 代理功能的设备就会回应该 ARP 请求,这个过程称为 ARP 代理
即:需要互通的主机在路由器视角下为不同网段,但是主机两端都互相认为对方为同网段
代理设备代理回应 ARP 请求的条件
开启 ARP 代理功能
本地有去往目的 IP 的路由表
收到该 ARP 请求的接口与路由表下一跳不是同一个接口
Vlan 内 ARP 代理
应用场景
需要互通的主机处于相同网段,并属于相同 Vlan,但是 Vlan 内配置了端口隔离的场景
Vlan 间 ARP 代理 —— 后续在 Super-Vlan 讲解
应用场景
需要互通的主机处于相同网段,但是属于不同 Vlan 的场景(也就是 Super-Vlan 场景)
路由式 ARP 案例分析
场景介绍
PC9 ping PC10 的通信过程
PC9 和 PC10 不需要配置网关(因为对于这两台设备而言,其互访是同网段互访)
但是 AR1 认为 PC9 和 PC10 为不同网段
路由器没有开启 ARP 代理的情况(PC9 无法与 PC10 通信)
PC9 去访问 PC10,发现目的 IP 与自己为同一网段,此时查看 ARP 表项,发现没有关于此目的 IP 的 MAC 地址;
此时 PC9 发送的 ARP 请求广播到达 AR1 的 G0/0/0 口之后,无法送达到 G0/0/1 口(路由器不同接口为不同广播域);
此时 PC9 和 PC10 无法通信
路由器开启 ARP 代理的情况(PC9 与 PC10 可以通信)
第一阶段:PC9 学习到 PC10 的 MAC
PC9 去访问 PC10,发现目的 IP 与自己为同一网段,此时查看 ARP 表项,发现没有关于此目的 IP 的 MAC 地址;
PC9 发送的 ARP 请求广播到达 AR1 的 G0/0/0 口之后,AR1 发现接收此报文的接口开启了 ARP 代理,并且自己有关于该报文目的 IP 的路由,则此时 AR1 代替 PC10 向 PC9 发送 ARP 应答报文;PC9 收到该应答后建立关于 PC10-IP 地址的 ARP 映射;AR1 建立关于 PC9 的映射
具体信息
数据链路层:源 MAC 为 PC9 的 MAC 地址、目的 MAC 为广播全 F
ARP 层:Send-IP 为 PC9 的 IP 地址,Target-IP 为 PC10 的 IP 地址
Send-mac 为 PC9 的 MAC 地址,Target-mac 为全 0
具体信息
数据链路层:源 MAC 为 G0/0/0 的 MAC 地址、目的 MAC 为 PC9 的 MAC 地址
ARP 层:Send-IP 为 PC10 的 IP 地址,Target-IP 为 PC9 的 IP 地址
Send-mac 为 G/0/0 的 MAC 地址,Target-mac 为 PC9 的 MAC 地址
具体信息
IP:192.168.2.1 MAC:G0/0/0 的 MAC 地址
第二阶段:AR1 学习 PC10 的 MAC、PC10 学习到 AR1 的 MAC
虽然 PC 之间认为两者为同网段,但是 AR1 认为 PC9 和 PC10 为不同网段,当 PC9 和 PC10 进行交互时自身需要重新封装 MAC 地址,但是此时没有关于 PC10 的 MAC 地址映射;因此 AR1 需要通过自己的地址去请求 PC10 的 MAC 地址(向 PC10 发送 ARP 请求);
PC10 收到后建立关于 AR1-G0/0/1 地址的 ARP 映射,并回应 ARP 应答给 AR1;此时 AR1 建立关于 PC10 的映射
具体信息
数据链路层:源 MAC 为 G0/0/1 的 MAC 地址,目的 MAC 为全 FF
ARP 层:Send-IP 为 G0/0/1 的 IP 地址,Target-IP 为 PC10 的 IP 地址
Send-mac 为 G/0/1 的 MAC 地址,Target-mac 为全 0
具体信息
数据链路层:源 MAC 为 PC10 的 MAC 地址,目的 MAC 为 G0/0/1 的 MAC 地址
ARP 层:Send-IP 为 PC10 的 IP 地址,Target-IP 为 G0/0/1 的 IP 地址
Send-mac 为 PC10 的 MAC 地址,Target-mac 为 G/0/1 的 MAC 地址
具体信息
IP:192.168.2.254 MAC:G0/0/1 的 MAC 地址
第三阶段:PC10 学习到 PC9 的 MAC
在 AR1 去请求 PC10 的 MAC 地址的同时(即 PC9 建立 PC10 的 ARP 映射表后),PC9 就封装 ICMP 报文发送给 PC10;
当报文到达 AR1 后,AR1 发现目 MAC 为自己,并且目的 IP 存在于路由表中;于是 AR1 将此 PC9 传递过来的报文重新封装发给 PC10(AR1 通过第二阶段获得了 PC10 的 MAC)
#########################
PC10 收到 ICMP 报文后,需要进行回应;回应时 PC10 发现 PC9 为自己同网段地址,但是自身没有关于 PC9 的 ARP 映射,则此时 PC9 发送 ARP 请求报文
PC10 发送的 ARP 请求广播到达 AR1 的 G0/0/1 口之后,AR1 发现自己接收此报文的接口有关于该报文目的 IP 的路由,则此时 AR1 代替 PC9 向 PC10 发送 ARP 应答报文;
PC10 收到该应答后建立关于 PC9-IP 地址的 ARP 映射
具体信息
数据链路层:源 MAC 为 PC10 的 MAC 地址,目的 MAC 为全 F
ARP 层:Send-IP 为 PC10 的 IP 地址,Target-IP 为 PC9
Send-mac 为 PC10 的 MAC 地址,Target-mac 为全 0
具体信息
数据链路层:源 MAC 为 G0/0/1 的 MAC 地址、目的 MAC 为 PC10 的 MAC 地址
ARP 层:Send-IP 为 PC9 的 IP 地址,Target-IP 为 PC10 的 IP 地址
Send-mac 为 G/0/1 的 MAC 地址,Target-mac 为 PC10 的 MAC 地址
具体信息
IP:192.168.1.1 MAC:G0/0/1 的 MAC 地址
此时 PC9 和 PC10 就可以完成通信
ARP 攻击
ARP 欺骗攻击
ARP 协议的缺陷
1、设备不对收到的 ARP 请求检验,就将报文中相应的 MAC 地址和 IP 地址建立映射
2、设备发送 ARP 请求后,对于收到的 ARP 响应不做校验,将报文中相应的 MAC 地址和 IP 地址建立映射
3、设备发送 ARP 请求广播包,整个网络都收到该报文
针对 ARP 协议的缺陷诞生出 ARP 欺骗攻击
ARP 欺骗的目的(造成的影响)
信息监听与转发、信息拦截、信息篡改
ARP 欺骗的具体原理
1、ARP 伪造同网段其他主机(欺骗主机)
- 设备 1 去请求设备 2 的 MAC 地址,发送 ARP 广播,设备 3 伪造设备 2 的应答包发送给设备 1(伪造包的源 IP 为设备 2 的地址、源 MAC 为设备 3 的 MAC);此时设备 1 对应设备 2 IP 地址的 MAC 地址就是设备 3
- 但是如果此时设备 1 收到设备 2 发来的 ARP 应答包,就会更新 ARP 表项(此时 ARP 表项就变为正确的 ARP 表项了)
- 但是如果设备 3 一直发送伪造的 ARP 应答,就可以保证设备 1 的 ARP 表项关于设备 2 IP 地址对应的 MAC 大部分时间都是设备 2 的;此时设备 1 发送给设备 2 的消息都发送给了设备 3
2、ARP 伪造网关(欺骗网关)
- PC2 向 PC1 发送伪造的 ARP 应答(源 IP 为网关,MAC 地址为伪造设备),PC1 发给网关的数据就被 PC2 窃取,然后 PC2 将信息篡改发送给真正的网关
ARP 欺骗的解决方式
静态配置 ARP 表项
在交换机上做 IP 和 MAC 地址绑定(检验正确的数据包才可以通过)
划分 Vlan(只是减少 ARP 欺骗的范围)
ARP 泛洪攻击
发送大量 ARP 请求 / 应答报文,使得设备的 ARP 表溢出,CPU 负荷过重,造成设备难以响应正常服务(限制接口学习数量、静态配置 ARP 表项等)
ARP 中间人攻击
中间人攻击就是同时欺骗局域网内的主机和主机的网关(通过发送假的 ARP 报文将主机 / 用户的 IP 地址与自己的 MAC 绑定),使得主机和网关的数据都会发送给同一个攻击者, 进行信息的篡改和泄露
具体流程为:客户端数据包经过中间人,再由中间人转发给服务器
ARP 中间人攻击其实也就是利用 ARP 进行欺骗,所以也可以通过防范 ARP 欺骗的方法来防范 ARP 中间人攻击
via:
-
以太网与 ARP 协议详解 yundanfengqing_nuc 于 2017-05-03 15:54:31 发布
https://blog.csdn.net/yundanfengqing_nuc/article/details/71123748 -
ARP报文详解 - charseki - 博客园 posted @ 2020-11-06 13:55 charseki
https://www.cnblogs.com/chenshengkai/p/13936532.html -
ARP,这个隐匿在计网背后的男人 cxuan 2021-01-12 08:01
https://mp.weixin.qq.com/s/CrG5IXXiMHYXg45JxVmAZg -
计算机网络学习:分组转发和路由选择、ARP 协议-CSDN 博客
https://blog.csdn.net/Charzous/article/details/115676748 -
ARP 讲解(免费 ARP、ARP 代理、ARP 攻击)-CSDN 博客
https://blog.csdn.net/m0_49864110/article/details/131365376
– -
图解 ARP 协议-CSDN博客
https://blog.csdn.net/u013669912/article/details/143604710