【Linux网络】ARP协议
ARP协议
虽然我们在这里介绍 ARP 协议,但是需要强调,ARP 不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。
ARP数据报的格式
字段 | 长度(字节) | 说明 |
---|---|---|
硬件类型 | 2 | 网络类型(如以太网为1) |
协议类型 | 2 | 上层协议(如IP为0x0800) |
硬件地址长度 | 1 | MAC地址长度(以太网为6) |
协议地址长度 | 1 | IP地址长度(IPv4为4) |
操作码 | 2 | 1=请求,2=响应,3=反向请求(RARP),4=反向响应 |
发送方MAC地址 | 6 | 发送方物理地址 |
发送方IP地址 | 4 | 发送方IP地址 |
目标MAC地址 | 6 | 目标物理地址(请求时为全0或广播,响应时为目标主机MAC) |
目标IP地址 | 4 | 目标IP地址 |
- 注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的;
- 硬件类型指链路层网络类型,1 为以太网;
- 协议类型指要转换的地址类型,0x0800 为 IP 地址;
- 硬件地址长度对于以太网地址为 6 字节;
- 协议地址长度对于和 IP 地址为 4 字节;
- op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。
ARP协议的作用
ARP 协议建立了主机 IP 地址和 MAC 地址的映射关系。
- 在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
- 因此在通讯前必须获得目的主机的硬件地址。
ARP协议的工作流程
1. 发送ARP请求(广播阶段)
- 触发条件:当主机A需要向主机B发送数据时,先检查自己的ARP缓存表(存储IP-MAC映射关系):
- 若存在主机B的IP-MAC映射 → 直接使用MAC地址封装数据帧。
- 若不存在映射 → 发起ARP请求。
- 具体步骤:
- 构造ARP请求报文:
- 硬件类型:标识网络类型(如以太网为1)。
- 协议类型:标识上层协议(如IP为0x0800)。
- 发送方MAC地址:主机A的MAC地址(源物理地址)。
- 发送方IP地址:主机A的IP地址(源IP)。
- 目标MAC地址:全0(或FF-FF-FF-FF-FF-FF,广播地址)。
- 目标IP地址:主机B的IP地址(待解析的IP)。
- OP:设置为1
- 广播发送:主机A将ARP请求以广播帧形式发送到局域网,所有主机均可接收。
- 构造ARP请求报文:
2. 接收ARP请求并响应(单播阶段)
- 首先判断OP字段,是否为请求MAC帧
- 主机B的处理:
- 收到广播请求后,检查报文中的“目标IP地址”是否为自己的IP:
- 若是 → 确认主机A的IP-MAC映射,将其存入自己的ARP缓存表。
- 构造ARP响应报文(单播),包含自身的MAC地址,发送给主机A。
- 收到广播请求后,检查报文中的“目标IP地址”是否为自己的IP:
- 其他主机的处理:
- 若目标IP不是自己的IP → 忽略该请求,不做响应。
3. 主机A更新ARP缓存表
- 主机A收到主机B的单播响应后,解析出主机B的MAC地址,存入ARP缓存表,后续通信直接使用该MAC地址封装数据帧。
总结:
- 源主机发出 ARP 请求,询问“IP 地址是 192.168.0.1 的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播);
- 目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中;
- 每台主机都维护一个 ARP 缓存表,可以用
arp -a
命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。
$ arp -a
_gateway (10.2.8.1) at fe:ee:7e:91:aa:82 [ether] on eth0
为什么要有缓存表?
- 提高效率
- 加快响应速度
为什么表项要有过期时间而不是一直有效?
- 网络环境变化:网络中的设备可能会发生变动,如更换网卡、修改 IP 地址或更换设备等。
- 安全性考虑:ARP 协议存在被攻击的风险,如 ARP 欺骗。
ARP缓存表的管理
- 作用:存储IP地址与MAC地址的映射关系,避免重复发送ARP请求,提高通信效率。
- 特性:
- 时效性:表项有生存周期(通常为几分钟,可通过
arp -s
手动设置),超时后自动删除,确保映射关系更新。 - 手动操作:
arp -a
:查看本地ARP缓存表。arp -d <IP>
:删除指定IP的缓存项。arp -s <IP> <MAC>
:手动添加静态映射(用于网关或关键设备,避免动态解析失败)。
- 时效性:表项有生存周期(通常为几分钟,可通过
ARP协议的扩展与变种
1. 免费ARP(Gratuitous ARP)
- 场景:主机主动发送ARP请求(即使不需要通信),用于:
- 宣告自身存在(如服务器启动后)。
- 检测IP地址冲突(主机发送自己IP的ARP请求,若收到响应则说明IP被占用)。
2. ARP代理(Proxy ARP)
- 场景:当主机位于不同子网,但未配置路由器时,由中间设备(如路由器)代替目标主机回应ARP请求,使主机误以为对方在同一子网。
- 风险:可能导致路由混乱,通常用于老旧网络环境。
3. ARP欺骗(ARP Poisoning)
- 攻击原理:恶意主机伪造ARP响应,将错误的MAC地址注入其他主机的缓存表,导致数据流向攻击者而非目标主机(用于中间人攻击)。
- 防御措施:
- 静态绑定关键设备的IP-MAC映射(如网关)。
- 使用ARP检测工具(如
arpwatch
)监控异常ARP流量。 - 启用交换机的端口安全或DHCP Snooping功能。
ARP协议与RARP的区别
- ARP:已知IP地址,求MAC地址(正向解析)。
- RARP(反向地址解析协议):已知MAC地址,求IP地址(已逐渐被DHCP取代)。
通过以上过程,ARP协议实现了IP地址到MAC地址的动态解析,是局域网通信的基础。理解其工作原理有助于排查网络连通性问题(如“arp -a”检查缓存是否正确),并防范ARP欺骗等安全威胁。
ARP欺骗原理
ARP欺骗的本质
ARP欺骗通过伪造ARP报文,篡改局域网内设备的ARP表,使目标设备错误地将数据包发送到攻击者控制的MAC地址,从而实现中间人攻击、流量窃取或阻断通信。
ARP欺骗的常见类型与原理
1. 单向欺骗(欺骗目标主机)
- 攻击方式:
攻击者(主机X)伪造ARP响应报文,向目标主机(如主机A)发送虚假的“IP地址Y对应的MAC地址是X的MAC”。 - 结果:
主机A的ARP表被篡改,误以为主机Y的MAC地址是攻击者的MAC。当主机A向主机Y发送数据时,数据包会先发给攻击者,而非真实主机Y。
2. 双向欺骗(欺骗目标主机和网关)
- 攻击方式:
- 攻击者向目标主机发送伪造的“网关IP对应的MAC是攻击者MAC”的ARP报文。
- 同时向网关发送伪造的“目标主机IP对应的MAC是攻击者MAC”的ARP报文。
- 结果:
- 目标主机与网关之间的流量全部经过攻击者中转,形成中间人攻击。
- 攻击者可窃取、篡改或阻断双方通信数据。
3. 泛洪攻击(ARP缓存污染)
- 攻击方式:
攻击者向局域网内大量发送伪造的ARP报文,使所有主机的ARP表被无效的IP-MAC映射填满。 - 结果:
设备无法建立正确的ARP表,导致网络瘫痪或通信中断。
四、ARP欺骗的攻击步骤(以双向欺骗为例)
- 获取目标信息:
攻击者通过扫描工具获取局域网内目标主机的IP地址和网关IP。 - 伪造ARP报文:
使用工具(如arpspoof
)向目标主机和网关发送伪造的ARP响应,篡改双方的ARP表。 - 中转流量:
攻击者开启IP转发功能,使目标主机与网关的流量通过自己的设备中转,同时窃取或修改数据。 - 维持欺骗:
定期发送伪造ARP报文,防止目标设备因ARP缓存超时恢复正常映射。
五、ARP欺骗的危害
- 数据窃取:攻击者可捕获明文传输的账号密码、聊天内容等敏感信息。
- 流量篡改:篡改网页内容、植入恶意代码(如钓鱼页面)。
- 拒绝服务(DoS):通过ARP泛洪攻击导致网络瘫痪。
- 隐蔽攻击跳板:利用欺骗建立的中间人通道,进一步渗透内网其他设备。
相关文章:

【Linux网络】ARP协议
ARP协议 虽然我们在这里介绍 ARP 协议,但是需要强调,ARP 不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。 ARP数据报的格式 字段长度(字节)说明硬件类型2网络类型(如以太网为…...

MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试
视频讲解: MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试 继续玩MUSE Pi Pro,今天看下比较关注的gpu这块,从opencl看起,安装clinfo指令 sudo apt install clinfo 可以看到这颗GPU是Imagination的 一般嵌入式中gpu都和hos…...

多线程与线程互斥
我们初步学习完线程之后,就要来试着写一写多线程了。在写之前,我们需要继续来学习一个线程接口——叫做线程分离。 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法…...
使用Spring Boot和Spring Security构建安全的RESTful API
使用Spring Boot和Spring Security构建安全的RESTful API 引言 在现代Web开发中,安全性是构建应用程序时不可忽视的重要方面。本文将介绍如何使用Spring Boot和Spring Security框架构建一个安全的RESTful API,并结合JWT(JSON Web Token&…...

游戏引擎学习第287天:加入brain逻辑
Blackboard:动态控制类似蛇的多节实体 我们目前正在处理一个关于实体系统如何以组合方式进行管理的问题。具体来说,是在游戏中实现多个实体可以共同或独立行动的机制。例如,我们的主角拥有两个实体组成部分,一个是身体࿰…...

continue通过我们的开源 IDE 扩展和模型、规则、提示、文档和其他构建块中心,创建、共享和使用自定义 AI 代码助手
一、软件介绍 文末提供程序和源码下载 Continue 使开发人员能够通过我们的开源 VS Code 和 JetBrains 扩展以及模型、规则、提示、文档和其他构建块的中心创建、共享和使用自定义 AI 代码助手。 二、功能 Chat 聊天 Chat makes it easy to ask for help from an LLM without…...

2025年EB SCI2区TOP,多策略改进黑翅鸢算法MBKA+空调系统RC参数辨识与负载聚合分析,深度解析+性能实测
目录 1.摘要2.黑翅鸢优化算法BKA原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 随着空调负载在电力系统中所占比例的不断上升,其作为需求响应资源的潜力日益凸显。然而,由于建筑环境和用户行为的变化,空调负载具有异质性和…...

.NET 中管理 Web API 文档的两种方式
前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性、可维护性和一致性的关键。今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式,希望可以帮助到有需要的同学。 Swashbuckle Swashbuckle.AspNetCore 是一个流行的 .NET 库,它使得在 AS…...
常见三维引擎坐标轴 webgl threejs cesium blender unity ue 左手坐标系、右手坐标系、坐标轴方向
平台 / 引擎坐标系类型Up(上)方向Forward(前进)方向前进方向依据说明Unity左手坐标系YZtransform.forward 是 Z 轴正方向,默认摄像机朝 Z 看。Unreal Engine左手坐标系ZXUE 的角色面朝 X,默认使用 GetActor…...

【HTML】个人博客页面
目录 页面视图编辑 页面代码 解释: HTML (<body>): 使用了更加语义化的HTML5标签,例如<header>, <main>, <article>, <footer>。文章列表使用了<article>包裹,结构清晰。添加了分页导航。使用了Font…...

论文解读:ICLR2025 | D-FINE
[2410.13842] D-FINE: Redefine Regression Task in DETRs as Fine-grained Distribution Refinement D-FINE 是一款功能强大的实时物体检测器,它将 DETRs 中的边界框回归任务重新定义为细粒度分布细化(FDR),并引入了全局最优定位…...

9.DMA
目录 DMA —为 CPU 减负 DMA 的简介和使用场景 DMA 的例子讲解 STM32 的 DMA 框图和主要特性 编辑 DMA 的通道的对应通道外设 – DMA 和哪些外设使用 编辑编辑ADC_DR 寄存器地址的计算 常见的数据滤波方法 ADCDMA 的编程 DMA —为 CPU 减负 DMA 的简介和使用场…...

大语言模型 10 - 从0开始训练GPT 0.25B参数量 补充知识之模型架构 MoE、ReLU、FFN、MixFFN
写在前面 GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,…...

python基础语法(三-中)
基础语法3: 2.列表与元组: <1>.列表、元组是什么? 都用来存储数据,但是两者有区别,列表可变,元组不可变。 <2>.创建列表: 创建列表有两种方式: [1].a 【】&#x…...
【gitee 初学者矿建仓库】
简易的命令行入门教程: Git 全局设置: git config --global user.name "你的名字"触摸 git config --global user.email "你的邮箱"创建 git 仓库: mkdir codestore cd codestore git init -b "main" touch README.md # 选择运行 git add REA…...
思路收集文档
降低工作量思路 nodejsjava混合网站开发...
OpenCV 光流估计:从原理到实战
在计算机视觉领域,光流估计(Optical Flow Estimation)是一项至关重要的技术,它能够通过分析视频序列中图像像素的运动信息,捕捉物体和相机的运动情况。OpenCV 作为强大的计算机视觉库,为我们提供了高效实现…...
使用HtmlAgilityPack采集墨迹天气中的天气数据
需要解析对应的HTML源码: <div class"left"><div class"wea_alert clearfix"><ul><li><a href "https://tianqi.moji.com/aqi/china/jiangxi/hukou-county" >< span class"level level_2&qu…...

ZTE 7551N 中兴小鲜60 远航60 努比亚小牛 解锁BL 刷机包 刷root 展讯 T760 bl
ZTE 7551N 中兴小鲜60 远航60 努比亚小牛 解锁BL 刷机包 刷root 3款机型是一个型号,包通用, ro.product.system.modelZTE 7551N ro.product.system.nameCN_P720S15 #################################### # from generate-common-build-props # Th…...
SearxNG本地搜索引擎
SearxNG 是一个强大、开源的 元搜索引擎(meta search engine),它不会存储用户信息,注重隐私保护,并支持从多个搜索引擎聚合结果,用户可以自建部署,打造一个无广告、可定制的搜索平台。 🔍 什么是 SearxNG? SearxNG 是 Searx 的一个积极维护的分支(fork),意在改进…...
MyBatis 核心组件源码分析
MyBatis 作为 Java 领域最受欢迎的持久层框架之一,以灵活的 SQL 映射和强大的扩展性著称。要真正驾驭 MyBatis,深入理解其核心组件的源码实现是关键。本文将通过源码分析,结合图文并茂的方式,带大家揭开 MyBatis 核心组件的神秘面纱。 1.SqlSessionFactory:会话工厂的核心…...

信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)
个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的,做计算题要保持头脑清晰,认真读题把PV、…...
stack和queue简单模拟实现
stackreverse_iteratorqueuepriority_queue仿函数具体代码 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…...
如何安装双系统?即windows已经安装,如何安装ubuntu 22.04LTS
在已安装 Windows 的电脑上安装 Ubuntu 22.04 LTS 双系统,需通过 分区调整、UEFI/BIOS 设置 和 引导管理 实现。以下是详细步骤: 一、准备工作 备份数据 • 备份 Windows 中的重要文件(防止分区操作失误导致数据丢失)。 下载 Ubu…...

产品经理入门(2)产品体验报告
产品体验报告大纲:重点在产品体验——优点。 1.产品概括 可以从各大平台搜产品介绍。 2.市场分析 按照产品方向分析各个指标——包括有效使用时间,市场规模等。 3. 用户分析——对用户通过各项指标画像。 4.产品体验——对各项功能与设计的体验。 5.报告总结...

C43-指针与数组
一 定义一个指针变量指向数组 1.途径一:指向数组首元素的地址 代码示例: #include <stdio.h> int main() {int arr[3]{2,4,5};int *p;p&arr[0];printf("该数组的首元素是:%d",*p);return 0; }成果展示: 报错与总结: 给指针变量赋值时,未在数组首元素前输…...

UDP--DDR--SFP,FPGA实现之ddr读写控制模块
DDR读写控制模块实现介绍 由于该模块接口数量较多,为了详细说明模块实现,采用文字流程进行介绍 上级模块传输数据到来捕捉数据有效上升沿传输写指令,写有效,写指令成功被下一级模块缓存,进行写地址一次读写长度&…...

云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(上)
在云应用/服务的 5 层架构里,数据库服务层稳坐第 4 把交椅,堪称其中的 “硬核担当”。它的复杂程度常常让人望而生畏,不少人都将它视为整个架构中的 “终极挑战”。 不过,也有人觉得可扩展存储系统才是最难啃的 “硬骨头”&#…...

AI Agent | Coze 插件使用指南:从功能解析到实操步骤
一、前言 在人工智能技术飞速发展的今天,低代码开发模式正成为构建智能应用的主流趋势。对于希望快速搭建 AI Bot 的开发者和业务人员而言,coze作为一款强大的低代码 AI 开发平台,凭借其高度模块化的插件体系脱颖而出。这些插件就像搭建智能…...
06、基础入门-SpringBoot-依赖管理特性
06、基础入门-SpringBoot-依赖管理特性 Spring Boot 的依赖管理特性是其核心优势之一,极大地简化了项目的构建和维护过程。以下是其主要特点: ## 1. 父项目依赖管理 ### 1.1 继承 spring-boot-starter-parent 在 pom.xml 文件中,通过继承 spr…...