计算机网络——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地址绑定。这种方法虽然普通用户操作起来也有一定难度,但确实是最简单行之有效的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV4.9​​​​基本阈值操作

目标 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::threshold 执行基本阈值操作 理论依据 注意 下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书 阈值? 最简单的分割方法应用示例:分…

步骤大全:网站建设3个基本流程详解

一.领取一个免费域名和SSL证书,和CDN 1.打开网站链接:https://www.rainyun.com/z22_ 2.在网站主页上,您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册",然后选择"微信登录"选项。 4.使用您的…

Claude3和GPT4哪个强?

在短短两个月内,全球最强人工智能的桂冠再次易主。此前,Claude3 Opus以其卓越的表现超越了GPT-4,吸引了无数用户抛弃GPT,转而拥抱Claude3。然而,OpenAI近日强势回归,用实力证明了GPT依然是人工智能领域的霸…

Jmeter杂记:测试计划参数详解

测试计划各参数详解 1,用户自定义变量,是全局变量,供所有线程组使用,可用配置元件:用户自定义变量替代 2,连续的运行线程组,默认不勾选,则随机的运行多个线程组中的取样器&#xff…

图机器学习NetworkX代码实战-创建图和可视化

完整代码见资源,下面列举了其中的几个图 安装networkX及相应工具包 pip install numpy pandas matplotlib tqdm networkx 当安装完成后,输入如下代码验证版本及是否安装成功 import networkx as nxnx.__version__ import matplotlib.pyplot as plt …

国内ai人工智能软件大全

很多人一直在寻找一个稳定且可靠的全球AI大模型测试平台,希望它不仅真实可信,而且能提供稳定、快速的服务,不会频繁出现故障或响应缓慢。迄今为止,我已经尝试了国内外至少10个不同的服务站点。不幸的是,这些站点总是存…

Linux 文件页反向映射

0. 引言 操作系统中与匿名页相对的是文件页,文件页的反向映射对比匿名页的反向映射更为简单。如果还不清楚匿名页反向映射逻辑的,请移步 匿名页反向映射 1. 文件页反向映射数据结构 struct file: 用户进程每open()一次文件,则会生…

分享一个 git stash 的实际使用场景。

当我将新的变更记录提交为 git commit --amend 后,发现这需要修改云端上的提交记录,也就是 vscode 中会出现这张图 于是,我通过 git reset head^ 撤销掉刚刚的提交。 reset 前: reset 后: 但在撤销的同时&#xf…

深入理解计算机网络分层结构

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

解决Xshell登录云服务器的免密码和云服务器生成子用户问题

Xshell登录云服务器的免密码问题 前言一、Xshell登录云服务器的免密码操作实践 二、centos创建用户创建用户实操删除用户更改用户密码直接删除子用户 前言 Xshell登录云服务器免密码问题的解决方案通常涉及使用SSH密钥对。用户生成一对密钥(公钥和私钥)…

Spring源码刨析之配置文件的解析和bean的创建以及生命周期

public void test1(){XmlBeanFactory xmlBeanFactory new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));user u xmlBeanFactory.getBean("user",org.xhpcd.user.class);// System.out.println(u.getStu());}先介绍一个类XmlBeanFac…

Linux —— FTP服务【从0-1】

目录 一、介绍 1.概述 2.FTP的传输模式 PORT 主动模式 PASV 被动模式 3.FTP服务的作用 二、搭建FTP服务器 FTP服务端配置 1.安装vsftpd文件服务 2.启动服务 3.防火墙配置 4.FTP服务相关文件说明 FTP客户端配置 1.安装FTP客户端工具 lftp 2.访问FTP服务器 Linux系…

深度学习图像处理基础工具——opencv 实战2 文档扫描OCR

输入一个文档,怎么进行文档扫描,输出扫描后的图片呢? 今天学习了 opencv实战项目 文档扫描OCR 问题重构:输入图像 是一个含有文档的图像——> 目标是将其转化为 规则的扫描图片 那么怎么实现呢? 问题分解&#…

Python 复杂密码图形化生成工具,支持选择生成10位和12位复杂密码(初版)

代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2024/3/26 15:22 # Author : wyq # File : 部署测试.py import random import string from tkinter import *def generate_password(length):characters string.ascii_letters string.digits string.p…

【vue】Vue3开发中常用的VSCode插件

Vue - Official:vue的语法特性,如代码高亮,自动补全等 Vue VSCode Snippets:自定义一些代码片段 v3单文件组件vdata数据vmethod方法 别名路径跳转 参考 https://www.bilibili.com/video/BV1nV411Q7RX

学校4-11天梯赛选拔赛

目录 L1-5 6翻了 题目 输入格式: 输出格式: 输入样例: 输出样例: 思路 AC代码 L1-1 嫑废话上代码 题目 输入格式: 输出格式: 输入样例: 输出样例: AC代码 L1-8 刮刮彩…

深入了解边缘AI的发展

人工智能先进功能的融合、物联网设备的广泛采用以及边缘计算的强大性能释放了边缘AI的潜力。这种变革性的协同作用涵盖了辅助医疗诊断、自动驾驶和仓库物流自动化等应用。 边缘计算起源于1990年代的内容分发网络,现在被广泛使用,尤其是在边缘AI领域。企…

Vue入门:天不生Vue,前端万古如长夜 - Vue从入门到放弃

👋 Vue环境搭建 首先,搭一个打代码的环境 1.安装node.js 在使用VS Code之前,需要安装Vue的开发环境。 安装Vue的最简单方法是使用npm包管理器,先安装Node.js和npm。 node官网 ​​ 2.配置环境变量 在nodejs安装目录下新建…

免费分享Springboot+Vue的影院管理系统源码,真酷!

今天给大家分享一套基于SpringbootVue的影院管理系统源码,在实际项目中可以直接复用。(免费提供,文末自取) 一、系统运行图 1、登陆页面 2、系统后台 3、选座功能 影院管理系统通常具有以下七个功能点: 1.电影管理: 包括电影信…

c++ - 动态载入DLL接口,可以给IDA静态分析增加一点麻烦

文章目录 c - 动态载入DLL接口,可以给IDA静态分析增加一点麻烦概述笔记测试工程test_load_dll_then_call_api.cppCMyUser32Dll.hCMyUser32Dll.cppLateLoad.hIDA静态分析引入表中没有PostMessageW字符串查找能找到PostMessageW备注看看CMyUser32Dll.h编译完的样子备注…