数据链路层如以太网或令牌环网都有本身的寻址机制(经常为 48 bit 地址),这是使用数据链路的任何网络层都必须听从的,因此就须要将网络层使用的协议地址转换为数据链路层使用的硬件地址.
shell
地址解析,用于将协议地址转换为硬件地址,或者将硬件地址转换为协议地址.缓存
将协议地址转换为硬件地址的整个流程:服务器
首先查询内核 ARP 高速缓存表.网络
若表中已经存在,则直接从表中取出硬件地址.并发
不然广播 ARP 请求报文,而后等待回应.而后从收到的 ARP 应答报文中取出硬件地址.spa
通常状况下,当系统收到 ARP 请求或 ARP 应答报文时,都会将发送端的硬件地址,协议地址存放在 ARP 高速缓存中. 代理
不完整的表项,即只知道协议地址,殊不知道硬件地址的表项.如:code
地址 硬件地址 接口 10.223.0.1 (incomplete) wlan0 #这个就是不完整的表项.
硬件地址类型: 2 字节. /* 值为 1 表示以太网硬件地址 */ 协议地址类型: 2 字节. /* 值为 0x0800 表示 IP 层协议地址 */ 硬件地址长度: 1 字节. 协议地址长度: 1 字节. op: 2 字节 /* ARP 请求(值为1),ARP 应答(值为 2),RARP 请求(值为 3),RARP 应答(值为 4) */ 发送端硬件地址: 6 字节(由硬件地址长度字段决定,通常为 6 个字节) 发送端协议地址: 4 字节(由协议地址长度字段决定) 接收端硬件地址: 6 字节(由硬件地址长度字段决定) 接收端协议地址: 4 字节(由协议地址长度字段决定)
发送 ARP 请求报文接口
构建 ARP 请求报文:{1;0x8000;6;4;1;自身硬件地址;自身协议地址;0;接收端协议地址}; 广播该 ARP 请求报文; /* 此时请求获取'接收端协议地址'对应的硬件地址. */
接受到 ARP 请求报文时.路由
if(arp_rece.接收端协议地址 == 当前网络接口.协议地址){ arp_rece.接收端硬件地址=当前网络接口.硬件地址. op=2; /* arp 应答 */ swap(arp_rece.发送端硬件地址,arp_rece.接收端硬件地址); swap(arp_rece.发送端协议地址,arp_rece.接收端协议地址); 将 arp_rece 发送到请求方. }else 丢弃该 ARP 请求报文
当 ARP 请求是从一个物理网络 N 上的主机 A 发送到另外一个物理网络 M 上的主机 B,此时 ARP 请求报文只能在物理网络 N 内广播,不会被转发到物理网络 M 上,因此理论上不该该会收到回应的.
设 C 为连接 N,M 的路由器,若 C 被配置成 ARP 代理,则 C 在收到 ARP 请求报文后,会将自身的硬件地址填入并发送 ARP 应答报文.此时 M,N 能够共用一个子网号(通常状况下,一个子网号中只能容纳一个物理网络).整个过程以下:
因为 A,D 具备相同的子网号,因此此时 A 准备将 IP 数据包直接传送给 D.即 A 将 (D的协议地址,IP 数据包) 送往网络接口.
网络接口广播 ARP 请求分组请求获得 D 的硬件地址,此时帧的格式:
ff:ff:ff:ff:ff:ff;A 的硬件地址;ARP;1;0x8000;6;4;1;A 的硬件地址;A 的协议地址;0;D 的协议地址
3. 路由器 C 收到该 ARP 请求帧,而且 C 已经被配置成 ARP 代理,因此此时 C 用本身的硬件地址来回答,帧的格式:
A 的硬件地址;C 的硬件地址;ARP;1;0x8000;6;4;2;C 的硬件地址;D 的协议地址;A 的硬件地址;A 的协议地址
4. A 收到了'D 的硬件地址'(其实是 C 的硬件地址),此时构建数据帧发送 IP 数据包,帧格式:
C 的硬件地址;A 的硬件地址;IP;IP 数据包的内容....
此时在 A 上运行 arp 命令
A$ arp -n 地址 类型 硬件地址 标志 Mask 接口 10.201.1.62 ether 68:5d:43:f3:c3:e3 C eth0 10.201.1.100 ether f8:0f:41:58:63:fb C eth0 10.201.1.28 ether 18:9e:fc:7a:57:53 C eth0 10.201.1.254 ether 00:03:0f:12:c8:00 C eth0 10.201.1.107 ether f8:0f:41:58:63:fb C eth0 # f8:0f:41:58:63:fb 具备2个 IP 地址,因此能够推测出 f8:0f:41:58:63:fb 起着 ARP 代理的功能.
指主机发送 ARP 查找本身的IP地址,一般,它发生在系统引导期间进行接口配置的时候.此时 ARP 请求分组格式:
1;0x8000;6;4;1;主机的硬件地址;主机的协议地址;0;主机的协议地址. # 此时接收端协议地址 == 发送端协议地址.
免费 ARP 请求的用途:
一个主机能够经过它来肯定另外一个主机是否设置了相同的 IP 地址,若主机在发送免费 ARP 请求以后收到了 ARP 应答,则代表另外一个主机与当前主机设置了相同的 IP 地址.
用于更新其余主机高速缓存表中相应的表项
用于将硬件地址转换为协议地址.通常无盘机(没有硬盘的主机)在引导时会发送 RARP 请求报文来获取自身的 IP 地址.
RARP 分组格式与 ARP 分组格式相同.见上.
无盘主机广播 RARP 请求报文,此时 RARP 分组格式:
1;0x8000;6;4;3;自身硬件地址;0;0;0 # 注意 RARP 请求时,op==3
由 RARP 服务器负责 RARP 的响应,RARP 响应报文以单播的形式发送,此时 RARP 分组格式:
1;0x8000;6;4;4;RARP 服务器硬件地址;RARP 协议地址;无盘主机硬件地址;无盘主机协议地址