TCP/IP详解04-链路层:ARP和RARP
1. ARP
还记得数据链路层的以太网的协议中,每一个数据包都有一个MAC地址头么?我们知道每一块以太网卡都有一个MAC地址,这个地址是唯一的,那么IP包是如何知道这个MAC地址的?这就是ARP协议的工作。
数据链路如以太网或令牌环网是根据 48 bit的以太网地址来确定目的接口的,网络层中使用 32 bit的 IP 地址,ARP 为 IP 地址到对应的硬件地址之间提供动态映射。
ARP(地址解析)协议是一种解析协议,本来主机是完全不知道这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(就是一个IP-MAC地址对应表缓存),如果查询的IP-MAC值对不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机,而广播主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。
1.1 ARP的分组格式
在以太网上解析 IP 地址时,ARP 请求和应答分组的格式如下图所示(ARP可以用于其他类型的网络,可以解析 IP 地址以外的地址。)
- 以太网的源地址和目的地址:目的地址为全 1 的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。
- 以太网帧类型:表示后面数据的类型。对于 ARP 请求或应答来说,该字段的值为0x0806。
- 硬件类型字段表示硬件地址的类型。它的值为 1即表示以太网地址。
- 协议类型字段表示要映射的协议地址类型。它的值为 0x0800 即表示 IP 地址。它的值与包含 IP 数据报的以太网数据帧中的类型字段的值相同,这是有意设计的。
- 硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上 IP 地址的 ARP 请求或应答来说,它们的值分别为 6 和 4。
- 操作字段指出四种操作类型,它们是 ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和 RARP 应答(值为4)。
- 接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(IP地址)、目的端的硬件地址和目的端的协议地址。
1.2 ARP高速缓存
ARP 高效运行的关键是由于每个主机上都有一个 ARP 高速缓存。这个高速缓存存放了最近 Internet 地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为 20分钟,起始时间从被创建时开始算起。
可以用arp(8)命令来检查ARP高速缓存:
root@10.3.1.11:/data/lincoln# arp
Address HWtype HWaddress Flags Mask Iface
10.3.1.16 ether 00:00:5e:00:01:84 C bond1
10.3.1.15 ether 00:00:5e:00:01:84 C bond1
10.3.1.13 ether 00:00:5e:00:01:84 C bond1
10.3.1.22 ether 00:00:5e:00:01:84 C bond1
10.3.1.19 ether 00:00:5e:00:01:84 C bond1
10.3.1.12 ether 00:00:5e:00:01:84 C bond1
gateway ether 00:00:5e:00:01:84 C bond1
10.3.1.10 ether 00:00:5e:00:01:84 C bond1
10.3.1.23 ether 00:00:5e:00:01:84 C bond1
1.3 特殊的功能
ARP代理
如果 ARP 请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托 ARP 或 ARP代理(Proxy ARP)。这样可以欺骗发起 ARP 请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。
免费ARP
另一个 ARP 特性称作免费ARP (gratuitous ARP)。它是指主机发送 ARP 查找自己的IP地址。通常,它发生在系统引导期间进行接口配置的时候。
免费ARP可以有两个方面的作用:
- 1) 一个主机可以通过它来确定另一个主机是否设置了相同的 IP 地址。
- 2)更新同一网段内其他们主机保存的该请求IP的ARP缓存(当我们的主机正好改变了硬件地址的时候可以这样做)。
2. RARP
具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址,而对于无盘机,则需要用RARP来获取IP地址。
无盘系统的RARP的实现为从接口卡上读取硬件地址,然后发送RARP请求,最后RARP服务器在应答中返回该地址对应的IP.
2.1 RARP的分组格式
RARP 分组的格式与 ARP 分组基本一致。它们之间主要的差别是 RARP 请求或 应答的帧类型代码为 0x8035,而且 RARP 请求的操作代码为3,应答操作代码为4。对应于ARP,RARP请求以广播方式传送,而 RARP应答一般是单播(unicast)传送的。
2.2 RARP服务器的设计
虽然R A R P在概念上很简单,但是一个 R A R P服务器的设计与系统相关而且比较复杂。总要带来以下来个问题:
作为用户进程的RARP服务器
RARP 服务器提供硬件地址到 IP 地址的映射,该映射包含在磁盘文件中。内核一般不读取磁盘文件,因此 RARP 服务器由用户进程来实现,而不能作为内核的TCP/IP来实现。
RARP请求是作为一个特殊类型的以太网数据帧来传送的(帧类型字段值 为0x8035)。这说明RARP服务器必须能够发送和接收这种类型的以太网数据帧。 由于发送和接收这些数据帧与系统有关,因此 RARP服务器的实现是与系统捆绑在一起的。
每个网络有多个RARP服务器
RARP 请求是在硬件层上进行广播的(使用链路层广播)。这意味着它们不经过路由器进行转发。为了让无盘系统在RARP服务器关机的状态下也能引导,通常在一个网络上(例如一根电缆)要提供多个 RARP服务器。