ARP

一、IP & MAC

IP地址和MAC地址存在何种联系以及区别,区别就是:

  • 从分层来看:MAC地址是数据链路层和物理层使用的地址,IP地址是网络层和网络层以上使用的地址,是一种逻辑地址

  • 从数据报来看:数据从应用层到网络层,到数据链路层,再到通信链路上传输。使用IP地址的IP数据报一旦交给了数据链路层就会被封装成MAC帧,MAC帧在传送时使用的源地址和目的地址都是MAC地址,MAC地址写在帧的头部中。连接在通信链路上的设备收到帧时,根据帧头部的MAC地址,决定收下还是丢弃。收下剥离数据链路层头部给网络层后,在头部中找到源IP地址和目的IP地址。总结就是IP地址放在IP数据报的头部,MAC地址放在帧的头部。

二、ARP概述

总结上述问题就是IP数据报在二层进行传递的时候,需要关联IP和MAC地址。ARP协议就是用来解决这个问题,值得注意的是ARP协议是配合IPV4协议来使用的,在IPV6中并不存在ARP协议。还有一个叫RARP协议的东西,RARP就是通过硬件地址来查找IP地址,只不过DHCP协议已经包含了RARP的功能。网络层使用的是IP地址,但是实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但是IP地址和MAC地址由于格式的不同并不存在简单的映射关系,同时更换网络适配器也会导致MAC地址改变,无法做到使得IP地址和MAC地址存在简单的转换关系,这时就需要使用ARP协议来解决这个问题。

ARP协议会在主机中建立一张ARP映射表,表的内容就是存放一个IP地址到MAC地址的ARP映射表,这样主机通过ARP映射表根据IP查找所对应的MAC地址并将其填入MAC帧的首部中,并且ARP映射表会定时更新。ARP是解决同一局域网上的主机的IP地址和硬件地址的映射问题。那么主机是如何学习到这些映射条目的呢?

永远记住MAC地址不可能出二层。有些产品说跨三层取MAC,只是通过了SNMP等技术取值,如果没有机制,是很难做到跨三层取到MAC地址的。

三、ARP工作原理

当需要发送IP数据报时,先完成三层的寻址(dst IP根据路由表进行最长掩码匹配):

  • 扔给局域网;则开始查询本机ARP映射表,是否有无dst IP对应的MAC地址:

    • 有;将MAC地址写入帧中的目的MAC字段,然后发送出去

    • 无;运行ARP协议

  • 扔给网关;则开始查询本机ARP映射表,是否有无网关对应的MAC地址:

    • 有;将MAC地址写入帧中的目的MAC字段,然后发送给网关

    • 无;运行ARP协议

1、ARP交互概要

Step1. A运行ARP,向局域网发送一个ARP请求分组(广播)

Step2. B根据分组中的dst IP比对自己的IP,然后回复一个ARP响应分组(单播),写入ARP映射表

Step3. A收到ARP响应分组后,写入ARP映射表

Step4. 开始通信

2、ARP交互详细

1)二层通信

同局域网发送IP数据报:

Step1. ARP进程在同局域网上广播一个ARP请求分组。分组内容为:我的IP是209.0.0.5,MAC地址是 00-00-C0-15-AD-18,我想知道209.0.0.6的硬件地址。

Step2. 同局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。

Step3. B发现自己的IP地址与ARP请求分组中要查询的IP一致,就收下这个ARP请求分组,并向A单播发送ARP响应分组,分组内容为:我的IP是209.0.0.6,MAC地址是08-00-2B-00-EE-0A。并将A的MAC写入到ARP映射表中。

Step4. A收到B的ARP响应分组后,就在其ARP映射表中写入B的IP到MAC的映射。

2)跨三层通信

不同局域网发送IP数据报:

Step1. ARP进程在同局域网上广播一个ARP请求分组。分组内容为:我的IP是209.0.0.5,MAC地址是 00-00-C0-15-AD-18,我想知道209.0.0.1(网关)的硬件地址。

Step2. 同局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。

Step3. 网关发现自己的IP地址与ARP请求分组中要查询的IP一致,就收下这个ARP请求分组,并向A单播发送ARP响应分组,分组内容为:我的IP是209.0.0.1,MAC地址是08-00-2B-00-EE-0C。并将A的MAC写入到ARP映射表中。

Step4. A收到网关的ARP响应分组后,就在其ARP映射表中写入网关的IP到MAC的映射。

3)ARP映射表

ARP映射表是记录MAC地址和IP地址映射关系的表项。其中的表项称为映射项,映射项存在老化时间,如果在固定时间内(老化计时器)没有被再次触发,就会自动删除。为什么需要ARP映射表呢?因为可以减少局域网内的ARP查询和响应请求,A在请求B的MAC地址时,在帧中带有自己的MAC,那这样B就不需要再次发起ARP请求了,直接将A的MAC地址和IP地址的映射写入到自己的ARP映射表中。如果一段时间不需要和B通信,那么过了老化时间后,就会自动删除映射项。

二层既然能够通过MAC地址通信,那么为什么还需要IP地址这种三层的编址结构呢?因为不同的数据链路层协议使用不同的编址结构,也就造成了异构网络的存在。如果想要异构网络之间能够通信,就需要解决复杂的硬件地址转换工作。你可能想说,为什么不统一采用一种数据链路层的编址结构呢?这是因为从来没有一种二层网络结构能够满足不同用户的需求,不同的二层网络满足了不同的客户需求。所以在多种多样的二层网络架构上,开辟一种统一编址的三层网络是非常有必要的,IP编址屏蔽了不同的数据链路层协议的编址结构。所以在单个局域网中,采用二层硬件地址寻址,而多个局域网之间通信,则需要采用统一的三层地址寻址。