概述

网络层以上的协议用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地址。

[cpp] view plain copy

  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虚拟机,要将网络适配器改为桥接模式

转载自https://www.cnblogs.com/csguo/p/7542944.html

ARP地址解析协议原理相关推荐

  1. 3、以太网基础知识——ARP地址解析协议原理

    返回目录 上一篇 下一篇 概述 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.网络层以上的协议用IP地址来标识网络 ...

  2. ARP地址解析协议详解

    ARP地址解析协议详解 网络层的ARP协议完成IP地址与物理地址的映射.首先,每台主机都会在自己的ARP缓冲区中建立一个ARP缓存表,以表示IP地址和MAC地址的对应关系.当源主机需要将一个数据包发送 ...

  3. 【ARP地址解析协议(完整解析过程、ARP欺骗、免费ARP、ARP代理)】-20211125【下】

    目录 一.ARP地址解析协议 ARP地址解析协议:将IP地址解析为Mac地址 ARP地址解析过程 1)pc1首先会查询自身的ARP缓存表,是否存在目标ARP缓存条目. ARP请求报文(原理) 2)由于 ...

  4. 【实施工程师】ARP——地址解析协议(高清版本)

    完整的[ARP--地址解析协议]图 希望对大家有所帮助

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

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

  6. 【计算机网络学习笔记09】ARP地址解析协议

    [计算机网络学习笔记09]ARP地址解析协议 ARP地址解析协议 在实际应用中,我们常会遇见这样的问题:已知一个机器(主机或路由器)的IP地址,需要找出其相应的硬件,这时就需要使用到地址地址解析协议( ...

  7. ARP地址解析协议与RARP逆地址解析协议

    这里写目录标题 区分ARP与RARP ARP:地址解析协议 ARP高速缓存 ARP高速缓存超时设置 用户输入命令时ARP操作流程 ARP的分组格式 ARP代理 免费ARP RARP逆地址解析协议 RA ...

  8. 什么是ARP(地址解析协议)?(Powercert animated videos)

    什么是ARP(地址解析协议)?IP地址和MAC地址如何连接起来 本篇文章源自以下视频链接的字幕: [IT硬核动画搬运/中英双字]什么是ARP(地址解析协议)?IP地址和MAC地址如何连接起来(Powe ...

  9. 互联网协议 — ARP 地址解析协议

    目录 文章目录 目录 ARP 简述 ARP 的基本功能 ARP 的数据包结构 ARP 的工作原理 ARP 的客户端 ARP Proxy(代理) ARP Probe(探测) ARP Spoofing(欺 ...

最新文章

  1. Elasticsearch: Five Things I was Doing Wrong
  2. 作为一枚学生党,如何提升自己华丽转身
  3. SQl inner LOOP | HASH | MERGE join--指定Join的方法
  4. from表单中 action的后面 内如果是 servlet的虚拟路径的话
  5. oracle 枚举_枚举导出为sql语句java实现
  6. 数据安全管理:RSA加密算法,签名验签流程详解
  7. Mysql数据类型TINYINT(1)与BOOLEAN踩坑记
  8. flink Sql查询异常NoResourceAvailableException: Could not acquire the minimum required resources
  9. 用字符数组存放和处理字符串
  10. 这可能是程序员写的最暖的一首歌了
  11. 华为开发者学堂 | 囤课畅学 码住未来
  12. 【托业】【新托业TOEIC新题型真题】学习笔记11-题库六-P7
  13. python矩阵教程_Python Numpy Tutorial / Python Numpy 教程 (矩阵和图像操作)
  14. 一种可以穿透还原卡和还原软件的代码一种可以穿透还原卡和还原软件的代码
  15. 在jupyter安装jieba出错ModuleNotFoundError: No module named ‘jieba‘的解决办法
  16. win10 开始 开始全屏快捷键
  17. 怎么查找计算机里的金蝶账套,金蝶帐套数据如何拷贝到另一台电脑上
  18. 淘宝开店指南——店铺设置篇
  19. 3 基于matplotlib的python数据可视化——导入Excel数据绘制组合图表
  20. win10 + uefi

热门文章

  1. create显示中文乱码 qt_Ubuntu下Qt串口助手接收中文乱码问题
  2. JAVA 数据类型数组
  3. Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)
  4. 《神经网络和深度学习》系列文章五:用简单的网络结构解决手写数字识别
  5. chrome打开清除浏览数据窗口快捷键
  6. Mysql 中is null 和 =null 的区别
  7. VS2008建立webserver(转)
  8. VC++用异或(XOR)方式实现拖放画动态直线
  9. flask与js交互的示例代码_Frida Java Hook 详解(安卓9):代码及示例(上)
  10. android 混合现实,基于Android的增强现实客户端的设计与实现