当前位置: 首页 > news >正文

ARP协议

目录

一 报头格式

二 ARP具体过程

三 ARP欺骗


一 报头格式

1. ARP作用

ARP协议工作在数据链路层,与MAC桢属于同层关系,网络传输自顶向下封报头,自底向上解包分用,而MAC地址每经过一个节点都会动态变化,所以每次向其他同一个子网的主机通信,必须知道目的主机的MAC地址封装MAC桢向下交付,到目的主机解包分用,所以ARP就是用来通过IP地址来获取MAC地址的。

2. 报头字段

硬件类型(2字节):同一个子网的网络类型,如以太网,令牌环网等

协议类型(2字节):表示如IPv4,IPv6等类型转换成MAC地址

硬件地址长度:和前面硬件类型强相关,如以太网地址长度

协议地址长度:和前面协议类型强相关,如IPv4地址长度

op:表示为ARP请求还是ARP应答


前4个字段为固定字段

发送端以太网地址:发送端的MAC地址

发送端IP地址:发送端的IP地址

目的以太网地址:如果不知道,默认全FFFFFF/全0,表示缺省广播

目的IP地址:接收方IP地址

二 ARP具体过程

5个字段填充:

前5个字段为固定字段,填充源ip,mac地址,目的ip地址,目的mac地址缺省广播

ARP请求构建完成,向下封装MAC桢

这里默认收到mac桢进行解包,并且ARP前5个字段忽略不写,后面会用到。

当路由器准备封mac桢时,不知道目的主机的mac地址,则需要进行ARP请求获得mac地址,不仅是外网转发进来的时候,同一个局域网内通信/向外网通信某台主机也可能发起ARP请求/收到ARP应答,由op字段决定。

1. MAC桢目的mac地址填的FFFFFFFFF表示广播,给处于同一个子网的所有主机发送数据包。

2. 当除了主机E(目的主机IP)的主机收到数据包,首先MAC桢解包分用,看到目的mac地址为全FFFFF,不知道是不是是自己的mac地址,所以不丢弃,再看桢类型,0806表示向上交给ARP协议,然后得到ARP报头,首先看ARP:op字段,发现为ARP请求,则比对目的IP地址和自己IP地址不一样,则丢弃(ARP层丢弃)。

3. 当主机E收到数据包,和上述步骤一样,发现目的IP地址和自己IP地址一样,则重新构建ARP应答,并填充字段:

构建完应答,在继续封装mac桢,mac桢就不再目的mac地址就不再填FFFFF,而是(1.1.1.1)macR。

4. 和 " 2 " 进行同样的步骤,解包之后,看到目的mac地址不是广播地址,又不和自己主机mac地址一样,丢弃(mac桢层丢弃)。

5. 当路由器收到数据包,解包之后发现和自己mac地址一样,发现桢类型为0806,交给上层ARP,拿到ARP报头,先看op字段,因为不知道是别人构建的应答还是请求,这次是应答,首先看目的mac地址和目的IP地址和路由器的mac地址和IP地址一样,确定报文是发给路由器,然后得到源macE的地址,自此通过ARP请求根据目的IP地址得到目的主机的mac地址,后续重新封装mac桢填入目的主机mac地址发送数据包。

6. 当路由器拿到目的主机的MAC地址,除了发送数据包,还会在一定时间内缓存 "MAC地址>IP地址" 的映射,避免下次收到的数据包,发送重复的主机,从而重新构建ARP请求的开销。

7. 通过 arp -a 命令查看ARP映射表

8. RARP

ARP是通过IP地址转换成mac地址

RARP是通过mac地址转换成IP地址,知道了mac地址,在数据链路层->mac桢拿到就能直接识别是不是该主机的mac地址,在交付给RARP构建应答响应回去,所以就可以直接封装mac桢指定mac地址而不用进行广播了,和上述ARP演示几乎一模一样。

三 ARP欺骗

所谓的ARP欺骗,就是中间人通过某种手段拿到数据包并且双方通信的主机是感知不到的。

下面看看具体流程:

假设主机A和路由器已经通信过了,并且已经缓存对方的mac地址。

这时候来了个中间人M,并向主机A发送ARP应答,携带路由器的IP地址和主机M的mac地址,主机A查映射表,就会以为路由器更新过了mac,直接重新映射成 " IPR -> macM ",同样的发送大量的ARP应答给路由器,也会影响他的映射表。

后续主机A发送数据包给路由器,根据封装的mac桢,并且mac地址填的是主机M的,因为映射表已经变了,所以只有主机M能处理,然后向路由器发送数据包,如果不知道路由器的mac地址,重新ARP请求即可,因此主机M就能获取主机A和路由器之间通信的数据包。

http://www.xdnf.cn/news/386047.html

相关文章:

  • 【Python】异步优势演员-评论家(A3C)算法在Python中的实现与应用
  • 【Python-Day 12】Python列表进阶:玩转添加、删除、排序与列表推导式
  • Javascript:数组和函数
  • Nacos 3.0 正式发布,有重大升级更进.......
  • 生产级 Flink CDC 应用开发与部署:MySQL 到 Kafka 同步示例
  • mem0跟Memgraph交互
  • spring cloud loadbalancer实现机房感知的负载均衡
  • ESP32-S3 学习笔记(1)
  • mac环境配置(homebrew版)
  • [案例四] 智能填写属性工具(支持装配组件还有建模实体属性的批量创建、编辑)
  • ST表(稀疏表)
  • 理解反向Shell:隐藏在合法流量中的威胁
  • Python并发编程:开启性能优化的大门(7/10)
  • MySQL 索引设计宝典:原理、原则与实战案例深度解析
  • 【C++】模板初阶
  • 从零开始开发纯血鸿蒙应用之XML解析
  • 《AI大模型应知应会100篇》第58篇:Semantic Kernel:微软的大模型应用框架
  • 计算机网络|| 常用网络命令的作用及工作原理
  • 张量并行优质博客
  • 【东枫科技】使用LabVIEW进行深度学习开发
  • 面试中常问的设计模式及其简洁定义
  • 【React】Craco 简介
  • JavaScript 循环语句全解析:选择最适合的遍历方式
  • 客服系统重构详细计划
  • 如何选择 RabbitMQ、Redis 队列等消息中间件?—— 深度解析与实战评估
  • 御网杯2025 Web,Msic,密码 WP
  • Docker、ECS 与 K8s 网段冲突:解决跨服务通信中的路由问题
  • [思维模式-30]:《本质思考力》-10-产品研发的两种模式:①自顶向下的规划、分解、牵引;②自底向上的堆叠、聚合。
  • Win全兼容!五五 Excel Word 转 PDF 工具解决多场景转换难题
  • MyBatis快速入门——实操