一 概述
我们知道,IP协议是用来在不同的物理网络之间传输数据的。要在不同的网络之间传输数据,至少需要将IP协议所用的地址转换成特定网络所使用的物理地址。一般来说,就是将IPv4地址转换为mac地址。要想与一个特定的设备进行数据交换,光知道它的IP地址是不够的,还需要知道它的物理地址。而地址解析协议(ARP)就是来完成这个工作的,它能将IPv4地址转换为设备的硬件地址。需要注意的是,ARP只能转换IPv4的地址,IPv6需要使用另外的协议进行转换。
另外需要说明的是,网络层和数据链路层地址并不是由同一个组织进行分配的。对于硬件地址来说,是由生产它的厂家进行分配的,并且一旦生产出来,物理地址永远不会改变。而IP地址是由使用者或者管理员分配的,并且是可以更改的。我们知道IP数据包是封装在数据链路层的帧里的。当一个包含IP数据包得以太网帧数据在一个局域网内传输时,是通过48bit的以太网地址(硬件地址)来决定目的端口的。
ARP提供动态的地址解析。就是说,解析的过程是自动的、自适应的,当物理地址改变(但是IP地址没变)的时候,比如更换网卡,ARP仍然能够正确的通过IP地址找到对应的网卡,而不需要进行额外的配置。
二 一个例子
当我们使用网络的时候,比如打开浏览器,浏览一个网页,我们使用的主机需要判断怎样与我们感兴趣的网站服务器主机建立连接。第一个需要判断的就是服务器主机是处于本地还是非本地。换句话说,是在同一个局域网还是处于另外的网络。如果处于同一个局域网,只需要ARP协议即可访问,否则,需要通过路由器进行连接。
当两台主机处于同一网段,或者说处于同一局域网,那么用ARP可以直接进行访问(direct delivery)。我们通过一个例子来说明直接访问要经历哪些步骤。
比如我们在浏览器里输入http://10.0.0.1,将会发生以下步骤:
1.应用程序(浏览器)获取目的IP地址,这里是10.0.0.1。
2.应用程序请求TCP协议建立与10.0.0.1的连接
3.TCP发送连接请求给10.0.0.1。
4.我们这里假设10.0.0.1和本地主机处于同一局域网,因此请求连接数据可以直接发送而不用经过路由器。
5.这个时候,需要找到10.0.0.1对应的主机,就必须将该IP地址转换为对应的物理地址。这就是ARP的作用。ARP使用广播的方式传输数据,如果局域网不支持广播,那么需要用到更加复杂的协议,当然,这种情况很少见。
6.ARP给每个连接在这个局域网的主机发送ARP请求数据。ARP请求数据里面包含目的IP地址,也就是10.0.0.1,该请求的意思是,如果你的IP地址是10.0.0.1,那么把你的mac地址发给我。
四 ARP帧格式
7.如上图所示,本地主机广播ARP请求给所有主机,只有具有目的IP地址的主机会做出应答,应答数据中包括了自身的mac地址。应答不再采用广播方式,而是单播给发送请求的主机。与此同时,所有收到ARP请求的主机,都能在请求数据中得到发送请求的主机的IP地址和对应的mac地址,他们会将其存在自己的缓存中,以供后续使用。
8.收到应答后,TCP的连接请求信息现在就可以发送了,因为现在能够找到目的主机在哪儿了。
9.发送数据至目的主机。
点对点链路(PPP)不使用ARP。在设置这些链路时,必须告知内核链路每一端的IP地址,因此像以太网这样的硬件地址并不涉及。
三 ARP高速缓存
ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。这个高速缓存存放了最近IP地址到硬件地址之间的映射记录。高速缓存中每一项记录的生存时间一般位20分钟,开始时间从被创建时开始。
四 ARP帧格式
在以太网上解析IP地址时,ARP请求和应答分组的格式如上图所示。一开始的14字节是以太网头部,在上一章介绍数据链路层时讨论过。剩余的部分是由ARP协议所定义的。ARP数据部分的前8个字节是通用的,后面的部分是特定的。这里是针对IP地址和以太网物理地址的转换。事实上,除此之外,ARP还可以用于其他类型的网络。如果换了其他类型,这里的发送方和接收方的硬件地址和IP地址都要做出相应的更改。所以说这个部分是特定的,而前面的Hard Type字段到Op字段8个字节是通用的,无论转换什么样的网络类型,都是这8字节。
在以太网帧头部的两个部分分别是目的地址字段和源地址字段,在发送ARP请求时,目的地址字段要填充为全1,也就是广播地址。类型或长度字段(Length/Type)为0x0806,表示这是ARP协议数据。
Hard Type字段表示硬件地址类型,值为1表示以太网地址。Prot Type表示要解析的协议地址类型,值为0x0800表示IPv4地址。Hard Size字段和Prot Size字段分别表示硬件地址和协议地址的长度,这里分别是6和4.对应的时mac地址6字节,IP地址4字节。Op字段指出4种操作类型。1表示ARP请求,2表示ARP应答,3表示RARP请求,4表示RARP应答。RARP是ARP的逆协议,现在已经很少用到了。接下来的分别是发送端的硬件地址、协议地址,目的端的硬件地址、协议地址。大概就是这样了。
五 ARP代理(Proxy ARP)
代理ARP就是通过使用一个主机(通常是一个特定配置的路由器),来作为指定的设备对另一设备的ARP请求作出应答。 举个例子
PC1和PC2虽然属于不同的广播域,但它们处于同一网段中,因此PC1会向PC2发出ARP请求广播包,请求获得PC2的mac地址。由于路由器不会转发广播包,因此ARP请求只能到达路由器,不能到达PC2。当在路由器上启用ARP代理后,路由器会查看ARP请求,发现IP地址172.16.20.100属于它连接的另一个网络,因此路由器用自己的接口mac地址替换PC2的mac地址,向PC1发送了一个ARP应答。PC1收到ARP应答后,会认为PC2的mac地址就是00-00-0c-94-36-ab,不会感知ARP代理的存在。正是由于这个原因,代理ARP用的不多,并且如果可能,尽可能避免使用它。
六 Gratuitous ARP 和地址冲突检测(ACD)
Gratuitous ARP的意思就是主机向自身IP地址发送ARP请求。这样做得目的有两个:
(1)这样可以让主机知道自身的IP地址有没有已经被其他主机占用。显然,如果已经被其他主机占用的话,返回的mac地址和自身mac地址不一致。
(2)如果主机刚好更换了网卡,那么使用Gratuitous ARP就能让广播域中其他的主机更新正确的IP地址到mac地址映射。因为其他主机的ARP缓存中存储的可能是更换网卡之前的mac地址,因此需要更新。