TCP/IP协议-地址解析协议
文章目录
[TOC]
ARP
当一台主机把以太网的数据帧发送到位于同一局域网上的另一台主机时,是根据48bit
的以太网地址来确定目的接口的,设备驱动程序从不检查IP
数据报中的目的地IP
地址。
地址解析为这两种不同的地址形式提供映射。 地址解析协议(Adress Resolution Protocol,ARP) 为IP
地址到对应的硬件地址之间提供动态映射。
ARP 高效运行的关键是由于每个主机都有一个
ARP
高速缓存,存放最近Internet
地址到硬件地址之间的映射记录。高速缓存从被创建起,每一项的生存时间一般为20
分钟。
示例
:
$ ftp bsdi # 执行 ftp 命令
-----------后台执行步骤如下---------------------------------------
1.应用程序 FTP 客户端调用函数`gethostbyname(3)`把主机名转换成 IP 地址。
这个转换过程使用`DNS`或在较小的网络使用一个静态的主机文件`/etc/hosts`。
2.FTP 用得到的 IP 地址请求 TCP 建立连接。
3.TCP 用 IP 地址发送一份数据报。
5.如果目的主机在本网络上,IP 数据报可直达目的主机;如果在远程网络上,
通过 IP 选路函数确定下一跳路由器地址,并让它转发数据报。
6.如果是以太网,则需要将 IP 地址变换成以太网地址。这就是 ARP 的功能。
7.ARP 发送一份 ARP请求的以太网数据帧(包括 IP 地址和主机名)给以太网上的每个主机,这个过程叫做广播。
8.目的地址主机 ARP 收到广播后,识别出发送端在寻问它的地址后,发送一个 ARP 应答(包含 IP 地址和硬件地址)。
9.发送 IP 数据报到目的主机。
接口都有一个
48bit
硬件地址,通常称呼其为MAC
地址。地址每个字节用十六进制数表示,每字节中间以:
隔开,共有2^48
个可能的MAC
地址。通过IEEE
统一分配使用,分配方式是固定一个MAC
地址的前24bit
,让公司自己为每个适配器生成后24bit
。
ARP 分组格式

源地址 和 目的地址 ,均占6
字节,其中目的地址值是全为1
的特殊地址表示广播地址。电缆上所有的以太网接口都要接收广播的数据帧。
帧类型 表示后面的数据类型。对于ARP
请求和应答来说,该字段值均为0x0806
。
硬件类型 表示硬件地址的类型,值为1
表示以太网地址。
协议类型 表示要映射的协议地址类型,值为0x0800
表示IP
地址。它的值与以太网数据帧中类型字段IP
数据报类型的值相同,这是有意设计的。
硬件地址长度 和 协议地址长度 ,单位为字节
,所以对于以太网上IP
地址的ARP
请求和应答来说,它们的值分别为 6
()和4
()。
操作字段(op) 总共有四种操作类型:
- 值为
1
,表示ARP
请求。 - 值为
2
,表示ARP
应答。 - 值为
3
,表示RARP
请求。 - 值为
4
,表示RARP
应答。
这个字段是必须的,因为ARP/RARP
的帧类型字段值是相同的。
最后四个字段有一些重复信息,如在以太网帧首部和ARP
请求数据帧中都有 发送端硬件地址 信息。
对于一个
ARP
请求来说,除 目的端硬件地址 外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP
请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2
,最后把它发送回去。
ARP 请求/应答
当一台主机bsdi
通过telnet
工具发送一个简单的请求时,ARP
的执行情况如下:
$ arp -a # 检查 ARP 高速缓存为空
$ telnet svr4 discard # 连接 svr4
Trying 140.252.13.34..
Connected to svr4.
Escape character is '^]'.
^] # 进入 telnet 命令行
telnet> quit # 退出 telnet
Connection closed.
-----------------------------------------------
# 在 telnet 目标系统执行 tcpdump 命令监控 ARP
$ tcpdump -e
1 0.0 0:0:c0:6f:2d:40 ff:ff:ff:ff:ff:ff arp 60
arp who-has svr4 tell bsdi
2. 0.002174 (0.0022) 0:0:c0:c2:9b:26 0:0:c0:6f:2d:40 arp 60
arp reply svr4 is-at 0:0:c0:c2:9b:26
3. ...省略
第1
行,源端主机bsdi
硬件地址0:0:c0:6f:2d:40
,目的地址表示为广播地址,电缆上所有的以太网接口都要接收这个数据帧并对它进行处理。
arp
说明此数据帧是一个ARP
请求或应答,所以帧类型字段值是0x0806
。
60
表示以太网数据帧长度,由于ARP
数据帧长度都是42
字节(帧头14
字节包括目的地址、源地址、类型字段,28
字节ARP
数据),因此,第一帧都必须加入填充字符以达到以太网60
字节的最小长度要求。
最小长度指
14
字节的以太网帧头(包括目的地址、源地址、长度),数据字段46
字节,不包括4
字节以太网帧尾。
arp who-has
表示ARP
请求的数据帧中,目的IP
地址是svr4
的地址,发送端IP
地址是bsdi
的地址。
第2
行,目的主机进行ARP
应答,其目的主机IP
是bsdi(0:0:c0:6f:2d:40)
,ARP
应答是直接发送到请求主机,而不是广播。
arp reply
表示应答svr4
的地址在0:0:c0:c2:9b:26
。
从第
2
行开始,每行在括号中都包含与上一行的时间差(单位:秒)。
如果查询的主机已关机或不存在时,情况如下:
$ telnet 140.252.13.36 # 连接无效 IP 地址
Trying 140.252.13.36...
telnet: Unable to connect remote host: Connection timed out.
$ arp -a # 检查 ARP 高速缓存
? (140.252.13.36) at (incomplete)
----------------------------------------------------------------
# 在另一系统执行 tcpdump 命令
$ tcpdump
1 0.0 arp who-has 140.252.13.36 tell bsdi
2 5.509069 (5.5091) arp who-has 140.252.13.36 tell bsdi
3 29.509745 (24.0007) arp who-has 140.252.13.36 tell bsdi
ARP
请求按照指定规则一直重发,直到时间超过TCP
请求设置的超时时间结束,通常为75
秒。
ARP 高速缓存超时设置
在ARP
高速缓存中的表项一般都要设置超时时间,通常对完整表项的超时时间设置为20
分钟,不完整的表项超时时间为3
分钟。上面telnet 140.252.13.36
示例中的表项就是不完整表项(incomplete
),即以太网上不存在的主机发出的的ARP
请求。
管理员可以通过
arp
命令把地址放入高速缓存中,而不设置超时时间。
Host Requirements RFC
表明,即使表项正在使用时超时值也应该启动,但是大多数从伯克利系统演变而来的系统没有这样做,它们在每次使用表项时重设超时时间。
ARP 代理
如果ARP
请求是从一个网络主机发往另一个网络主机,那么连接这两个网络的路由器就可以回答这个请求,这个过程称作 委托 ARP 或 ARP代理 。
ARP 代理 会让
ARP
请求发送端误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。
如下图,当子网140.252.1
上的主机gemini
将一份IP
数据报要传递给140.252.1.29
的sun
时,会发送ARP
请求给140.252.1.29
。路由器netb
识别出该IP
地址属于它的一个拨号主机,于是把它的以太网接口地址140.252.1
作为硬件地址来回答。
主机gemini
通过以太网发送IP
数据报到netb
,netb
通过拨号SLIP
将数据报转发到sun
。这个过程对所有140.252.1
子网上的主机都是透明的,主机sun
实际上是路由器netb
后面配置的。
# 在主机`gemini`上执行`arp -a`命令,经过与主机`sun`通信后,
# 发现同一个子网`140.252.1`上的`netb`和`sun`的 IP 地址映射的硬件地址是相同的。
# 这通常是使用 ARP 委托的线索。
$ arp -a
netb (140.252.1.183) at 0:80:ad:3:6a:80
sun (140.252.1.29) at 0:80:ad:3:6a:80

通过上图发现,
bsdi
和slip
之间分别有一个IP
,所以路由器netb
下方SLIP
链路显然缺少一个IP
地址,这是因为路由器不需要知道拨号SLIP
链路每一端的IP
地址(减少了IP
的使用)。通过分组到达的串行线路接口来确定发送分组的拨号主机,因此对于连接到路由器的每个拨号主机不需要用唯一的
IP
地址,所有拨号主机使用同一个IP
地址作为SLIP
链路的目的地址。通过
ifconfig
命令可以显示该拨号SLIP
链路的目的地址是140.252.1.183
。
免费 ARP
免费ARP(Gratuitous ARP) 包是一种特殊的ARP
请求,它并非期待得到IP
对应的MAC
地址,而是当主机启动的时候,发送一个Gratuitous ARP
请求,即请求自己的IP
地址的MAC
地址。
它与普通ARP
请求报文的区别在于报文中的目标IP
地址。普通ARP
报文中的目标IP
地址是其他主机的IP
地址,而免费ARP
的请求报文中,目标IP
地址是自己的IP
地址。
作用
:
- 用于检测
IP
地址冲突。当一台主机发送了免费ARP
请求报文后,如果收到了ARP
响应报文,则说明网络内已经存在使用该IP
地址的主机。 - 用于更新其他主机的 ARP 缓存表。当主机更换了网卡(接口卡),而其他主机的
ARP
缓存表仍然保留着原来的MAC
地址。这时,可以发送免费的ARP
数据包。其他主机收到该数据包后,将更新ARP
缓存表,将原来的MAC
地址替换为新的MAC
地址。
RARP
逆地址解析协议(Reverse Address Resolution Protocol,RARP),与ARP
作用相反,用于将MAC
地址通过读取ARP
缓存表获取其IP
地址。
具有本地磁盘的主机,一般通过磁盘上配置文件读取IP
地址,但是无盘主机(如X终端或无盘工作站)则需要通过其他方法来获取IP
地址。
网络上每个系统都具有唯一的硬件地址,它由网络接口生产厂商配置,无盘系统就可以从接口网卡读取硬件地址,再通过RARP
协议获取IP
地址。
RARP 分组格式
与ARP
分组格式基本一致,主要区别是RARP
请求/应答帧类型是0x8035
,请求操作代码是3
,应答操作代码是4
。
RARP
请求以广播方式传送,而RARP
的应答一般是单播传送。
工作原理
- 发送主机发送一个本地
RARP
广播,声明自己的MAC
地址并请求任何收到该请求的RARP
服务器分配一个IP
地址; - 本地网段上的
RARP
服务器收到此请求后,检查其RARP
列表中MAC
地址对应的IP
地址; - 如果存在,
RARP
服务器给源主机发送一个响应数据包并将该IP
地址提供给对方主机使用; - 如果不存在,
RARP
服务器对此不做任何响应; - 源主机收到
RARP
服务器响应信息,就可利用得到IP
地址进行通信;如果一直没收到RARP
服务器响应,则表示初始化失败。
RARP 服务器设计
RARP
在原理上很简单但是实现比较复杂,由于RARP
的请求是在硬件层上的广播,因此不能通过路由器进行转发。为了让无盘系统在RARP
关机的状态下也能引导,通常在每个网络上都要实现多个RARP
服务器,服务器数量增加,网络流量也随之增加。
发送RARP
请求的无盘系统一般采用最先收到的RARP
应答(ARP
没有这种情况,因为只有一台主机发送ARP
应答),另外在同一网络中不同主机可能会同时进行RARP
应答,这样增加了以太网发生冲突的概率。
RARP
服务器一般要为多个主机提供硬件地址到IP
地址的映射,该映射包含在一个磁盘文件中(Uinx
系统一般位于/etc/ethers
目录中)。由于内核一般不读取和分析磁盘文件,因此RARP
服务器的功能就由用户进程来提供,而不是作为内核的TCP/IP
实现的一部分。更为复杂的是,
RARP
请求是作为一个特殊类型的以太网帧类型(0x8035
)来传送,这说明RARP
服务器必须能够发送和接收这种类型的以太网数据帧。由于发送和接收这些数据帧与系统有关,因此RARP
服务器的实现是与系统捆绑在一起的。