网络网络层之(2)ARP协议
Author:Once Day Date: 2024年4月1日
漫漫长路,有人对你笑过嘛…
全系列文档可参考专栏:通信网络技术_Once-Day的博客-CSDN博客。
参考文档:
- 《TCP/IP详解卷一》
- arp(8) - Linux manual page (man7.org)
- 彻底搞懂系列之:ARP协议 - 知乎 (zhihu.com)
- RFC 826: An Ethernet Address Resolution Protocol: Or Converting Network Protocol Addresses to 48.bit Ethernet Address for Transmission on Ethernet Hardware (rfc-editor.org)
- Linux 命令(199)—— arp 命令 - 腾讯云开发者社区-腾讯云 (tencent.com)
文章目录
- 网络网络层之(2)ARP协议
- 1.概述
- 1.1 介绍
- 1.2 常见实现
- 1.3 相关RFC文档
- 2.ARP帧格式
- 2.2 免费ARP
- 2.3 ARP代理
- 2.4 ARP欺骗和攻击
- 3. RARP协议
- 3.1 介绍
- 3.2 分组格式
- 3.3 RARP服务器
1.概述
1.1 介绍
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议,负责将IP地址映射为物理地址.
通常所说的以太网的网卡是不识别IP地址的,而是通过识别MAC地址来判断该帧是否是给本机的。因此就需要提供一个机制根据目的主机的IP翻译出它的MAC地址。
注意:像点对点链路(如PPP协议)是不需要MAC,也就不需要地址解析协议。
历史上还有一个RARP协议 ,即逆地址解析协议,根据MAC解析出IP地址,现在已有DHCP协议代替。
主要的关注的几点如下:
-
每台主机都一个高速缓存ARP cache,里面有本局域网上各主机和路由的IP地址到硬件地址的映射表。
-
如果在高速缓存里找不到对应IP,则发送ARP请求。
-
ARP是本地局域网广播分组,包含本机IP、MAC以及目的IP。
-
接收者从该请求报文中提取出源主机的IP地址和物理地址的绑定,更新自己的ARP缓冲 。
-
对应IP的接收者发回ARP应答报文给请求者,包含IP和MAC,是单播分组。
-
高速缓存有一段生存时间,失效后将重新发送ARP请求。
ARP仅用于IPv4,IPv6使用邻居发现协议,被合并进了ICMPv6协议。
ARP在正常情况下,仅适用于广播网络,在非广播网络上,需要复杂的映射协议支持才行。
1.2 常见实现
主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;
网络设备一般都有一个ARP缓存(ARP Cache),ARP缓存用来存放IP地址和MAC地址的关联信息。在发送数据前,设备会先查找ARP缓存表。如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去。
如果缓存表中不存在相应的信息,则通过发送ARP request报文来获得它。学习到的IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间。
在有效期内,设备可以直接从这个表中查找目的MAC地址来进行数据封装,而无需进行ARP查询。过了这段有效期,ARP表现会被自动删除。如果目标设备位于其他网络则源设备会在ARP缓存表中查找网关的MAC地址,然后将数据发送给网关,网关再把数据转发给目的设备。
ARP表项又分为动态ARP表项和静态ARP表项。
- 动态ARP表项由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖。
- 静态ARP表项通过手工配置和维护,不会被老化,不会被动态ARP表项覆盖。直到重新启动计算机为止。配置静态ARP表项可以增加通信的安全性。静态ARP表项可以限制和指定IP地址的设备通信时只使用指定的MAC地址,此时攻击报文无法修改此表项的IP地址和MAC地址的映射关系,从而保护了本设备和指定设备间的正常通信。
Unix系统一般使用冒号分割MAC地址,而IEEE标准和其他操作系统倾向于使用短杆分割,如下:
Unix风格 --> 00:11:22:33:44:55
IEEE风格 --> 00-11-22-33-44-55
RFC1122文档建议最大发送频率是每秒一次,不同IP层协议的值不一样,比如ICMP和UDP,通常为5秒,TCP协议为10秒。
1.3 相关RFC文档
(1) RFC 826: An Ethernet Address Resolution Protocol: Or Converting Network Protocol Addresses to 48.bit Ethernet Address for Transmission on Ethernet Hardware (rfc-editor.org)
RFC 826定义了地址解析协议(ARP),用于将网络层协议地址(如IP地址)动态转换为链路层地址(如以太网的MAC地址),以便在以太网硬件上进行数据传输。
(2) RFC 903: A Reverse Address Resolution Protocol (rfc-editor.org)
RFC 903描述了一种协议,允许网络主机在只知道其硬件地址(如物理网络地址)的情况下,动态发现其协议地址(如IP地址),特别适用于无盘工作站等设备在启动时获取其网络协议地址。
(3) RFC 1027: Using ARP to implement transparent subnet gateways (rfc-editor.org)
RFC 1027详细描述了如何使用以太网地址解析协议(ARP)来实现透明子网网关,允许连接的子网上的主机在不知情的情况下进行通信,主要采用了“代理ARP”技术。
(4) RFC 1122: Requirements for Internet Hosts - Communication Layers (rfc-editor.org)
RFC 1122是一份重要的文档,它详细定义了互联网主机在通信协议层的要求,特别是链路层、IP层和传输层。这份文档与其配套文档RFC 1123一起,为互联网主机软件的实现提供了全面的指导和要求。
(5) RFC 2332: NBMA Next Hop Resolution Protocol (NHRP) (rfc-editor.org)
RFC 2332定义了NHRP协议的标准实现,该协议用于在NBMA网络中进行有效的下一跳解析,以支持多协议互联网层通信。
(6) RFC 5227: IPv4 Address Conflict Detection (rfc-editor.org)
RFC 5227定义了IPv4地址冲突检测机制,通过发送ARP探测和通告数据包来预防和识别同一网络上的两个主机使用相同IP地址的情况,并提供了解决冲突的指导。
(7) RFC 5494: IANA Allocation Guidelines for the Address Resolution Protocol (ARP) (rfc-editor.org)
RFC 5494定义了用于地址解析协议(ARP)的IANA分配指南,包括硬件地址空间、协议地址空间和操作码的分配规则,并为实验目的预留了一些数值。
2.ARP帧格式
目的地址、源地址、长度/类型等字段是以太网头部,这部分和其他以太网帧保持一致。可参考以下文档:
- 网络之以太网_ Once_day的博客-CSDN博客
下面看一个实际的ARP包(使用WireShark软件抓包):
可以看到,对于request
请求,目的MAC地址是ff:ff:ff:ff:ff:ff
,表示广播地址,在同一广播域的所有以太网口都可以接收这些帧。对于ARP请求和应答,长度/类型字段值必须为0x0806
。
数据部分存储的就是ARP请求或者应答消息了:
-
硬件类型:即硬件地址的类型,可参考Linux内核源码
include/uapi/linux/if_arp.h
. -
协议类型:指出映射的协议地址类型,可参考Linux内核源码
include/uapi/linux/if_ether.h Line:41
-
硬件/协议大小:指出硬件地址和协议地址的字节数。
-
操作类型(Opcode):指出操作的类型,如下:
#define ARPOP_REQUEST 1 /* ARP request */ #define ARPOP_REPLY 2 /* ARP reply */ #define ARPOP_RREQUEST 3 /* RARP request */ #define ARPOP_RREPLY 4 /* RARP reply */ #define ARPOP_InREQUEST 8 /* InARP request */ #define ARPOP_InREPLY 9 /* InARP reply */ #define ARPOP_NAK 10 /* (ATM)ARP NAK */
后面紧跟着的就是发送方/接收方的硬件地址+协议地址。常见的以太网+IP协议,ARP包大小为42 Bytes。
ARP请求最大频率最好不要超过1秒1个,并且根据不同协议可以进一步降低请求频率。
2.2 免费ARP
免费 ARP(Gratuitous ARP)包是一种特殊的ARP请求,一台主机发送ARP请求以获取自己的地址。
免费ARP报文与普通ARP请求报文的区别在于报文中的目标IP地址。普通ARP报文中的目标IP地址是其他主机的IP地址;而免费ARP的请求报文中,目标IP地址是自己的IP地址。
有两个作用:
- 确定是否有其他主机配置了相同的IPv4地址。
- 更新其他主机上的ARP缓存。
在RFC
中描述了一种**IPv4地址冲突检测(ACD)**机制,可用来检测IPv4地址冲突情况。
ACD定义了两种ARP分组:
- ARP探测分组,是一个ARP请求,其中发送方协议地址被设置为0,目的协议地址为候选IPv4地址。
- ARP通告分组,发送方协议地址和目的地址都为候选IPv4地址。
2.3 ARP代理
当局域网内部主机发起跨网段的ARP请求时,出口路由器/网关设备将自身MAC地址回复该请求时,这个过程称为代理ARP,也被称为混杂ARP(Promiscuous ARP)。
如上图所示,PC1和PC2位于两个网段,PC1发送ARP请求PC2的硬件地址,此时Router回复该ARP请求,并且将MAC地址填为自身地址,然后将PC1发给PC2的数据包再转发给PC2。
PC1和PC2看起来互相隐身,可以屏蔽复杂网络拓扑。
2.4 ARP欺骗和攻击
ARP的解析是依赖于主机内部的高速缓存,如果恶意主机发送ARP应答或者免费ARP等,那么就会返回一个错误的MAC地址,从而导致数据报文发送到错误主机上。
黑客向对方计算机不断发送有欺诈性质的ARP数据包,数据包内包含有与当前设备重复的Mac地址,使对方在回应报文时,由于简单的地址重复错误而导致不能进行正常的网络通信,或者如果不及时处理,便会造成网络通道阻塞、网络设备的承载过重、网络的通讯质量不佳等情况。
3. RARP协议
3.1 介绍
在计算机网络的世界里,RARP(Reverse Address Resolution Protocol,反向地址解析协议)曾是一个重要的网络协议,它的主要作用是允许物理机在局域网内的网络活动开始时,通过其物理地址(MAC地址)来查询网络地址(比如IPv4地址)。这个过程有点像在一个大型的公司楼里寻找某个人的办公室,知道这个人的名字(物理地址),但是需要查找他的办公室号码(网络地址)。
RARP的工作机制比较简单:当一个网络设备(通常是无盘系统)启动时,它知道自己的物理地址,但不知道自己的IP地址。它会在局域网内广播一个RARP请求,请求中包含它的物理地址。网络中的RARP服务器收到请求后,会查找相应的表项,找到与物理地址对应的IP地址,并将这个信息发送回请求的设备。这样,设备就获得了自己的IP地址,可以进一步与网络中的其他设备进行通信。
然而,随着技术的发展,RARP协议逐渐被一个更加强大的协议取代了,这个协议就是DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)。DHCP不仅可以提供IP地址,还能配置子网掩码、默认网关、DNS服务器地址等信息,使得网络设备的配置更加自动化和智能化。
尽管RARP现在已经不太常用了,但它在历史上的作用不容忽视。它是网络启动和自动配置过程中的一个关键步骤,是那个网络技术发展初期的一个重要创新。在一些特定的旧系统或者遗留设备中,可能还会遇到RARP协议的身影,但在现代网络架构中,它已经基本被更先进的技术所替代。在网络协议的长河中,RARP像是一块垫脚石,帮助我们跨向了自动化网络配置的新纪元。
3.2 分组格式
RARP分组的格式与ARP分组基本一致。它们之间主要的差别是RARP请求或应答的帧类型代码为0x8035,而且RARP请求的操作代码为3,应答操作代码为4。
和ARP一样,RARP请求以广播方式传送,而RARP应答一般是单播(unicast)传送的。
3.3 RARP服务器
在过去,RARP服务器通常是网络中的一台计算机,它会运行RARP服务软件。这台服务器负责响应来自客户端的RARP请求,并为它们提供所需的网络地址信息。RARP服务器内部维护一个表格,这个表格将每个物理地址(MAC地址)映射到一个IP地址。当服务器接收到一个广播的RARP请求时,它会查询这个表,找到与请求中的物理地址对应的IP地址,然后将这个信息封装在RARP响应中返回给请求者。
通常,这个映射表是由网络管理员手动维护的。在网络规模较小,设备较少时,这种方法是可行的。但随着网络规模的增大,手动维护映射表变得越来越不现实,这也是RARP的一个局限性。这种方式要求网络管理员对网络中的每个设备都有详细的记录,并且每当有设备变动时,都需要更新映射表,这对于管理者来说是一项繁重的工作。
另外,RARP的一个局限性是它只能提供IP地址,而不能像DHCP那样提供其他网络配置信息,如子网掩码、默认网关和DNS服务器地址等。这意味着网络中的设备需要通过其他方式来获取这些额外的配置信息,这降低了网络配置的自动化程度。
还有,RARP协议本身不具备跨越不同网络的能力,这意味着每个局域网都需要单独的RARP服务器。在大规模网络中,这会导致大量的资源投入和管理复杂性。
和ARP协议不同,RARP无法集成到内核中(需要读取磁盘文件,通常都由用户空间实现),但ARP通常可以作为TCP/IP栈的一个组成部分。当每个网络有多个RARP服务器时,受限于广播报文形式,会存在多个回复应答,增加以太网发生冲突的概率。