计算机网络——ARP协议

前言

本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。

这篇博客是在B站掌芝士zzs这个UP主的视频的总结,讲的非常好。

可以先去看一篇视频,再来参考这篇笔记(或者说直接偷走)。

一条视频讲清楚什么是ARP协议-ARP攻击又是什么_哔哩哔哩_bilibili

前篇

  1. 计算机网络——MAC地址和IP地址-CSDN博客
  2. 计算机网络——交换机和路由器-CSDN博客
  3. 计算机网络——网络地址转换(NAT)技术-CSDN博客
  4. 计算机网络——TCP和UDP协议-CSDN博客
  5. 计算机网络——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查询步骤。

总结就是:

  1. 主机A需要发送数据到目标主机B,但只知道目标主机的IP地址。在发送数据之前,主机A首先检查本地的ARP缓存表,看是否已经有目标IP地址对应的MAC地址。如果有,则可以直接使用该MAC地址发送数据。
  2. 如果ARP缓存表中没有目标IP地址对应的MAC地址,主机A会发送一个ARP请求广播。ARP请求包含主机A的MAC地址、IP地址和目标IP地址,以及一个操作码,指示这是一个ARP请求。
  3. 所有收到ARP请求的主机都会检查目标IP地址是否与自己匹配。如果目标IP地址与自己匹配,则该主机会将自己的MAC地址作为响应发送给主机A。
  4. 主机A收到ARP响应后,会更新本地的ARP缓存表,将目标IP地址和MAC地址的映射关系存储起来。
  5. 主机A现在知道了目标主机B的MAC地址,可以使用该MAC地址发送数据包到目标主机B。
  6. 主机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地址绑定。这种方法虽然普通用户操作起来也有一定难度,但确实是最简单行之有效的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/543483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spark-机器学习(1)什么是机器学习与MLlib算法库的认识

从这一系列开始,我会带着大家一起了解我们的机器学习,了解我们spark机器学习中的MLIib算法库,知道它大概的模型,熟悉并认识它。同时,本篇文章为个人spark免费专栏的系列文章,有兴趣的可以收藏关注一下&…

双子座 Gemini1.5和谷歌的本质

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

流媒体的安全谁来保障

流媒体的安全谁来保障 说起媒体,我们马上就会想到报纸新闻、广播、电视。 其实所谓的流媒体同我们通常所指的媒体是不一样的, 它只是一个技术名词。流媒体到底是什么?能给我们的生活带来什么?跟小德一起来看看。 流媒体是什么&a…

缓存与数据库的数据一致性解决方案分析

在现代应用中,缓存技术的使用广泛且至关重要,主要是为了提高数据访问速度和优化系统整体性能。缓存通过在内存或更快速的存储系统中存储经常访问的数据副本,使得数据检索变得迅速,从而避免了每次请求都需要从较慢的主存储&#xf…

LeetCode 0705.设计哈希集合:很多人都是这样做的吧【逃】

【LetMeFly】705.设计哈希集合:很多人都是这样做的吧【逃】 力扣题目链接:https://leetcode.cn/problems/design-hashset/ 不使用任何内建的哈希表库设计一个哈希集合(HashSet)。 实现 MyHashSet 类: void add(key…

04-03 周三 使用印象笔记API批量更新笔记标题

04-03 周三 使用印象笔记API批量更新笔记标题 时间版本修改人描述2024年4月3日11:13:50V0.1宋全恒新建文档 简介 安利印象笔记 在阅读这篇博客之前,首先给大家案例一下印象笔记这个应用,楼主之前使用onenote来记录自己的生活的,也记录了许多…

UI设计规范

一套商城系统的诞生,除了代码的编写,UI设计也至关重要。UI设计关系到商城系统的最终呈现效果,关乎整体商城的风格展现,如果UI设计做不好,带来的负面影响也是不容小觑的。 1、在很多商城系统开发中,有时会有…

基于Java+Vue的校园代购服务管理系统(源码+文档+包运行)

一.系统概述 在新发展的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且学生越来越追求更个性的需求。在这种时代背景下,学生对校园代购服务订单管理越来越重视,更好的实现校园代购服务的有效发挥&#xf…

YOLTV8 — 大尺度图像目标检测框架(欢迎star)

YOLTV8 — 大尺度图像目标检测框架【ABCnutter/YOLTV8: 🚀】 针对大尺度图像(如遥感影像、大尺度工业检测图像等),由于设备的限制,无法利用图像直接进行模型训练。将图像裁剪至小尺度进行训练,再将训练结果…

Redis-更新策略,缓存穿透,缓存雪崩,缓存击穿

Redis-更新策略,缓存穿透,缓存雪崩,缓存击穿 1.缓存更新 策略 淘汰策略超时剔除主动更新 更新策略:先修改数据库还是先删除缓存 结论:先修改数据库,因为缓存的操作比较快,容易产生数据不一致更新缓存还是删除缓存? …

强化学习-Reinforcement learning | RL

目录 什么是强化学习? 强化学习的应用场景 强化学习的主流算法 强化学习是机器学习的一种学习方式,它跟监督学习、无监督学习是对应的。本文将详细介绍强化学习的基本概念、应用场景和主流的强化学习算法及分类。 什么是强化学习? 强化学习并不是某一种特定的算法,而是…

2001-2022年上市公司异常审计费用指标包含原始数据 参考顶刊文献含构造过程Stata代码

01、数据介绍 异常审计费用则是指实际审计费用超过或低于正常审计费用的部分,该部分审计费用受不可观测因素的影响,可能来源于审计师所付出的额外努力或者审计师与被审计单位间的特殊关系,也可能产生于被审计单位在审计买方市场中的优势地位…

(学习日记)2024.04.17:UCOSIII第四十五节:中断管理

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

【操作系统专题】详解操作系统 | 操作系统的目标和功能 | 操作系统如何工作

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.操作系统的目标和功能2…

【菜狗学前端】原生Ajax笔记(包含原生ajax的get/post传参方式、返回数据等)

这回图片少,给手动替换了~祝看得愉快,学的顺畅!哈哈 一 原生ajax经典四步 (一) 原生ajax经典四步 第一步:创建网络请求的AJAX对象(使用XMLHttpRequest) JavaScript let xhr new XMLHttpRequest() 第二…

为什么你的LDO输出不稳定?

原文来自微信公众号:工程师看海,与我联系:chunhou0820 看海原创视频教程:《运放秘籍》 大家好,我是工程师看海。 前一阵朋友和我说当初用某型号LDO时,发现输出异常,仔细阅读datasheet后&#x…

Clip下游任务解读

相关代码链接见文末 1.DALL-1 (1)VQGAN https://arxiv.org/pdf/2012.09841.pdf VQGAN(Vector Quantized Generative Adversarial Networks)是一种基于向量化量化的生成对抗网络。这种技术首先将图像转换为一系列向量,每个向量代表图像中的一小块区域(或称为“patch”)。…

在Mac上更好的运行Windows,推荐这几款Mac虚拟机 mac运行windows虚拟机性能

想要在Mac OS上更好的运行Windows系统吗?推荐你使用mac虚拟机。虚拟机通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以…

Linux的文件操作中的静态库的制作

Linux操作系统支持的函数库分为: 静态库,libxxx.a,在编译时就将库编译进可执行程序中。 优点:程序的运行环境中不需要外部的函数库。 缺点:可执行程序大 (因为需要 编译) 动态库&#xff0c…

自动化测试Junit

1.什么是Junit JUint是Java编程语言的单元测试框架,用于编写和运行可重复的自动化测试。 JUnit 促进了“先测试后编码”TDD的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比“测试一点,编码一…