链路层通信根据48bit
以太网地址(硬件地址)来确定目的接口,而地址解析协议负责32bit
IP
地址与48bit
以太网地址之间的映射:
- (1)
ARP
负责将IP
地址映射到对应的硬件地址 - (2)
RARP
负责相反的过程,通常用于无盘系统。
ARP
高效运行的关键是每台主机上都有一个ARP
高速缓存,缓存中每一项的生存时间一般为20分钟,但不完整表项超时时间一般为3分钟(如192.168.13.254)。
# arp -a
? (192.168.0.16) at 00:1b:21:b9:9f:d4 [ether] on eth0
? (192.168.0.6) at 00:1b:21:b9:9f:d4 [ether] on eth0
? (192.168.13.233) at 00:16:3e:01:7a:b2 [ether] on eth0
? (192.168.13.254) at <incomplete> on eth0
可以通过arp
命令来操作ARP高速缓存:
arp
显示当前的ARP
缓存列表。arp -s ip mac
添加静态ARP记录,如果需要永久保存,应该编辑/etc/ethers
文件。arp -f
使/etc/ethers
中的静态ARP记录生效。
其中:
ARP
协议的帧类型为0x0806
- 硬件类型:1表示以太网地址
- 协议类型:
0x800
表示IP
协议 - 硬件地址长度:值为6
- 协议地址长度:值为4
op
:1为ARP
请求,2为ARP
应答,3为RARP
请求,4为RARP
应答- 对于
ARP
请求来说,目的端硬件地址为广播地址FF:FF:FF:FF:FF:FF
),由ARP
相应的主机填入。
一个完整ARP请求应答的抓包:
# tcpdump -e -p arp -n -vv
21:08:10.329163 00:16:3e:01:79:43 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.14.23 tell 192.168.13.43, length 28
21:08:10.329626 00:16:3e:01:7b:17 > 00:16:3e:01:79:43, ethertype ARP (0x0806), length 60: Ethernet (len 6), IPv4 (len 4), Reply 192.168.14.23 is-at 00:16:3e:01:7b:17, length 46
当向位于不同网络的主机发送ARP
请求时,由两个网络之间的路由器响应该ARP
请求,这个过程称为ARP
代理。
ARP
代理也称为混合ARP
:通过两个网络之间的路由器可以互相隐藏物理网络。
主机发送ARP
请求查找自己的IP地址。通常有两个用途:
- (1)确认网络中是否有其他主机设置了相同的
IP
地址; - (2)当主机的物理地址改变了,可以通过免费
ARP
更新更新路由器和其他主机中的高速缓存。
RARP
通常用于无盘系统,无盘系统从物理网卡上读到硬件地址后,发送一个RARP
请求查询自己的IP
地址。RARP
的协议格式:与ARP
协议一致,只不过帧类型代码为0x8035
RARP
使用链路层广播,这样阻止了大多数路由器转发ARAP
请求,只返回很小的信息,即IP
地址。