概述

网络层以上的协议用IP地址来标识网络接口,但以太数据帧传输时,以物理地址来标识网络接口。因此我们需要进行IP地址与物理地址之间的转化。

对于IPv4来说,我们使用ARP地址解析协议来完成IP地址与物理地址的转化(IPv6使用邻居发现协议进行IP地址与物理地址的转化,它包含在ICMPv6中)。

ARP协议提供了网络层地址(IP地址)到物理地址(mac地址)之间的动态映射。ARP协议 是地址解析的通用协议

 请求的例子:

MAC 地址 与 IP地址

  Mac地址由设备制造商定义/分配,每一个硬件设备都有一个链路层主地址(MAC地址),保存在设备的永久内存中。设备的mac地址不会改变(现在可以进行mac地址伪装) 
  IP地址由用户配置给网络接口, 网络接口的IP地址是可以发生变化的(通过DHCP获取IP,变化速度比较快)

获取目的端的MAC地址(在一个以太网中)步骤如下: 

1.发送ARP请求的以太网数据帧给以太网上的每个主机,即广播(以太网源地址填全1)。ARP请求帧中包含了目的主机的IP地址。 
         2.目的主机收到了该ARP请求之后,会发送一个ARP应答,里面包含了目的主机的MAC地址。

ARP协议工作原理

  1. 每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。
  2. 主机(网络接口)新加入网络时(也可能只是mac地址发生变化,接口重启等), 会发送免费ARP报文把自己IP地址与Mac地址的映射关系广播给其他主机。
  3. 网络上的主机接收到免费ARP报文时,会更新自己的ARP缓冲区。将新的映射关系更新到自己的ARP表中。
  4. 某个主机需要发送报文时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址等。
  5. 当本网络的所有主机收到该 ARP 数据包时:

             (A)首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包。

             (B如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖。

             (C 然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。

6.源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。

ARP工作实例

下面我们就来谈一谈ARP地址解析协议是如何把目的地址的IP地址转化成MAC地址的。

1. 首先,主机A想要向主机B发送消息,但它不知道主机B的MAC地址,只知道主机B的IP地址。这时,主机A会在当前局域网下以广播的形式发送ARP请求数据报,表示主机A想知道主机B的MAC地址(注:广播时,以太网首部的目的地址为全f)。 

2. 由于是广播,所以在本局域网上的所有主机都会受到主机A发送的ARP数据报,然后所有主机会把以太网首部这个报头给去掉,向上面的网络层发送ARP数据报。在这里我们便可以回答上面的问题了,以太网首部和ARP数据报内的MAC地址都不能少,一个是在数据链路层使用的,一个是在网络层使用的,因为两个层都不能看到互相的数据。

3. 网络层首先会检查op字段,发现这时个ARP请求数据报,然后又会检查目的IP地址字段,检查完毕后,这时除了主机B外,在这个局域网内的其他主机都会把数据报丢弃,因为只有主机B的IP地址和目的IP地址是相同的。 

ARP缓存

ARP高速缓存(即ARP表)是 ARP地址解析协议能够高效运行的关键, (如果有多次ARP响应时,以最后一次响应为准)

ARP给IP地址和MAC地址中间做了动态映射,也就是说缓存了一个ARP表,将得到的IP地址和MAC地址对应起来,如果在表中没有查到IP地址对应的MAC地址,就会发广播去找。随着用户的使用,ARP表如果不做任何措施,就会变得越来越臃肿缓慢,就降低了网络传输数据的效率,所以ARP缓存中每一项被设置了生存时间,一般是20分钟,从被创建时开始计算,到时则清除,如果在计时期间又被使用了,计时会重置。

我们可以通过arp命令查看arp表: 

ARP表中记录了一些IP地址与物理地址的映射,在arp表中,我们可以看到一个Flags字段,该字段有C、M、P三种取值: 

C: 表明arp条目为通过ARP请求动态获取,(一般存活时间为20min) 
      M:表明arp条目为手动设置。 
      P: 表示Publish,表示该ARP条目可以用于恢复其他主机的ARP请求。(用于ARP proxy)

报文格式(ARP 帧)

ARP帧以以太帧的形式存在,即ARP消息包含在以太帧中 ,因此包含以太帧的首部和尾部。(这里不考虑802.1p/q等特殊以太帧)。 

* 帧类型*:用来向收到数据报的主机表示该数据报的类型,常见类型如下: 
0800:IP数据报; 
0806:ARP请求/应答数据报; 
8035:RAPP请求/应答;

ARP Request or Reply Message 是ARP帧的核心部分。 

前14字节是以太网首部帧格式 ,然后后面四个字段描述了本ARP帧涉及的硬件类型和协议类型。 
Hard Type:该字段占2个字节,指定硬件地址类型, 如值为1表示为以太网地址。 
Prot Type :该字段占2个字节,指定协议地址类型,如0x0800 表示协议地址类型为IPv4地址。该值与以太帧首部的类型字段相同。 
Hard Size: 表示硬件地址的大小(单位:字节),如以太网地址为6。
Prot Size : 表示协议地址的大小(单位:字节), 如IPv4地址大小为4。(硬件地址长度和协议地址长度,分别占1个字节,指出硬件地址和协议地址的长度,以字节为单位。)

OP : 表示ARP的消息类型。 
    1:ARP Request; 
    2:ARP Reply 
    3:RARP Request 
    4:RARP Reply

后面四个字段写入的是一些物理地址和协议地址。不一定全部有值。 
对于ARP Request 而言,我们不知道目的MAC地址是什么,因此 Target’s Hardware Address 全部填充为0.

ARP帧的交互

当主机接收到一个针对其协议地址的ARP Request时,它会回应ARP Reply. 该Reply消息内容为:对调sender 和 Target 地址字段,然后将Sender’s Hardware Address(即原来的Target’s Hardware Address )修改为本机的Hardware Address。另外OP字段有1变为2.

局域网中一台主机获取已知一台IP地址的主机的硬件地址过程:

当主机A向本局域网上的主机B发送IP数据报时,先在ARP高速缓存中查找B主机IP所对应的硬件地址,要是找到了,就将此硬件地址写入到MAC帧首部的目的地址中,然后通过局域网发送;要是没有找到,那么主机A会运行ARP,将会按照以下步骤找出主机B的硬件地址。
①主机A想局域网中广播发送一个ARP请求分组,广播的主要内容是:“我的IP地址是IPA,我的硬件地址是MACA,我要知道IP地址为IPB的主机的硬件地址”。
此时局域网中的主机都会收到这样的一个数据帧。
②链路层在接收到这个数据帧之后将有效载荷和报头分离之后,将有效载荷交付给ARP协议进行处理(因为MAC帧首部的帧类型为ARP协议)。
③在所有局域网中的主机获得链路层交付的有效载荷后,它们会对其进行处理,发现其中的接收端IP地址与自己的IP地址不同,则会将该数据报丢弃,不做处理。只有B主机会发现接收端IP地址与自己的IP地址相同,此时B主机会向A主机单播一个响应分组(因为通过A的广播,B知道了A的IP地址和硬件地址),“我的IP是IPB,我的硬件地址是MACB”。
④在主机A收到主机B的ARP响应分组后,就在ARP的告诉缓存中写入B主机的IP地址到硬件地址的映射。
 

免费ARP 和 地址冲突检测

* 免费ARP* 指的是 主机发送一个ARP请求,求寻找自己的IP地址 。常用在系统引导时,对网络接口进行配置的时候。 
免费ARP有两个重要作用 
1. 检测网络上是否有其他主机的IP地址与本机相同,即地址冲突检测。 
2. 当主机向网络广播免费ARP时,其实她也将自己的IP地址与物理地址的映射关系广播给其他主机了。因此,如果本机的硬件地址发生了变化,其他主机也应该做出相应的更新。

ARP请求发送到了目的端之后,目的端填上了自己的硬件地址,然后把两个目的端地址和两个发送端地址交换,把op的值置为2,再把该ARP数据报发回去。

前面提到的获取目的端的MAC地址的步骤是在一个特殊的条件下完成了,即发送端和目的端都在同一个以太网中,那么当发送端和目的端不在同一个网络中呢。 
这种情况下有一个术语叫ARP代理。连接发送端和目的端网络的路由器就充当这样一个代理。举个简单的例子,当主机A发送ARP请求给主机B时,它们处于不同的网络,但是由路由器C相连,当C识别出主机B的IP地址属于它连接的一个主机,这时C就会欺骗主机A,让A误认C就是目的主机,然后C就将ARP数据报发给B,最后B再将ARP应答发回来。

还有最后一个ARP特性:免费ARP 
它是指主机发送ARP查找自己的IP地址。 
作用有两个: 
1.主机可以通过它来确定另一个主机有没有设置同样的IP地址。 
2.如果发送免费ARP的主机改变了硬件地址(换了网卡),那么这个分组就会更新其它主机高速缓存表中旧的硬件地址。

ARP报头定义如下:

 
在学习到这些知识之后我们可以做这样一些实验,编写一个脚本抓取和自己电脑处于同一局域网的其他主机的MAC地址。
原理很简单,一个C类的地址最多有254台主机,所以我们可以暴力的去ping每个IP,我们就可以获取到连接在本局域网中的其他主机的MAC地址。
  1. #!/bin/bash
  2. net='192.168.199.'
  3. i=1
  4. count=0
  5. while [ $i -le 254 ]
  6. do
  7. if [ $count -eq 20 ];then
  8. count=0
  9. sleep 1
  10. fi
  11. ping -c1 $net$i &
  12. let i++
  13. let count++
  14. done
  15. wait
  16. echo '############################################'
  17. arp -a | grep -v 'incomplete'
  18. echo '############################################'
在我电脑上成功抓取到其他主机的硬件地址。
注意:如果是使用VM虚拟机,要将网络适配器改为桥接模式
 
 
 
 

ARP地址解析协议原理的更多相关文章

  1. ARP地址解析协议

    ARP地址解析协议:为IP地址到相应的硬件地址之间提供动态映射. 下面图为例说明地址解析协议的详细工作流程. 结合图中的序号进行说明. client通过FTP协议连接server时,首先解析器会把主机 ...

  2. 《TCP/IP详解 卷1:协议》第4章 ARP:地址解析协议

    4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址.数据链路如以太网或令牌环网都有自己的寻址机制(常常为48 bit地址),这是使用数据链路的任何网络层都必须遵从的.一个网络如 ...

  3. ARP:地址解析协议

    ARP是地址解析协议,简单语言解释一下工作原理.1:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系.2:当源主机要发送数据时,首先检查ARP列表中 ...

  4. arp:地址解析协议(Address Resolution Protocol)(来自维基百科)

    地址解析协议(Address Resolution Protocol),其基本功能为通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在I ...

  5. 【网络协议】ARP地址解析协议

    地址解析协议ARP 在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址.而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址.这就导致在以太 ...

  6. 【网络基础】ARP地址解析协议

    ARP(Address Rssolution Protocol) 地址解析协议 用于将IP地址解析为MAC地址. MAC地址是设备的物理地址,是被分配给每一个网络接口卡的全球唯一序号. 全球唯一:理论 ...

  7. 网络协议抓包分析——ARP地址解析协议

    前言 计算机之间可以相互通信的前提是要知道对方的地址,才可以发送信息给其他计算机,就像别人要联系你也得先知道你的电话号码一样.这里的地址因为网络分层的原因就包括IP地址和MAC地址(即网卡地址.硬件地 ...

  8. 第二章ARP——地址解析协议

    本章我们要讨论的问题是只对 T C P / I P协议簇有意义的I P地址.数据链路如以太网或令牌环网都有自己的寻址机制(常常为 48 bit地址),这是使用数据链路的任何网络层都必须遵从的.一个网络 ...

  9. 第四章:ARP 地址解析协议

    网络接口有一个硬件地址,48bit的值,在硬件层次上进行的数据帧交换必须有正确的接口地址.tcp/ip有自己的地址,32bit的IP地址. 但是知道主机的IP地址并不能让内核发送一帧数据给主机.内核( ...

随机推荐

  1. Java设计模式の单利模式

    单利模式:确保一个类最多只有一个实例,并提供一个全局访问点. 经典单利模式创建对象代码 public class Singleton { private static Singleton unique ...

  2. 《ASP.NET MVC 5 破境之道》:概述

    第一节:写作本书的目的 关于笔者 张晓亭(Mike Cheers),1982年出生,内蒙古辽阔的大草原是我的故乡. 没有高学历,没有侃侃而谈的高谈阔论,拥有的就是那一份对技术的执著,对自我价值的追求. ...

  3. MaxScript调用DotNet时命名空间的问题

    Fn GetSpecialFolder argEnumName = (DotNetClass "System.Environment").GetFolderPath (Execut ...

  4. iOS App的加固保护原理

    本文由  网易云发布. 本文从攻防原理层面解析了iOS APP的安全策略.iOS以高安全性著称,但它并非金刚不坏之身.对于信息安全而言,止大风于青萍之末是上上策,杭研深入各个细节的研发工作,正是网易产 ...

  5. AndroidStudio的一些快捷键的使用

    1.返回上一次浏览快捷键的设置   https://blog.csdn.net/yingtian648/article/details/73277388 2.格式化代码的快捷键的设置      htt ...

  6. Ubuntu16.04 - 安装Courier New字体

    这应该是一个很简单的任务吧?网上很多地方告诉我们,只要在shell终端里面执行命令:"sudo apt-get installttf-mscorefonts-installer"就 ...

  7. mybatis中单个参数的引用

    单个参数时在test条件中不能用参数名来引用,可以使用_parameter

  8. HTML简单登录和注册页面及input标签诠释

    今天第一次接触HTML这种语言,虽然不能完全理解其中的意思,过去学的英语单词几乎也忘了差不多了,但是感觉进入这门语言学习之后就没有那么难了,一步一步来吧!下面巩固下今天学内容: HTML是一种超文本标 ...

  9. 【NOIP2018】保卫王国 动态dp

    此题场上打了一个正确的$44pts$,接着看错题疯狂$rush$“正确”的$44pts$,后来没$rush$完没将之前的代码$copy$回去,直接变零分了..... 这一题我们显然有一种$O(nm)$ ...

  10. js集合set类的实现

    js集合set类的实现 /*js集合set类的实现*/ function Set() { this.dataStore = []; this.add = add;//新增元素 this.remove ...