2013-08-23 20:00:18
- 第4章 ARP:地址解析协议
- 4.1 引言
ARP(Address Resolution Protocol,地址解析协议)是获取物理地址的一个TCP/IP协议。物理地址就是我们通常说的MAC地址。当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。设备驱动程序从不检验IP数据报中的目的IP地址。地址解析为这两种不同的地址形式提供映射:32bit的IP地址和数据链路层使用的任何类型的地址。ARP为IP地址到对应的硬件地址之间提供动态映射。我们之所以用动态这个词是因为这个过程是动态完成的,一般应用程序用户或系统管理员不必关心。
RARP(Reverse Address Resolution Protocol,反向地址转换协议)是被那些没有磁盘驱动器的系统使用(一般是无盘工作站或X终端),它需要系统管理员进行手工设置。我们在下一章进行讨论。
- 4.2 一个例子
上图是一个基本完整的通信过程,主要为了解释ARP的工作步骤。书上用
% ftp bsdi
这个命令作为示范,意思是向bsdi主机请求ftp协议链接。工作过程如下:
1. 应用程序FTP客户端调用函数gethostbyname(3)把主机名(bsdi)转换成32bit的IP地址。这个函数在DNS(域名系统)中称作解析器,我们将在第14章对它进行介绍。这个转换过程或者使用DNS,或者在较小网络中使用一个静态的主机文件(/etc/hosts) |
2. FTP客户端请求TCP用得到的IP地址建立链接 |
3. TCP用上一步得来的IP地址发送一份IP数据报给网络层 |
4. 如果主机在本地网络上(如以太网、令牌环网或点对点链接的另一端),那么IP数据报可以直接送到目的主机上。如果目的主机在一个远程网络上,那么就通过IP选路函数来确定位于本地网络上的下一站路由器地址,并让它转发IP数据报。在这两种情况下,IP数据报都是被送到位于本地网络上的一台主机或路由器 |
5. 假定目的IP是另一个以太网,那么发送端主机必须把32bit的IP地址转换成48bit的以太网地址。从逻辑Internet地址到对应的物理硬件地址需要进行翻译。这就是ARP的功能 |
6. ARP发送一份称为ARP请求的以太网数据帧给以太网上的每个主机。这个过程称作广播,如图中的虚线所示。ARP请求数据帧中包含目的主机的IP地址(主机名为bsdi),其意思是“如果你是这个IP地址的拥有者,请回答你的硬件地址。” |
7. 目的主机的ARP层收到这份广播报文后,识别出这是发送端在询问它的IP地址,于是发送一个ARP应答。这个ARP应答包含IP地址及对应的硬件地址 |
8. 收到ARP应答后,使ARP进行请求——应答交换的IP数据报现在就可以传送了 |
9. 发送IP数据报到目的主机 |
IP地址与MAC地址
一台计算机想要接入到网络中,必须要有两个地址。一个是网卡的地址,也就是MAC地址。在以太网中,我们通过 MAC地址来进行数据传送和数据交换。在以太网环境中,数据会分帧传送,每一个数据帧都会包含自己的MAC和目的MAC地址信息; 另外一个地址是平时所说的IP地址,定义在网络层,每一台网络计算机都会有一个或者多个IP地址,这是一个虚拟的数据,并且可以随时更改。在硬件层次上进行的数据帧交换必须有正确的接口地址。但是,TCP/IP有自己的地址:32bit的IP地址。知道主机的IP地址并不能让内核发送一帧数据给主机。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。ARP的功能是在32bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。点对点链路不使用ARP。当设置这些链路时(一般在引导过程进行),必须告知内核链路每一端的IP地址。像以太网地址这样的硬件地址并不涉及。
IP地址和MAC地址是同时使用的,在数据传送过程中,一个完整的TCP/IP包需要由以太网进行数据封装,数据分帧,最后再通过物理层传输到目标计算机。在以太网封装上层的TCP/IP包的时候,它需要知道源MAC地址和目的MAC地址,但是我们只能给出一个对方的IP地址,这个时候就需要一个协议来支持IP到MAC的转换,这就是ARP, Address Resolution Protocol。ARP协议是介乎于网络层和数据链路层的一个协议。第一次传送某个目的IP地址的数据的时候,先会发出一个ARP包,其MAC的目标地址是广播地址,里面说到:"谁是xxx.xxx.xxx.xxx这个IP地址的主人?"因为是广播包,所有这个局域网的主机都收到了这个ARP请求。
收到请求的主机将这个IP地址和自己的相比较,如果不相同就不予理会,如果相同就发出ARP响应包。这个IP地址的主机收到这个ARP请求包后回复的ARP响应里说到:"我是这个IP地址的主人"。这个包里面就包括了他的MAC地址。以后的给这个IP地址的帧的目标MAC地址就被确定了。其它的协议如IPX/SPX也有相应的协议完成这些操作。
IP地址和MAC地址之间的关联关系保存在主机系统里面,叫做ARP表,由驱动程序和操作系统完成。在Microsoft的系统里面可以用arp -a的命令查看ARP表。
Q:我们为什么一定要MAC进行通信,只有IP地址不可以吗?
A:首先,在硬件层次上进行的数据帧交换必须有正确的接口地址!这个接口地址不可以是抽象的、可以随便更改的、供网络层使用的IP地址。我们需要一个在工厂制作时就烧在网卡上的固定的物理地址。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。
- 4.3 ARP高速缓存
ARP运行的关键是由于每个主机上都有一个ARP高速缓存。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速缓存中的每一项的生存时间一般为20分钟,起始时间从被创建开始算起。可以用下面命令查看ARP高速缓存。
raphael@raphael-Aspire-5741G:~$ arp -a
- 4.4 ARP的分组格式
上图为ARP请求和应答分组的格式(ARP可以用于其他类型的网络,可以解析IP地址以外的地址。紧跟着帧类型字段的前四个字段指定了最后四个字段的类型和长度)。
以太网首部(跟后面是脱离开的,不仅仅在ARP上有) | 6字节以太网目的地址 | 这里是下一跳的地址(目的路由器/主机的地址)。如果全为1表示广播地址,则电缆上的所有以太网接口都要接收广播的数据帧 |
6字节以太网源地址 | 发送端的以太网物理地址 | |
2字节帧类型 | 表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806 | |
28字节ARP请求/应答 | 2字节硬件类型 | 表示硬件地址的类型。1表示以太网地址 |
2字节协议类型 | 表示要映射的协议地址类型。0x0800表示IP地址。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同,这是有意设计的(回顾图2-1,在下面) | |
1字节硬件地址长度 | 对于ARP协议来说值为6(MAC地址) | |
1字节协议地址长度 | 对于ARP协议来说值为4(IP地址) | |
2字节操作字段 | 指出4种操作类型,它们是ARP请求(值为1),ARP应答(值为2),RARP请求(值为3),RARP应答(值为4)。这个字段是必需的,因为ARP请求和ARP应答的帧类型字段值是相同的 | |
6字节发送端以太网地址 | 不解释了。这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址 | |
4字节发送端IP地址(协议地址) | ||
6字节目的以太网地址 | ||
4字节目的以太网IP地址(协议地址) | ||
对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去 |