前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >TCP/IP协议簇中ARP协议

TCP/IP协议簇中ARP协议

作者头像
网络工程师笔记
发布于 2021-05-17 06:40:19
发布于 2021-05-17 06:40:19
9120
举报

1、ARP协议简介

在《IP协议》中我们讲解了IP地址相关内容,IP协议中包含了目的IP地址和源IP地址,但是当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。设备驱动程序从不检查IP数据报中的目的IP地址。

还记得数据链路层的以太网的协议中,每一个数据包都有一个MAC地址头么?我们知道每一块以太网卡都有一个MAC地址,这个地址是唯一的,那么IP包是如何知道这个MAC地址的?这就是ARP协议的工作。

在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。ARP协议数据哪一层,不同的资料有不同的说法,这里不作重点讨论。

ARP(地址解析)协议是一种解析协议,本来主机是完全不知道这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(就是一个IP-MAC地址对应表缓存),如果查询的IP-MAC值存不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机,而广播主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。

2、ARP协议结构

之前的文章《以太网数据包结构》可以看出图表示ARP协议的数据结构。

这里先看一下典型的ARP包的组成结构。

前面12个字节是MAC地址,在《以太网数据包结构》文章中讲解过,接下来是帧类型,其中0806表示是ARP协议帧。接下来,就是ARP数据包部分了,第一个硬件类型字段表示发送方想要知道的硬件接口类型硬件,对于以太网MAC地址,它的值应该为1。协议类型字段表示要映射的协议地址类型,它的值为0x0800时,即表示要映射为IP地址,可以看出,该值与以太网数据帧头中类型字段的值使用相同的一组值。

接下来的两个单字节长度的字段,称为硬件地址长度和协议地址长度,它们分别指出硬件地址和协议地址的长度,长度单位为字节。对于以太网上ARP请求或应答来说,它们的值分别为6和4,代表MAC地址的长度和IP地址的长度。在ARP协议包中留出硬件地址长度字段和协议地址长度字段可以使得ARP协议在任何网络中被使用,而不仅仅只在以太网中。

操作字段op指出ARP数据包的类型,它们可以是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4),这里我们只关心前两个类型。RARP为逆地址解析协议,这里简单说一下,RARP用于主机启动时获得自己的IP地址。这个过程很简单:主机启动时,广播发送一个RARP请求数据包,数据包中包含了自身的MAC地址,然后等待响应。网络中另一台主机必须设置为监听RARP请求状态,并在收到请求后为该主机分配一个IP地址并返回RARP应答给主机,一旦收到应答,主机就有了IP地址,就可以在后续中使用了。

接下来的四个字段是发送端的以太网MAC地址、发送端的IP地址、目的端的以太网MAC地址和目的端的IP地址。

关于PAD填充字节,请看《以太网数据包结构》有讲解。

注意:在以太网的数据帧头部中和ARP数据包中都有发送端的以太网MAC地址。对于一个ARP请求包来说,除接收方以太网地址外的所有字段都应该被填充相应的值。当接收方主机收到一份给自己的ARP请求报文后,它就把自己的硬件地址填进去,然后将该请求数据包的源主机信息和目的主机信息交换位置,并把操作字段op置为2,最后把该新构建的数据包发送回去,这就是ARP应答。

3、wireshark抓包分析

假设查询IP为192.168.0.103的MAC地址,使用如下命令

arp -a 192.168.0.103

抓包分析

这里分享下wireshark的抓包文件

链接:https://pan.baidu.com/s/1AWPj85Jb4nmLY8h2yJucUA 提取码:bxjq

(提示:公众号不支持外链接,请复制链接到浏览器下载)

4、ARP协议分类

ARP数据包的种类有两种:

一是ARP请求包,它是通过以太网广播的方式发送的,用于向具有某个IP地址的主机发送请求,希望该主机返回其MAC地址;

二是ARP应答包,收到ARP请求的主机会比对该数据包中的IP地址与自己的IP地址是否符合,若是,则该主机向源主机返回一个ARP应答包,向源主机报告自己的MAC地址。源主机通过提取ARP应答包中的相关字段来更新ARP缓存表。

一个典型的arp缓存信息如下,在任意一个系统里面用“arp-a”命令:

都会得到这样的结果。这样的高速缓存是有时限的,一般是20分钟(伯克利系统的衍生系统)。

5、ARP协议应用

基础知识:路由下有两个设备,他们相互知道对方IP和MAC,但是他们不能直接通讯,需要路由做转发,如果两个设备直接用网线连起来,就是直接通讯。

举个栗子

路由下有两个设备,首先一点:每个设备(包括路由),都有自己的ARP缓存表。设备A向局域网下设备B通讯(A设备知道B设备的IP)

情况1:A知道B的MAC地址,也就是在自己的ARP缓存表有设备B,直接封包,交给路由就好。

情况2:A不知道B的MAC地址,也就是在自己的ARP缓存表没有设备B,此时比较不幸,发送数据需要延时发送,首先设备A会向网关(就是路由)ARP请求包(以太网目的地址是FF-FF-FF-FF-FF-FF),这时候分情况A和B。

情况A:路由知道设备B的MAC,也就是自己的ARP缓存表有设备B,把自己的知道的设备B的IP和MAC返给设备A,设备A更新一下,自己的ARP缓存表,按情况1处理。

情况B:路由不知道设备B的MAC,路由就在自己的局域网发送,ARP请求包,去问设备B的MAC。得到之后,再发送给A。A得到MAC地址后按照情况1处理。

上述情况说明,想要网络设备第一次就通讯流畅,必须要局域网内的设备都知道自己的MAC地址,在网络设备开发中我们一般在网络设备首次接入网络后,首先向局域网广播自己的<IP,MAC>地址信息,称为无回报(gratuitous)ARP请求,这样的一个ARP数据包将告诉其他主机关于自己的信息,其他主机根据各自收到的ARP包更新自己的ARP表项。上文中提到的伯克利系统的衍生系统,ARP的缓存表一般存储20分钟,如果不及时更新,主机会删除“离线”设备的ARP表,因为主机ARP缓存表内存有限,不可能存储无限的ARP表信息。针对这种情况,我们开发网络设备,需要每隔一段时间广播一下自己的<IP,MAC>地址信息,表示自己“还活着”。但是不能太过频繁发送,频繁发送会被部分型号的路由认为是病毒。

6、ARP攻击

上一篇《IP协议》讲解了IP攻击,接下来讲解下我们常听的ARP攻击。

ARP协议有一个很大的漏洞,如果网络中的所有用户都规规矩矩,按照上述流程使用ARP就不会存在任何问题。但如果有恶意的设备收到一个ARP请求包(ARP请求包是广播形式发送的,局域网所有主机都可以收到),它不管包中的IP地址是否和自己相同,都会产生一个ARP应答包,告诉请求的用户:我这台主机的MAC地址就是你请求的目的IP地址匹配的MAC地址。另一方面,由于发送ARP请求的源主机不具备任何容错、认证功能(ARP协议未提供任何机制实现这些功能),这样它便会轻易地相信这条ARP应答,并把它加入到了自己的ARP缓存表中。这样做的后果可想而知,源主机在以后都会将具有该目的P地址的数据包发送到那个恶意的主机上。这样,它能轻松地实现数据的窃听,这也就是我们常常听说的ARP攻击的基本原理。

当PC1发送ARP协议询问PC2的MAC地址时,由于是广播的,PC3也收到了这个ARP请求包,PC3把不属于自己的广播包接收,同时回应一个虚假的回应包,告诉PC1我就是PC2。这样PC1会收到两个回应包(一个正确的IP2-MAC2,一个虚假的IP2-MAC3),但是PC1并不知道到底哪个是真的,所以PC1会做出判断,并且判断后到达的为真,那么怎么让虚假的回应包后到达呢,PC3可以连续不断的发送这样的回应包,总会把哪个正确的回应包覆盖掉。

而后PC1会建立IP2-MAC3这样一条ARP缓存条目,以后当PC1给PC2发送信息的时候,PC1依据OSI模型从上至下在网络层给数据封装目的IP为IP2的包头,在链路层通过查询ARP缓存表封装目的MAC为MAC3的数据帧,送至交换机,根据查询CAM表,发现MAC3对应的接口为Port3,就这样把信息交付到了PC3,完成了一次ARP攻击。

如果ARP攻击严重的话,恶意的网络设备只要在网络内阅读送上门的所有广播的ARP请求数据包,就能偷听到网内所有<IP,MAC>地址信息,进而监听多台网络设备。

防止办法:

我们可以使用静态ARP缓存表防止ARP攻击,但是缺点是违背了ARP协议的动态地址解析原则。

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络工程师笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
9.9K star!大模型原生即时通信机器人平台,这个开源项目让AI对话更智能!
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法
小华同学ai
2025/03/24
940
9.9K star!大模型原生即时通信机器人平台,这个开源项目让AI对话更智能!
golang实现微信聊天机器人
▪ 获取UUID ▪ 根据UUID获取二维码 ▪ 显示二维码 ▪ 扫码登陆 ▪ 初始化微信信息 ▪ 打开状态同步通知 ▪ 获取通讯录 ▪ 发送信息 ▪ 同步信息 ▪ 获取自动回复内容
李海彬
2018/07/26
4K0
golang实现微信聊天机器人
什么是Rasa智能机器人?如何与LLM结合?
之前写过一篇介绍用Rasa结合类似于GPT这种LLM应用的项目:RasaGpt——一款基于Rasa和LLM的聊天机器人平台
山行AI
2023/06/14
6.3K0
什么是Rasa智能机器人?如何与LLM结合?
干货 | Github项目推荐 : BotSharp:基于.NET的开源聊天机器人平台构建器
BotSharp是一个用于AI Bot平台构建的开源机器学习框架。本项目涉及到自然语言理解、计算机视觉和音频处理技术等方面,旨在促进智能机器人助手在信息系统中的开发和应用。开箱即用(Out-of-the-box)的机器学习算法允许普通程序员更快、更容易地开发人工智能应用程序。
AI科技评论
2019/10/31
2K0
干货 | Github项目推荐 : BotSharp:基于.NET的开源聊天机器人平台构建器
Github项目推荐 | BotSharp:基于.NET的开源聊天机器人平台构建器
会话是一个平台(CAAP)的未来,所以我们已经使用BotSharp AI BOT平台构建器为我们的 .NET 开发人员提供了整个工具包,以构建一个CaaP。它为你自己搭建的机器人提供了尽可能多的学习能力,并精确控制人工智能处理管道的每一步。
AI研习社
2019/03/14
2.2K0
Github项目推荐 | BotSharp:基于.NET的开源聊天机器人平台构建器
Rasa Stack:创建支持上下文的人工智能助理和聊天机器人教程
Rasa Stack 是一组开放源码机器学习工具,供开发人员创建支持上下文的人工智能助理和聊天机器人:
磐创AI
2019/05/15
1.9K0
从0到1搭建一个基于FastAPI的智能聊天机器人应用
先点击 connect,再输入要发送的消息:你好。点击 send 即请求,响应了你好!
JavaEdge
2024/08/02
2770
从0到1搭建一个基于FastAPI的智能聊天机器人应用
FastChat——一个用于训练、部署和评估基于大型语言模型的聊天机器人的开放平台
在AI盛起的当下,各类AI应用不断地出现在人们的视野中,AI正在重塑着各行各业。相信现在各大公司都在进行着不同程度的AI布局,有AI大模型自研能力的公司毕竟是少数,对于大部分公司来说,在一款开源可商用的大模型基础上进行行业数据微调也正在成为一种不错的选择。
山行AI
2023/06/26
35.7K0
FastChat——一个用于训练、部署和评估基于大型语言模型的聊天机器人的开放平台
Rasa 聊天机器人专栏(八):在Docker上运行Rasa
这是如何使用Docker构建Rasa助手的指南。如果你之前没有使用过Rasa,我们建议你先Rasa教程开始。
磐创AI
2020/03/04
5.8K0
OpenAPITools 实践
OpenAPITools[1] 可以依据 REST API 描述文件,自动生成服务端桩(Stub)代码、客户端 SDK 代码,及文档等。其是社区版的 Swagger[2] ,差异可见:OpenAPI Generator vs Swagger Codegen[3]。
GoCoding
2021/11/11
9550
OpenAPITools 实践
Rasa 基于规则的对话管理: 天气预报机器人
learn from https://github.com/Chinese-NLP-book/rasa_chinese_book_code
Michael阿明
2022/12/13
2.1K0
Rasa 基于规则的对话管理: 天气预报机器人
轻松构建聊天机器人、准确性新SOTA,RAG有了更强大的AI检索器
黄志恒拥有爱丁堡大学博士和加州大学伯克利博士后研究经历。志恒曾在微软、百度、Facebook、腾讯和亚马逊等 IT 公司工作。志恒在亚马逊 AWS 担任首席科学家领导了 Amazon Kendra 和 Amazon Q。志恒现在是 Denser.ai 的创始人。截至 2024 年 5 月,Google Scholar 引用次数超过 13,300 次。
机器之心
2024/06/17
2040
轻松构建聊天机器人、准确性新SOTA,RAG有了更强大的AI检索器
Rasa 聊天机器人专栏开篇
Rasa 是最火的聊天机器人框架,是基于机器学习和自然语言处理技术开发的系统。Rasa 中文官方文档包括聊天机器人,上下文管理,多伦对话,意图识别,填槽,中文聊天机器人开发必备手册。
磐创AI
2019/12/06
2.8K0
Denser Retriever: 企业级AI检索器,轻松构建RAG应用和聊天机器人(完全开源)
Denser Retriever是一个企业级AI检索器,将多种搜索技术整合到一个平台中。在MTEB数据集上的实验表明,可以显著提升向量搜索(VS)的基线(snowflake-arctic-embed-m模型, 在MTEB/BEIR排行榜达到了最先进的性能)。
DenserAI_Chris
2024/08/04
1740
Denser Retriever: 企业级AI检索器,轻松构建RAG应用和聊天机器人(完全开源)
推荐 5 个你大概率没见过的免费 API ,一键获取数据!
不用任何登录!不用任何 token !不用任何购买套餐!GET 请求一键获得数据!!
掘金安东尼
2023/01/10
1.6K0
推荐 5 个你大概率没见过的免费 API ,一键获取数据!
Rasa NLU 实践
learn from https://github.com/Chinese-NLP-book/rasa_chinese_book_code
Michael阿明
2022/11/18
1.4K0
Rasa NLU 实践
Rasa 聊天机器人专栏(七):运行服务
Rasa尝试按上述顺序加载模型,即如果没有配置模型服务和远程存储,它只会尝试从本地存储系统加载模型。
磐创AI
2020/03/04
2.6K0
在openstack云平台中,使用命令行创建云主机操作步骤
在openstack云平台中,使用命令行创建云主机操作步骤 创建镜像 [root@controller ~]# source /etc/keystone/admin-openrc.sh [root@controller ~]# [root@controller ~]# glance image-create --name "cirros" --disk-format qcow2 --container-format bare --progress < cirros-0.5.1-x86_64-disk.
宝耶需努力
2022/12/13
2.9K0
在openstack云平台中,使用命令行创建云主机操作步骤
【LLM】基于LLama2构建智能助理帮你阅读PDF文件
本文将演示如何利用 LLM 从 PDF 发票中提取数据。我将构建一个 FastAPI 服务器,该服务器将接受 PDF 文件并以 JSON 格式返回提取的数据。
Freedom123
2024/04/27
7280
三分钟数据持久化:Spring Boot, JPA 与 SQLite 的完美融合
在快节奏的软件开发领域,每一个简化工作流程的机会都不容错过。想要一个无需繁琐配置、能够迅速启动的数据持久化方案吗?这篇文章将是你的首选攻略。在这里,我们将向你展示如何将 Spring Boot 的便捷性、JPA 的强大查询能力和 SQLite 的轻量级特性结合在一起,实现快速而又优雅的数据管理。
未读代码
2024/03/04
1K0
三分钟数据持久化:Spring Boot, JPA 与 SQLite 的完美融合
推荐阅读
相关推荐
9.9K star!大模型原生即时通信机器人平台,这个开源项目让AI对话更智能!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档