一文搞懂ARP协议

2023-11-20

更多文章请关注我的个人微信公众号:极客熊猫
欢迎扫码关注:
在这里插入图片描述

什么是ARP?

ARP是Address Resolution Protocol的首字母缩写,即地址解析协议

如果一台主机要将一个帧发送到另一台主机,只知道这台主机的IP地址是不够的,还需要知道主机的硬件地址。

对于以太网而言,硬件地址即48位的MAC地址。

对于采用以太网的TCP/IP网络,ARP协议提供从IPv4地址到MAC地址的动态映射。

动态是指它会自动执行和随时间变化,而不需要系统管理员重新配置。比如一台主机因更换网卡改变了MAC地址,ARP在一定延时之后继续正常运作。

ARP不能跨网络使用!

ARP仅用于IPv4,IPv6使用ICMPv6中的邻居发现协议实现类似功能。

ARP帧的格式

注:这里所说的ARP帧实际上是指ARP消息封装成的以太网帧。

以太网帧的格式

在这里插入图片描述

上图描述了链路层以太网帧的基本格式及各个字段的大小:

  • DST:填写目的MAC地址,占6字节。
  • SRC:填写源MAC地址,占6字节;
  • 长度或类型:用于确定数据部分(上层协议PDU)来自哪种协议;
  • 上层协议PDU:以太网帧的有效载荷部分,存放上层协议发来的PDU;
  • FCS:帧校验序列,提供了对帧完整性的检查。
  1. DST:可以填写广播地址或组播地址,广播功能用于ARP协议,组播功能用于ICMPv6,分别实现IPv4地址和IPv6地址到MAC地址的映射;
  2. 长度或类型:TCP/IP网络常见值包括IPv4(0x0800)、IPv6(0x86DD)、ARP(0x0806)。

以太网帧有最小和最大尺寸的规定,除有效载荷(上层协议PDU)部分,其他四部分固定占有18字节:

  • 最小帧为64字节:这要求上层协议PDU最小为46字节,如果不够就在有效载荷尾部填充0,以保证达到最小帧要求;
  • 最大帧为1518字节:这要求上层协议PDU最大为1500字节,对于IP分组,如果超过1500字节,则需要进行IP分片。

有效载荷部分的最大长度,即1500字节,也被称为以太网的MTU(最大传输单元)。

ARP消息的格式

在这里插入图片描述

上图描述了ARP消息的格式及各个字段的大小:

  • 硬件类型:指出硬件地址类型,占2字节。对于以太网,该值为1;
  • 协议类型:指出要映射的协议地址类型,占2字节。对于IPv4地址,该值为0x0800;
  • 硬件大小:指出硬件地址的字节数,占1字节。对于以太网MAC地址,该值为6;
  • 协议大小:指出要映射的协议地址的字节数,占1字节。对于IPv4地址,该值为4;
  • Op:指出该ARP消息是ARP请求(该值为1)还是ARP应答(该值为2),占2字节;
  • 源硬件地址:对于以太网,就是填发送方的MAC地址,占6字节;
  • 源协议地址:对于IPv4网络,就是填发送方的IPv4地址,占4字节;
  • 目的硬件地址:对于ARP请求,设为0;对于ARP应答,填接收方的MAC地址;占6字节;
  • 目的协议地址:对于IPv4网络,就是填接收方的IPv4地址,占4字节。

对于一个ARP请求,它的任务是寻找目的协议地址(已知)对应的目的硬件地址(未知),所以除了目的硬件地址设为0,其他字段均需填写;

当所请求的系统接收到ARP请求,它填充自己的硬件地址,将两个源地址和两个目的地址互换,将Op字段设置为2,然后发送生成的应答。

ARP帧的格式

在这里插入图片描述

ARP帧中存在重复信息:以太网头部和ARP消息中均包含发送方的MAC地址

ARP缓存

ARP高效运行的关键是每个主机和路由器上的ARP缓存

在Linux下,我们可以使用arp命令查看本机的ARP缓存。

在这里插入图片描述

Flags字段的C表示该条目是由ARP协议动态学习而来;若为M表示是手工输入的;若为P表示“发布”。

从上图看,我的云服务器上只有其默认网关的ARP缓存。

当系统接收到发送给它的ARP请求时,除了发送ARP应答,它还会在其ARP缓存中保存请求者的IP地址和MAC地址。

ARP缓存是有超时时间的,通常,完整条目的超时为20分钟,不完整条目的超时为3分钟。并且通常在每次使用一个条目后为它重新启动20分钟的超时。

对一个不存在的主机进行ARP请求,就会在ARP缓存中生成一个不完整条目

ARP如何工作?

下面通过一个实际场景描述ARP的工作流程。

场景:主机A要给同一子网内的主机B发送消息,我们假设主机A和主机B的ARP缓存中中均没有对方的IP地址和MAC地址映射信息。主机A和主机B的IP地址和MAC地址如下。

主机A的IP地址:10.0.0.56;

主机A的MAC地址:00:00:c0:6f:2d:40;

主机B的IP地址:10.0.0.3;

主机B的MAC地址:00:00:c0:c2:9b:26。

ARP请求

主机A发现自己不知道主机B的MAC地址,无法封装以太网帧,所以发出如下ARP请求帧:

在这里插入图片描述

这个ARP请求帧相当于主机A在子网内广播了这样一条消息:IP地址为10.0.0.3的主机,请把你的MAC地址告诉我!

由于是广播,所以子网内的所有主机的以太网接口都可以接收到该ARP请求帧,IP地址不是10.0.0.3的主机将主动丢弃该帧。

ARP应答

而主机B接收到ARP请求后,发现自己的IP地址与请求中的IP地址一致,所以它做出反应:发送ARP应答帧:

在这里插入图片描述

同时,主机B还会把主机A的IP地址及对应的MAC地址添加到自己的ARP缓存中。

主机A收到ARP应答帧后,就有了主机B的MAC地址,加上之前已知的主机B的IP地址,也一同添加到自己的ARP缓存中。

这就是一个完整的ARP请求/应答流程。有了主机B的MAC,主机A就可以给主机B发送消息了。

代理ARP

代理ARP的原理就是当出现跨网段的ARP请求时,路由器将自己的MAC地址返回给发送ARP请求的发送者,实现MAC地址代理(善意的欺骗),最终使得主机能够通信。

在这里插入图片描述

免费ARP

免费ARP的特殊之处在于,ARP请求中的源IP地址和目的IP地址均为请求发送者的IP地址,即:主机发送ARP请求寻找自己的MAC地址。

免费ARP有两个用处:

  • 检测IP冲突。如果这个ARP请求收到了应答,说明请求者的IP地址已经被其他主机用了。
  • 更新自己的MAC地址。如果主机的MAC地址变了(如更换了网卡),而IP地址没变。则可以发送一个免费ARP,告诉其他主机:我换MAC地址了,你们注意下。收到免费ARP的其他主机,就可以在自己的ARP缓存里找IP地址与免费ARP里的IP地址一致的条目,然后把这个IP地址对应的MAC地址更新为免费ARP里指明的新MAC地址。

如上述主机A检测自己的IP地址是否冲突,可发送免费ARP如下:

在这里插入图片描述

ACD

ACD是IPv4地址冲突检测的简称,用途顾名思义,就是检测IP地址是否冲突的,一般在通过DHCP获取IP地址后,DHCP客户机通过ACD技术检测分配的IP地址是否冲突。

ACD技术是通过ARP协议来完成的。

ACD定义了ARP探测消息和ARP通告消息。

ARP探测消息

ARP探测消息是一个特殊的ARP请求,特殊在其源IP地址字段被设置为0。ARP探测分组用于查看IP地址是否被其他主机占用。

还是以上述的主机A为例,ARP探测消息如下:

在这里插入图片描述

ARP探测消息的源IP地址设置为0,是为了避免候选IP地址(10.0.0.56)被另一台主机使用时的缓存污染。

当主机A发送自己的ARP探测时,它可能接收到ARP请求或应答:

  • 若收到针对它自己ARP探测的应答,说明IP地址10.0.0.56被其他主机占用了;
  • 若收到ARP请求(免费ARP或ARP探测),请求中的目的IP地址字段也是候选IP地址10.0.0.56,说明有其他主机也正在尝试获得该IP地址。

以上两种情况,主机A都会生成一个地址冲突消息,如果是DHCP分配的该IP地址,则发送DHCPDECLINE消息拒绝该IP地址。

ARP通告消息

如果通过ARP探测消息发现,10.0.0.56没有被其他主机占用,即没有出现IP地址冲突,则主机A会间隔2秒向子网广播发送2个ARP通告消息,以表明它现在占用这个IP地址(10.0.0.56)。

在这里插入图片描述

可以看到ARP通告消息其实跟免费ARP没有区别。

ACD是一个持续的过程,这是它与免费ARP的区别。当主机A通告了它正在使用IP地址10.0.0.56后,它会继续接收ARP请求/应答消息,查看自己的IP地址(10.0.0.56)是否出现在这些ARP请求/应答消息的源IP地址字段中。如果是的话,说明其他主机正在与自己使用相同的IP地址。对于这种情况,有三种解决方案:

  • 停止使用该地址;
  • 保留该地址,但发送一个防御性的ARP通告,如果冲突继续,则停止使用该地址;
  • 不理会冲突,继续使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文搞懂ARP协议 的相关文章

  • pycharm日志总是弹出“无法运行 Git,未安装 Git”

    出现这个日志提示的原因是没有在pycharm里面配置git 如果你想让自己的代码进入git仓库 避免出现电脑问题突发事件导致代码没了的话 建议大家可以上传git仓库 这在做大型项目中是非常有必要的 有过企业项目经验的人应该非常清楚 话不多说
  • Java算法:华为机试算法(中),华为算法Java版,牛客网华为算法55~72题

    接上篇 Java算法 华为机试算法 上 华为算法Java版 牛客网华为算法1 54题 HJ55 练习用 挑7 挑7 题目描述 输出7有关数字的个数 包括7的倍数 还有包含7的数字 如17 27 37 70 71 72 73 的个数 一组测试
  • 数据结构与算法--用c语言建立队列以及其相关操作

    一 队列的定义和特点 队列与栈一样 也是一种特殊的线性表 与栈 先进后出 不同的是 队列服从 先进先出 也就是元素从队尾进入队列 从队头离开 如图所示 a1最先进入队列 因此最先从对头离开队列 然后是a2 以此类推 二 队列的相关操作及其代
  • 网络计算机室电源线怎么布,网吧综合布线(电源和网络)经验谈

    电源系统布线篇 网吧目前所提供的服务 像网页浏览 网络游戏 在线电影 远程教育等最基本的服务都与网络有关 网络质量的好坏直接决定了网吧的生存能力 所以 如何规划一个优质的网络环境 是网吧经营者必须要考虑的一个要点 其中网吧的综合布线占了很大
  • js---js使用闭包是否会产生内存泄露及解决方案

    一 前置知识 闭包的产生 js垃圾回收机制 不懂的可以先移步到下方的博客再回来 前端进阶 JS中的内存管理 知乎 二 闭包是否会产生内存泄露 在此强调变量arr保存的是对引用数据类型数组的引用 地址 保存在栈中 数组的每一项值保存在堆中 n
  • socket编程实现简单的TCP网络程序(下)

    socket编程实现简单的TCP网络程序 下 文章目录 1 封装TCP socket 2 TCP通用服务器 3 英译汉服务器 4 TCP通用客户端 5 英译汉客户端 1 封装TCP socket include
  • 无线测距设备和原理介绍

    UWB 超宽带 无线测距传感器是一种基于超宽带技术开发的无线测距传感器 该设备可以实现1对1 或者1对多或者多对多个设备之间互相测距 设备测距精度可达3 10厘米 测距距离可到500多米 测距频率最高可达200Hz 如下图所示为1对1频率5

随机推荐

  • 孤儿进程与僵尸进程[总结](转)

    转自http www cnblogs com Anker p 3271773 html 1 前言 之前在看 unix环境高级编程 第八章进程时候 提到孤儿进程和僵尸进程 一直对这两个概念比较模糊 今天被人问到什么是孤儿进程和僵尸进程 会带来
  • 【WPS】论文添加引用和参考文献简明方法 (图文详解)

    对于日常的作业 报告 草稿等 经常会用 Office Word 或 WPS Word 来编辑和整理 以下 本文将说明 如何用 WPS 为论文添加引用 尾注 和参考文献 WPS 2019 1 正文中 用鼠标左击 将输入光标放在 需要放置方括号
  • 离散数据与连续数据

    离散数据 离散数据是指其数值只能用自然数或整数单位计算的数据 例如 企业个数 职工人数 设备台数等 只能按计量单位数计数 这种数据的数值一般用计数方法取得 在统计学中 数据按变量值是否连续可分为连续数据与离散数据两种 连续数据 在一定区间内
  • Caffe源码中caffe.proto文件分析

    Caffe源码 caffe version 09868ac date 2015 08 15 中有一些重要文件 这里介绍下caffe proto文件 在src caffe proto目录下有一个caffe proto文件 proto目录下除了
  • 包的创建、包的命名、包的导入

    包 package 1 分门别类的管理java文件 2 避免文件重名 3 保护包内的文件 包的命名 1 公司域名的到写 部门名称 项目名称 模块名称 部门名可以不写 2 用 作为分隔符 例 com openlab phone employe
  • 数据库选型粗略对比,欢迎补充!!!

    关系型数据库 Oracle SQL Server MySQL PostgreSQL SQLite Oracle 甲骨文开发的商业数据库 不开源 支持所有主流平台 性能好 功能强 稳定性好 安全性好 支持大数据量 比较复杂 收费昂贵 SQL
  • Unity3D小程序部署与开发

    Unity3D目前已经支持微信小程序开发 目前正处于公测阶段 可以参考文档 这样我们只需要在unity本地开发完 一键导出微信小程序工程发布即可 0 下载小程序开发工具与Unity 微信小程序插件 小程序开发工具 wechat devtoo
  • 本地jar上传至私服

    本地jar上传至私服 一 eclipse的maven 打包 安装在本地仓库 二 使用cmd命令行将jar包上传至maven私服 三 一二中已完成 另 将jar包安装在本地仓库 一 eclipse的maven 打包 安装在本地仓库 1 对po
  • logn是以什么为底_一文带你了解算法复杂度O(1),O(n),O(logn),O(nlogn)的含义

    相信很多开发的同伴们在研究算法 排序的时候经常会碰到O 1 O n O logn O nlogn 这些复杂度 看到这里就会有个疑惑 这个O N 到底代表什么呢 首先o 1 o n o logn o nlogn 是用来表示对应算法的时间复杂度
  • 【element中el-cascader使用及自定义key名】

    element中el cascader使用及自定义key名 下面展示一些 内联代码片 el cascader的通过改变值时 获取当前选中数据 根据接口返回数据 灵活定义key名 template中的应用 options为数据 1 props
  • mermaid

    Butterfly在不久的未来能支持mermaid https butterfly js org posts 4aa8abbe mermaid
  • Qt开发记录2——功能开发——按钮-打开缓存(打开本地文件夹)

    链接1 qt程序实现打开文件夹 链接2 QT5 利用QDesktopServices打开本地文件或文件夹 目录 打开缓存 打开本地文件夹 在UI界面拖拽一个按钮控件 转到槽 跳转到槽函数编写代码 打开缓存 打开本地文件夹 需求 选中扫描到本
  • dns提供商主机名_什么是FQDN?它和主机名有区别吗?

    请关注本头条号 每天坚持更新原创干货技术文章 如需学习视频 请在微信搜索公众号 智传网优 直接开始自助视频学习 1 前言 本文主要讲解什么是FQDN 什么是FQDN 2 FQDN的名词解释 完全限定域名fully qualified dom
  • (Python)计算平均值

    计算平均值 问题描述 从键盘输入三个整数 分别存入x y z三个整型变量中 计算并输出三个数的和以及平均值 输入形式 从键盘输入三个整数 整数之间以空格隔开 输出形式 在屏幕上分两行显示结果 第一行为三个数的和 整数形式输出 第二行为三个数
  • 数据库设计范式的理解

    文章来自 http www ccvita com 418 html 前言 为什么要写这篇文章呢 从去年年底开始 就和很多做技术的朋友交流过 从数据库设计到数据库架构各个方面的内容 有一些朋友执着于ORM 执着于所谓的数据库设计 却忘记了一切
  • 惠普服务器硬盘指示灯不亮或显示蓝色

    通过惠普服务器指示灯我们可以了解服务器当前的运行状态 指示灯不同的颜色和闪烁频率都代表不同的意义 那么惠普服务器硬盘指示灯不亮是什么原因导致的呢 如果已经在系统中安装了一个或多个硬盘 请检查下列各项 1 硬盘的电源线与信号线安装是否正确 2
  • 数仓面试总结

    2021年5月开始找工作 面试了若干个数仓的岗位 面的差不多也就2个 总结下大致的面试内容 一 字节视频面 上海的一个部门 视频面挂 小伙伴内推的 这个5月份面的 大概视频面试了一个小时 主要面试内容 1 问了mapreduce的具体执行过
  • MySQL减一年的日期函数_MySQL 日期加减函数汇总

    1 addtime 为日期加上指定秒数select addtime now 1 加1秒 2 adddate 有两种用法 第二个参数直接填数字的话是为日期加上指定天数 填interval的话是为日期加上指定的interval时间select
  • AI 预测世界杯比赛结果,惊掉下巴

    哈喽 大家好 今天看到Kaggle上有一个预测世界杯比赛结果的项目 截至目前 4 场比赛预测结果全中 今天把源码研究了一下 做了中文注释 给大家分享下 文章目录 技术提升 1 获取数据集 2 特征工程 3 建模 4 预测 技术提升 本文由技
  • 一文搞懂ARP协议

    更多文章请关注我的个人微信公众号 极客熊猫 欢迎扫码关注 什么是ARP ARP是Address Resolution Protocol的首字母缩写 即地址解析协议 如果一台主机要将一个帧发送到另一台主机 只知道这台主机的IP地址是不够的 还