TCP/IP 协议详解 第4章 ARP:地址解析协议

ARP:地址解析协议,是一个基础协议,它的允许对于应用程序和系统管理员一般是透明的。

引言

当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48bit 的以太网地址来确定目的接口的。设备驱动程序从不检查IP数据报中的目的IP地址。

地址解析为 32bit 的IP地址和数据链路层使用的任何类型的地址 提供映射。ARP为IP地址到对应的硬件地址之间提供动态映射。

ARP在TCP/IP协议族中的位置

apr-in-tcpip

ARP背后的一个基本概念是网络接口有一个硬件地址。在硬件层次上进行的数据帧交换必须有正确的接口地址。知道主机的IP地址并不能让内核发送一帧数据给主机,内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。

ARP 高速缓存

ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存,这个缓存存放了最近的IP地址到硬件地址之间的映射关系,缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始。

ARP的分组格式

ARP请求和应答分组的格式:
arp-frame

  • 前两个字段是以太网的源地址和目的地址。目的地址为全 1 的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。
  • 两个字节长的以太网帧类型表示后面数据的类型。对于ARP请求或应答来说,该字段的值为 0x0806。
  • 硬件类型字段表示硬件地址的类型,值为1即表示以太网地址。协议类型字段表示要映射的协议地址类型,值为 0x0800 表示IP地址。
  • 硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为 6 或 4。
  • 操作字段指出四种操作类型: ARP请求:1;ARP应答:2;RARP请求:3;RARP应答:4。这个字段必须,因为ARP请求和ARP应答的帧类型字段值是相同的。

对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把应尽地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去。

ARP 代理

如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或ARP代理(Proxy ARP)。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。

免费ARP

免费ARP(gratuitous ARP),它是指主机发送ARP查找自己的IP地址,通常发生在系统引导期间进行接口配置的时候。

对于免费ARP请求中的各字段来说,发送端的协议地址和目的端的协议地址是一致的。

免费ARP一两个作用:

  • 一个主机可以通过它来确定另一个主机是否设置了相同的IP地址。
  • 如果发送免费ARP的主机正好改变了硬件地址,那么这个分组就可以使其他主机告诉缓存中旧的硬件地址进行相应的更新。

ARP命令

ARP -a [inet_addr] [-N if_addr] [-v]

  -a            通过询问当前协议数据,显示当前 ARP 项。
                如果指定 inet_addr,则只显示指定计算机
                的 IP 地址和物理地址。如果不止一个网络
                接口使用 ARP,则显示每个 ARP 表的项。
  -g            与 -a 相同。
  -v            在详细模式下显示当前 ARP 项。所有无效项
                和环回接口上的项都将显示。
  inet_addr     指定 Internet 地址。
  -N if_addr    显示 if_addr 指定的网络接口的 ARP 项。
  -d            删除 inet_addr 指定的主机。inet_addr 可
                以是通配符 *,以删除所有主机。
  -s            添加主机并且将 Internet 地址 inet_addr
                与物理地址 eth_addr 相关联。物理地址是用
                连字符分隔的 6 个十六进制字节。该项是永久的。
  eth_addr      指定物理地址。
  if_addr       如果存在,此项指定地址转换表应修改的接口
                的 Internet 地址。如果不存在,则使用第一
                个适用的接口。
示例:
  > arp -s 157.55.85.212   00-aa-00-62-c6-09.... 添加静态项。
  > arp -a                                  .... 显示 ARP 表。

欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据