在网络层中使用的是网络地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该站点的硬件地址。但是知道IP地址怎么得出MAC地址呢?ARP协议就是解决这个问题,它能够在知道IP地址的情况下,得出MAC地址。
运作过程
当主机A要向本局域网上的某个主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如果有,就在缓存中查出其对应的的硬件地址,然后把这个硬件地址写入MAC帧中,然后通过局域网把MAC帧发往此硬件地址(目标主机)。
也有可能查不到主机B的IP地址,此时A就会运行ARP协议:
ARP进程在本局域网广播发送一个ARP请求分组
在本局域网上所有主机上运行的ARP进程都收到此ARP请求,但只有主机B的IP地址与ARP请求分组查询一致,主机B收下这个ARP请求分组,并向主机A发送ARP响应分组,并在这个响应分组中写入自己的硬件地址,这个响应时普通的单播。
主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射。当主机A向B发送数据报时,很可能不久后B也会向A发送数据报,因而主机B也可能要向A发送ARP请求。为了减少网络上的通信量,主机A在向主机B发送ARP请求分组时,也会把自己的IP地址和MAC地址写入MAC帧中,局域网内所有的主机这时都会记录下主机A的物理地址。
ARP把保存在高速缓存中的每一个映射地址项目都设置生存时间,超过生存时间的都会从其中删掉。
使用ARP的4种典型情况:
【1】发送方是主机(H1),要把IP数据报发送到同一个网络上的另一个主机(H2),这时H1发送ARP请求分组(网1上广播),找到目的主机H2的硬件地址。
【2】发送方是主机(H2),要把IP数据报发送到另一个网络上的一个主机(H3),这时H1发送ARP请求分组,找到网1上的一个路由器R1的地址,剩下的工作由路由器R1完成。
【3】发送方式路由器(R1),要把IP数据报转发到与R1相连的同一个网络上的主机(H3),这时R1发送ARP请求(网2上广播),找到目的主机H3的硬件地址。
【4】发送方是路由器(R1),把IP数据报转发到网3上的一个主机(H4)。这时R1发送ARP请求分组(网2上广播)找到连接在网2上的路由器R2,剩下的工作由R2完成。
ARP 报文
- 硬件类型字段
表示发送方想要知道的硬件接口类型,对于以太网MAC地址,其值为1。 - 协议类型字段
表示要映射的协议地址类型,其值为0x0800,表示为IP地址 - 硬件地址长度
MAC 地址长度,6字节。 - 协议地址长度
IP地址长度,4字节 - OP
OP指出ARP数据包的类型,它们可以是ARP请求(值为1),ARP应答(值为2)。
对于一个ARP请求包来说,除接收方MAC地址为空,其他字段都会被填充相应的值。当接收方主机收到一份给自己的ARP请求报文后,就把自己的硬件地址填进去。
ARP 攻击
在局域网中,如果所有用户都规规矩矩,按照上述流程使用ARP就不会产生任何问题,但是当某些"不怀好意"的主机出现时,ARP协议的漏洞就可以让我们整个系统崩溃。
这些主机在收到一个ARP请求后(ARP请求是广播),它不管包中的IP地址与本地地址是否相同,都会产生一个ARP应答包,告诉请求的用户:我这台主机就是你请求的目的IP的主机。另一方面,由于ARP请求的源主机不具备任何认证功能(ARP协议未提供),这样它便会轻易相信应答,并把它加入到自己的ARP缓存表中。从此以后,源主机在都会把目的IP地址的数据包发送到这些"不怀好意"的主机上。这样,这些"不怀好意"的主机也就能轻松的实现数据的窃取。
参考资料
《TCP/IP详解 卷1:协议》[美] W.Richard Stevens