地址解析为两种不同的地址形式提供映射:32bit的IP和数据链路层使用的任何类型的地址。
当一台主机把以太网数据帧发送到位于同一局域网的另一台主机,是根据48bit的以太网地址而不是IP地址。设备驱动程序是从不会去检查IP数据报中的目的IP地址。
ARP为IP地址到对应的硬件地址之间提供动态映射。
例子
这个例子是想通过FTP协议连接主机bsdi。
在发送TCP连接前,需要将IP地址映射为硬件地址,这就需要ARP了。
ARP发送一份称作ARP请求的以太网数据桢给以太网的所有主机,也就是广播,目的就是让是这个IP地址的主机吱一声。目的主机收到这份广播报文后,发送一个ARP应答,包含了IP地址和对应的硬件地址。
ARP后面的基本概念就是,网络接口有一个硬件地址。在硬件层次上交换数据就必须有正确的接口地址,内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据,IP地址在这里是毫无用处的。
ARP高速缓存
ARP高效运行的关键是每个主机都有一个ARP高速缓存。这个缓存存储了最近的IP和硬件地址之间的映射,一般生存时间为20分钟,一般在访问条目时重设超时值。
查看ARP高速缓存的命令为:arp -a。
ARP的分组格式
分组格式分为14字节的以太网首部和28字节的ARP请求/应答。
首先是以太网首部。
以太网首部的前两个字段是以太网的源地址和目的地址。目的地址全为1则是广播地址,发送请求时就是广播。
以太网帧类型:表示后面的数据类型,对ARP请求和应答来说,值为0x0806。
接下来是ARP请求/应答。
硬件类型:硬件地址的类型,比如1表示以太网地址。
协议类型:要映射的协议地址类型,0x0800表示IP地址。值得注意的是,它与IP数据报中的以太网数据帧的类型字段的值相同。
硬件地址长度:单位为字节,值为6,也就是48bit硬件地址。
协议地址长度:单位为字节,值为4,也就是32bit IP地址。
op:四种操作类型,ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4)。
剩下的4个字段看字面意思就很清楚了,不赘述。
ARP举例
执行一个连接,然后使用tcpdump(linux下命令)查看。
可以看到,第一行中有源主机的硬件地址,目的端为ff:ff:ff:ff,也就是广播地址。紧接着输出的是arp,表明帧类型字段值为0x0806,说明这是一个ARP请求/应答。再后面的60是以太网数据帧的长度。
第二行中我们可以看到,尽管ARP请求是广播的,但是ARP应答是单播的。
第三行是请求建立TCP连接。这个不是这章的重点,等18章详述。
一般情况下,主机在收到ARP请求或发送应答时,都要把请求端的硬件地址和IP存入ARP高速缓存。这样在建立TCP连接时,应答端就不需要发送ARP来解析IP了。
如果尝试连接的是一台不存在的主机,那么会进行多次ARP请求,并会在ARP高速缓存中保存一个不完整的条目。这里有个超时重传的算法问题,TCP时会涉及。
ARP代理
上面讨论的是在同一个以太网中的情况。如果ARP请求是从一个网络的主机发送到另一个网络的主机,那么连接这两个网络的路由器可以回答该请求,这个过程称为委托ARP或ARP代理。这样,发起端就会误以为路由器就是目的主机,而路由器作为目的主机的代理,会把分组转发给目的主机。
这里一个疑问是关于解释一个IP的问题,哪位看懂的请指教。
故意的ARP
一般在系统引导期间进行接口配置时,主机会发送ARP查找自己的IP。这个特性称为“故意的ARP”(原文翻译是免费的ARP,我觉得无意义)。
这个特性有两个作用:
1)确认是否有另一个主机设置了一样的IP。如果IP是唯一的,那么就应该没有ARP应答;一旦有应答,就说明IP设置重复了。
2)如果发送故意ARP的主机正好改变了硬件地址,比如换了一块网卡并重启,那么这个ARP请求可以更新其他主机高速缓存中的旧的硬件地址。