计算机网络——ARP协议
前言
本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。
这篇博客是在B站掌芝士zzs这个UP主的视频的总结,讲的非常好。
可以先去看一篇视频,再来参考这篇笔记(或者说直接偷走)。
一条视频讲清楚什么是ARP协议-ARP攻击又是什么_哔哩哔哩_bilibili
前篇
- 计算机网络——MAC地址和IP地址-CSDN博客
- 计算机网络——交换机和路由器-CSDN博客
- 计算机网络——网络地址转换(NAT)技术-CSDN博客
- 计算机网络——TCP和UDP协议-CSDN博客
- 计算机网络——DHCP协议-CSDN博客
引言
想必大家时常会听到ARP协议、ARP攻击等概念。到底ARP协议是什么?
什么是ARP协议。
还是以写信举例子,经常写信的同学都知道,信封上有两个关键的字段需要填写,一个是收件人,一个是收件地址。
假设我只写收件人是张三,不知道张三的地址,那么这封信是无法寄到的。
在这种情况下,聪明的同学都会先打电话给张三,问一下张三的地址,然后填写到信封上,那么这封信就可以正常寄出了。
在网络世界中也是这样的,收件人就是IP地址,而收件地址就是MAC地址。
计算机每发出一包数据都需要填写数据链路层的源MAC、目标MAC和网络层的源IP、目标IP这四个参数。
一般情况下IP地址都是由用户指定的,源MAC是本机的,那目标MAC是如何获取的呢?
那就是ARP协议了。对应刚才举过的例子,ARP会帮我们打电话给目标IP并查询他的MAC地址。
所以总结一句话,ARP协议就是通过IP地址查询MAC地址的协议。
ARP帧结构
ARP帧结构的字段说明
下面是ARP数据帧的结构及各个字段的说明:
目的MAC地址(6字节):指示ARP请求或响应的目标设备的物理MAC地址。在ARP请求中,这个字段通常被设置为全0,表示请求的目标MAC地址未知。在ARP响应中,这个字段包含目标设备的真实MAC地址。
源MAC地址(6字节):指示ARP请求或响应的发送设备的物理MAC地址。
帧类型(2字节):指示数据帧中所携带的上层协议类型,对于ARP数据帧,该字段的值为0x0806。
硬件类型(2字节):指示硬件地址的类型,如以太网的硬件类型为1。
协议类型(2字节):指示上层协议类型,如IPv4的协议类型为0x0800。
硬件地址长度(1字节):指示硬件地址的长度,以字节为单位,如以太网的地址长度为6。
协议地址长度(1字节):指示协议地址的长度,以字节为单位,如IPv4地址的长度为4。
操作码(2字节):指示ARP请求或响应的类型,如请求为1,响应为2。
发送方硬件地址(6字节):指示ARP请求或响应的发送设备的物理MAC地址。
发送方协议地址(4字节):指示ARP请求或响应的发送设备的协议地址,如IPv4地址。
目标硬件地址(6字节):指示ARP请求或响应的目标设备的物理MAC地址。在ARP请求中,该字段通常被设置为全0,表示请求的目标MAC地址未知。在ARP响应中,该字段包含目标设备的真实MAC地址。
目标协议地址(4字节):指示ARP请求或响应的目标设备的协议地址,如IPv4地址。
要注意的是操作码(Opcode)字段,在ARP请求帧中,操作码字段的值为1,表示请求。而在ARP响应帧中,操作码字段的值为2,表示响应。目标MAC地址(Target MAC Address)字段,在ARP请求帧中,目标MAC地址字段被设置为全0,表示请求的目标MAC地址未知。而在ARP响应帧中,这个字段包含了目标设备的真实MAC地址。
ARP协议的工作流程
假设我们有一台计算机A它的IP地址是192.168.1.0。
现在计算机A需要向192.168.1.11发送一包UDP报文。
此时操作系统会把这一包UDP报文暂存,接着用ARP协议去查询对方的MAC地址。
主机A会通过网络向外广播一包ARP请求报文,请求报文中源MAC和源IP都是主机A的,目标MAC是要通过目标IP查询的,这时候,ARP协议中目标IP也就是192.168.1.11,目标MAC是一个全零的MAC地址。
注意这些是ARP协议的内容,属于网络层数据链路层的目标MAC地址是全F的地址,表示在数据链路层进行广播。
这一帧请求报文发出后会在网络中广播,网络中的所有计算机都可以收到这一帧请求报文。
收到报文的计算机会解析报文,查看目标IP地址。
如果跟自己的IP地址相同,那么说明自己需要对这一报文应答。
比如计算机B就是192.168.1.11,它收到后会生成一帧ARP回复报文,在回复报文中会填入自己的MAC地址。这一帧报文是使用单播的方式进行回复的。
回复报文被主机A收到后,从中解析出主机B的MAC地址,并把之前暂存的UDP数据取出,填入目标MAC地址后正常的发送,这样就完成了这帧UDP报文的发送。
当然并不是每次都需要执行这个查询步骤的,通过ARP协议查询到的MAC地址会写入到主机的ARP表中缓存起来,下次再往192.168.1.11发送数据,可以直接从ARP表中查询到其MAC地址即可。
若查询不到,才需要再执行上述的ARP查询步骤。
总结就是:
- 主机A需要发送数据到目标主机B,但只知道目标主机的IP地址。在发送数据之前,主机A首先检查本地的ARP缓存表,看是否已经有目标IP地址对应的MAC地址。如果有,则可以直接使用该MAC地址发送数据。
- 如果ARP缓存表中没有目标IP地址对应的MAC地址,主机A会发送一个ARP请求广播。ARP请求包含主机A的MAC地址、IP地址和目标IP地址,以及一个操作码,指示这是一个ARP请求。
- 所有收到ARP请求的主机都会检查目标IP地址是否与自己匹配。如果目标IP地址与自己匹配,则该主机会将自己的MAC地址作为响应发送给主机A。
- 主机A收到ARP响应后,会更新本地的ARP缓存表,将目标IP地址和MAC地址的映射关系存储起来。
- 主机A现在知道了目标主机B的MAC地址,可以使用该MAC地址发送数据包到目标主机B。
- 主机B收到数据包后,进行相应的处理和响应。
IP地址变更操作
比如当前网络中有3台主机,主机A、主机B和主机C,他们的IP分别是192.168.1.10 、192.168.1.11和192.168.1.12。
当前已经互相发现了对方,ARP表已经完成填充,并且通信也很正常。
这时我们把主机B和主机C的IP地址通过手动设置互换一下。
此时对于主机A来说,它的ARP表并没有发生变化,它将往192.168.1.11发送数据。
从ARP表查询到的是主机B的MAC地址,数据发送出去之后,这一帧数据会被送到主机B上。
实际上现在主机C的IP地址才是192.168.1.11,主机B收到这一帧数据后会直接丢弃。
实际上真实情况不是这样的。
我们先回到初始状态,在这种情况下,当设置完主机的IP地址后,操作系统会主动向网络中广播一包免费IP数据包。
这一包数据不需要回复,目的就是告诉网络中的所有其他主机,当前的IP地址和MAC地址的绑定关系。
每一台收到免费ARP的主机,自己更新自己的ARP表就好了。
这样网络中的其他设备几乎都能立即更新IP地址和MAC地址的映射关系了。
什么是ARP攻击?
假设我们现在有这么一个网络,这个网络中有多台计算机通过交换机互相通信,同时通过一台路由器连接到了互联网上。
假设路由器的IP地址是192.168.1.1,主机A的IP地址是192.168.1.10。
主机A所有访问互联网的数据包,不管是TCP协议还是UDP协议,都要通过路由器发送到互联网上。
也就是说在主机A上所有的数据包中,数据链路层的目标MAC地址都是路由器的MAC地址。
当然这个MAC地址也是通过ARP协议查询网关的IP192.168.1.1得到的。
假设此时网络中另一台主机,比如主机C它的IP是192.168.1.11,它一直在网络中广播一包免费ARP包,这帧IP报文中伪造了其IP地址是192.168.1.1(也就是路由器的MAC地址),MAC地址是自己这一帧,免费ARP包发送到网络中之后,相当于告诉网络中的其他主机192.168.1.1在我这里。
主机A收到后,按照我们上面讲的内容,主机A会误认为192.168.1.1的MAC地址改了,从而修改自己的ARP表。
这样所有正常通信的数据包填写的目标MAC地址都会变成主机C的MAC地址,这些数据包都会被发送到主机C上,从而导致主机A无法正常上网。
这就是一个典型的ARP攻击的案例。
发生ARP攻击后会导致网络中所有设备都无法正常访问。互联网防御ARP攻击是一件非常困难的事情,因为这种ARP欺骗报文无法有效的进行检测。
最简单的方法还是配置静态ARP,通过静态配置的方式将网关的IP地址和MAC地址绑定。这种方法虽然普通用户操作起来也有一定难度,但确实是最简单行之有效的方法。
相关文章:

计算机网络——ARP协议
前言 本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结,讲的非常好。 可以先去看一篇视频,再来参考这篇笔记(或者说直接偷走)。 …...

【C++]C/C++的内存管理
这篇博客将会带着大家解决以下几个问题 1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 1. C/C内存分布 我们先来看下面的一段代码和相关问题 int global…...

深入理解计算机网络分层结构
一、 为什么要分层? 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次,每个层次负责特定的功能。这样做有以下几个好处: 模块化设计:每个层次都有清晰定义的功能和接口,使得网络系统更易于设…...

亚马逊云科技CTO带你学习云计算降本增效秘诀
2023亚马逊云科技一年一度的重磅春晚--Re:invent上有诸多不同话题的主题Keynote,这次小李哥带大家复盘来自亚马逊CTO: Wener博士的主题演讲: 云架构节俭之道1️⃣节俭对于云计算为什么重要? ▶️企业基础设施投入大,利用好降本策略可以减少巨…...

快速上手Vue
目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面:基于数据渲染出用户看到的页面 渐进式:Vue相关生态:声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…...
java 目录整理
Java知识相关目录主要参考黑马程序员 风清扬老师的视屏,参考链接为 Java_黑马刘意(风清扬)2019最新版_Java入门视频_Java入门_Java编程_Java入门教程_黑马教程_黑马程序员_idea版_哔哩哔哩_bilibili 1、java 基础 java基本认识?java跨平台原理?jdk、jre、jvm的联系? 链接:…...

使用Python的Pillow库进行图像处理书法参赛作品
介绍: 在计算机视觉和图像处理领域,Python是一种强大而流行的编程语言。它提供了许多优秀的库和工具,使得图像处理任务变得轻松和高效。本文将介绍如何使用Python的wxPython和Pillow库来选择JPEG图像文件,并对选中的图像进行调整和…...
docker 容器指定utf-8编码
在运行 Docker 容器的时候,如果容器内应用需要使用 UTF-8 编码来正常处理中文,你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如,设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8:…...

单例模式以及常见的两种实现模式
单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”,按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例,如果创建出了多个实例,就会编译报错。而不会创建出多个实…...
Java hashCode() 和 equals()的若干问题解答
Java hashCode() 和 equals()的若干问题解答 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equals() 之间有什么联系? …...
高级IO——React服务器简单实现
3.4Reactor服务器实现 1.connect封装 每一个连接都要有一个文件描述符和输入输出缓冲区,还有读、写、异常处理的回调方法; 还包括指向服务器的回指指针; class connection; class tcpserver;using func_t std::function<void(s…...

Qt使用插件QPluginLoader 机制开发
简介: 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。 Qt 提供了2种APIs来创建插件: 一种高级API,用于为Qt本身编写插件:自定义数据库驱动程序,图像格…...

双子座 Gemini1.5和谷歌的本质
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

二百三十、MySQL——MySQL表的索引
1 目的 梳理一下目前MySQL维度表的索引情况,当然网上也有其他博客专门讲MySQL索引的,我这边只是梳理一下目前的索引状况而已 2单列索引 2.1 索引截图 2.2 建表语句 3 联合索引 3.1 索引截图 3.2 建表语句 4 参考的优秀博客 http://t.csdnimg.cn/ZF7…...

并发编程之ThreadLocal使用及原理
ThreadLocal主要是为了解决线程安全性问题的 非线程安全举例 public class ThreadLocalDemo {// 非线程安全的private static final SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static Date parse(String strDate) throws ParseExc…...

软件测试 测试开发丨Pytest结合数据驱动-yaml,熬夜整理蚂蚁金服软件测试高级笔试题
编程语言 languages: PHPJavaPython book: Python入门: # 书籍名称 price: 55.5 author: Lily available: True repertory: 20 date: 2018-02-17 Java入门: price: 60 author: Lily available: False repertory: Null date: 2018-05-11 yaml 文件使用 查看 yaml 文件 pych…...

软考数据库---2.SQL语言
主要记忆:表、索引、视图操作语句;数据操作;通配符、转义符;授权;存储过程;触发器 这部分等等整理一下: “”" 1、 数据定义语言。 SQL DDL提供定义关系模式和视图、 删除关系和视图、 修改关系模式的…...

基于顺序表实现通讯录
上篇我们讲了顺序表是什么,和如何实现顺序表。这篇文章我们将基于顺序表来实现通讯录。 文章目录 前言一、基于顺序表是如何实现的二、通讯录的头文件和实现文件三、通讯录的实现3.1 定义通讯录结构3.2 初始化通讯录3.3 销毁通讯录3.4 通讯录添加数据3.5 查找联系人…...

咸鱼之王_手游_开服搭建架设_内购修复无bug运营版
视频演示 咸鱼之王_手游_开服 游戏管理后台界面 源码获取在文章末尾 源码获取在文章末尾 源码获取在文章末尾 或者直接下面 https://githubs.xyz/y28.html 1.安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…...

【JSON2WEB】14 基于Amis的CRUD开发30分钟速成
【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...

虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)
当我们网关配置好了,DNS也配置好了,最后在虚拟机里还是无法访问百度的网址。 第一种情况: 我们先考虑一下,网关的IP是否和虚拟机编辑器里的IP一样不,如果不一样需要更改一下,因为我们访问百度需要从物理机…...