arp 协议

news2024/12/24 10:13:30

数据链路层

我们之前学习到的 IP 协议解决的是数据跨网络传输的问题。 数据链路层解决的是:直接相连的主机,进行数据交付的问题! 直接相连的设备包括我们的电脑,路由器等等哈!

我们在网络基础那篇文章中讲过什么是以太网,这里可以来复习一下:

  • “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的 内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
  • 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
  • 以太网是当前应用最广泛的局域网技术。和以太网并列的还有令牌环网, 无线LAN等;

以太网的帧格式

img

  • 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是 48 位,是在网卡出厂时固化的;

  • 帧协议类型字段有三种值,分别对应 IP、ARP、RARP;

  • 帧末尾是 CRC 校验码。用于在数据通信中检测传输过程中可能出现的错误。它是一种错误检测码,通过对数据进行多项式计算来生成校验值,并将该校验值附加到数据中一起发送。接收方在接收数据时也进行相同的计算,并与接收到的 CRC 值进行比较,以检查数据是否在传输过程中发生了损坏。

太网帧格式的报文也叫做 Mac 帧哈!

  • Mac 帧如何做到解包呢?很简单,就是定长报文,掐头去尾就得到有效载荷啦!头:14 字节,尾:4 字节。
  • Mac 帧的有效载荷应该交给上层的那个协议呢?类型字段用来表示将有效载荷交给上层的那个协议!
    • 类型字段为 0x0800 就是将有效子啊喝交给 IP 协议。
    • 类型字段为 0x0806 就是将有效子啊喝交给 ARP 协议。
    • 类型字段为 0x0835 就是将有效子啊喝交给 RARP 协议。

局域网的通信原理

这里还是以以太网为例哈,这个部分在网络基础的那篇文章中已经详细讲解过了,这里简单提一下!

img

如上图所示:假设一个局域网中的 H1 要发送一条数据给同一局域网中的 H7 主机!H1 主机进行 Mac 帧的封装,然后发送发哦局域网,然后整个局域网的主机都会收到这个 Mac 帧,收到 Mac 帧的主机会读取报文中的目的 Mac 地址,如果和自己的 Mac 地址不相同,报文就会被直接丢弃!如果和自己的 Mac 地址相同,就会继续进行解包和向上交付!

路由器也是 有网络层和数据链路成的,路由器收到报文的时候,先解包,再查路由表,然后再进行封转,转发!直到到达目标主机所在的局域网!

分析这个解包和封转的过程不难看出,Mac 帧只在局域网中有效。路由器进行转发的过程中,源 Mac 地址和 目标 Mac 地址是不端变化的!

ARP 协议

不知道你有没有这样一个疑问:在局域网中通信的两台主机,最开始的时候我们怎么知道目标主机的 Mac 地址呢?这就要引出 ARP 协议啦!

什么是 ARP 协议

ARP(Address Resolution Protocol,地址解析协议)是一种用于将IP地址映射到MAC地址的协议。ARP 不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。就是说 ARP 协议本身是被划分到了数据链路层的,但是 ARP 协议是 Mac 帧的上层协议!

ARP协议的作用

  • ARP 协议建立了主机 IP 地址 和 MAC 地址 的映射关系.
  • 在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址
  • 数据包首先是被网卡接收到再去处理上层协议的, 如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
  • 因此在通讯前必须获得目的主机的硬件地址;

ARP 协议的数据报格式

img

  • 硬件类型指链路层网络类型, 1 为以太网;
  • 协议类型指要转换的地址类型, 0x0800 为IP地址,即将 IP 地址转换为 Mac 地址。
  • 硬件地址长度对于以太网地址为 6 字节,填 6 就行。
  • 协议地址长度对于 IP 地址为 4 字节,填 4 就行。
  • op字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。

不难发现,对于 IP 地址到 Mac 地址的转化大部分的字段都是固定的写法!

模拟一次 ARP 请求获得目标主机 Mac 地址的过程

img

如上图所示,在局域网 A 中,主机 R 想要给主机 C 发送一条数据,但是主机 R 并不知道主机 C 的 Mac 地址。因此需要进行 ARP 请求获取主机 C 的Mac 地址!

  1. 首先在主机 R 的 ARP 软件层进行 ARP 报文的封装:

img

  • 硬件类型,协议类型,硬件地址长度,协议地址长度都是固定填法。

  • 发送的是 ARP 请求 OP 字段填写 1。

  • 目的以太网地址现在我们还不知道,直接填上全 F 就行!

  1. APR 请求报文封转完毕之后,就会交付给下层,构建 Mac 帧:

img

  • 目的以太网地址不知道,填全 F 表示广播地址,任何收到这个 Mac 帧的主机都需要进行解包向上交付。
  • 以太网源地址是填写 MacR 哈,上面的图有一点小错误。
  • 帧类型是 0x0806 表示有效载荷是 ARP 报文。将来需要交给 ARP 的软件层。
  1. Mac 帧构建完毕之后,就会通过网卡发送到局域网。因为目的 Mac 地址是广播地址,局域网中的任何主机都会收到这个 Mac 帧并进行解包,那么就会有两种情况:

    1. 除了主机 C 之外的其他主机收到了这个 Mac 帧,假设就是主机 B。

      • 主机 B 收到这个 Mac 帧之后,进行固定长度地掐头去尾,发现帧的类型是 0x0806,也就是 ARP 协议,就会将有效载荷交付给 ARP 的软件层。
      • ARP 的软件层收到这个报文之后,首先会取出 OP 字段,发现 OP 字段为 1 ,即该报文是 ARP 请求。然后再去取目的 IP 地址,发现目的 IP 地址和自己的 IP 地址不相同,那么就会直接将报文在 ARP 层丢弃。
    2. C 主机收到了这个 Mac 帧。

      • 主机 C 收到这个 Mac 帧之后,进行固定长度地掐头去尾,发现帧的类型是 0x0806,也就是 ARP 协议,就会将有效载荷交付给 ARP 的软件层。

      • ARP 的软件层收到这个报文之后,首先会取出 OP 字段,发现 OP 字段为 1 ,即该报文是 ARP 请求。然后再去取目的 IP 地址,发现目的 IP 地址和自己的 IP 地址相同,那么主机 C 就会进行 ARP 应答!

      • 在主机 C 的 ARP 软件层进行 ARP 应答的封装:

        222.jpg

        • 同样地,硬件类型,协议类型,硬件地址长度,协议地址长度都是固定填法。
        • op 字段填写 2 表示这是 ARP 应答!
        • 站在主机 C 的视角,发送端以太网地址,发送端 IP 地址,目的以太网地址,目的 IP 地址都是清楚的!
      • ARP 应答封装完成之后,就会向下交付,封装 Mac 帧。

        img

        • 目的以太网地址,源以太网地址主机 C 都已经知道了。
        • 帧的类型是 0x0806 表示有效载荷是 APR 报文。将来需要交给 ARP 的软件层。
      • Mac 帧封装完毕之后,就会将他发送到局域网,此时也有两种情况:

        1. 除了主机 R 以外的其他主机收到了这个 Mac 帧。这个主机发现目的以太网地址不是自己,会将报文直接丢弃,
        2. 主机 R 收到了这个 Mac 帧,发现目的以太网地址是自己,那么机会接收这个报文,从而获取到主机 B 的 Mac 地址,就这样,完成了一次 ARP 请求和响应的过程。

    通过以上模拟的 ARP 通信过程,我们不难得出结论:

    1. ARP 收发的过程中,收到的任何 ARP 报文都是先看 OP 字段。
    2. OP 字段决定了 ARP 报文的种类,是 ARP 请求报文还是 ARP 响应报文呢?不同类型的 ARP 报文又决定了接下来是看目的 IP 地址还是发送端的 Mac 地址。

在局域网中的主机每次进行通信之前都要进行 ARP 是不是有点麻烦,好在操作系统会帮我们缓存主机的 Mac 地址和 IP 地址的映射关系!我们可以使用 arp -a 命令查看缓存的映射数据!下图是在 Windows 操作系统中查看到的结果:

img

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

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

相关文章

Unity | 射线检测及EventSystem总结

目录 一、知识概述 1.Input.mousePosition 2.Camera.ScreenToWorldPoint 3.Camera.ScreenPointToRay 4.Physics2D.Raycast 二、射线相关 1.3D(包括UI)、射线与ScreenPointToRay 2.3D(包括UI)、射线与ScreenToWorldPoint …

基于单片机锂电池电量检测数码管显示系统设计

**单片机设计介绍,基于单片机锂电池电量检测数码管显示系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机锂电池电量检测数码管显示系统设计的主要目标是实时、准确地检测锂电池的电量,并…

如何利用webpack来优化前端性能

当涉及前端性能优化时,Webpack 是一款不可或缺的工具。它不仅仅是一个模块打包工具,还提供了各种功能和插件,可以帮助开发人员优化前端应用程序的性能。在这篇文章中,我们将深入探讨如何有效地利用 Webpack 来优化前端性能&#x…

「15」色源:添加指定色彩的纯色画面素材

「15」色源添加指定色彩的纯色画面素材 在OBS软件里,在来源里可以增加色源,添加一个色块到您的场景中,作为一个背景色或辅助色。 图中的显示器就是加了色源的 实操步骤 第1步 添加色源 在「来源」的左下角,点「」选择「色源」&a…

使用Kaggle API快速下载Kaggle数据集

前言 在使用Kaggle网站下载数据集时,直接在网页上点击下载可能会很慢,甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包: pip install…

「DevExpress中文教程」如何将DevExtreme JS HTML编辑器集成到WinForms应用

在本文中我们将演示一个混合实现:如何将web UI工具集成到WinForms桌面应用程序中。具体来说,我们将把DevExtreme JavaScript WYSIWYG HTML编辑器(作为DevExtreme UI组件套件的一部分发布的组件)集成到Windows Forms应用程序中。 获取DevExtreme v23.2正式…

Kafka重要配置参数全面解读(重要)

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Kafka重要配置参数全面解读(重要 前言auto.create.topics.enableauto.leader.rebalance.enablelog.retention.{hour|minutes|ms}offsets.topic.num.partitions 和 offsets.topic.replication.factorlo…

Excel:使用VLOOKUP函数,抓取指定数据,后一个列

Excel:使用VLOOKUP函数,抓取指定数据,后一个列 我们有这样一个数据源 要是实现这个页面的赋值 就是对应关系映射 使用 VLOOKUP(A2,Sheet2!$A$2:$B$9,2,FALSE)第一个参数是需要匹配的单元格。 第二个参数是数据源,我这里数据源用的是shee…

[Flutter]环境判断

方式一(推荐) 常量kReleaseMode,它会根据你的应用是以什么模式编译的来获取值。bool.fromEnvironment会从Dart编译时的环境变量中获取值。对于dart.vm.product这个特定的环境变量,它是由Dart VM设置的,用来标明当前是…

SnapGene 5 for Mac 分子生物学软件

SnapGene 5 for Mac是一款专为Mac操作系统设计的分子生物学软件,以其强大的功能和用户友好的界面,为科研人员提供了高效、便捷的基因克隆和分子实验设计体验。 软件下载:SnapGene 5 for Mac v5.3.1中文激活版 这款软件支持DNA构建和克隆设计&…

单摄像头、双目摄像头、多视图系统:了解自动驾驶汽车的传感器

1.鱼眼摄像机 其他摄像机的位置 2.激光雷达 3.Radar 4.sonar 声纳 各个传感器的对比 相机类型 一般来说,相机可以分为单目相机、双目相机和多视角相机。 单目相机:最常见的相机类型,只有一个镜头。双目相机:有两个镜头&…

浅谈Mysql(二)——慢sql、mysql锁、大事务的影响

一、慢sql的危害 不仅对当前查询影响大,查询时间过长;还对其他连接有影响,因为慢sql占用时间过长,导致其他线程,获取连接时间过长,进而导致网关超时等问题; 1.1 explian分析最主要看什么参数 …

20.变量的使用方式和注意事项

文章目录 一、变量的用法二、变量的注意事项三、总结 一、变量的用法 代码示例 public static void main(String[] args) {//1.基本用法// 定义变量,再进行输出int a 10;System.out.println(a);// 10System.out.println(a);// 10//2.变量参与计算int b 30;int c …

TitanIDE与传统 IDE 比较

与传统IDE的比较 TitanIDE 和传统 IDE 属于不同时代的产物,在手工作坊时代,一切都是那么的自然,开发者习惯 Windows 或 MacOS 原生 IDE。不过,随着时代的变迁,软件行业已经步入云原生时代,TitanIDE 是顺应…

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法 ro.vendor.config.lgsi.market_name拯救者平板 Y700 ro.vendor.config.lgsi.en.market_nameLegion Tab Y700 #ro.vendor.config.lgsi.short_market_name联想平板 ZUI T # B…

车载以太网AVB交换机 gptp透明时钟 5口 全千兆 SW1500

全千兆车载以太网交换机 一、产品简要分析 5端口千兆车载以太网交换机,包含4个通道的1000BASE-T1接口使用罗森博格H-MTD和泰科MATEnet双接口,1个通道1000BASE-T标准以太网(RJ45接口),可以实现车载以太网多通道交换,千兆和百兆车载…

macOS 13 Ventura (苹果最新系统) v13.6.6正式版

macOS 13 Ventura是苹果电脑的全新操作系统,它为用户带来了众多引人注目的新功能和改进。该系统加强了FaceTime和视频通话的体验,同时优化了邮件、Safari浏览器和日历等内置应用程序,使其更加流畅、快速和安全。特别值得一提的是,…

Gitlab 实现仓库完全迁移,包括所有提交记录、分支、标签

1 方案一&#xff1a;命令 cd <项目目录> git fetch --all git fetch --tags git remote rename origin old-origin #可以不保留 git remote add origin http://***(项目的新仓库地址) #git remote set-url origin <项目的新仓库地址> git push origin --all git…

Redis中的客户端(三)

客户端 身份验证 客户端状态的authenticated属性用于记录客户端是否通过了身份验证: typedef struct redisClient {// ...int authenticated;// ... } redisClient;如果authnticated的值为0&#xff0c;那么表示客户端未通过身份验证&#xff1b;如果authenticated的值为1&a…

【Java程序设计】【C00345】基于Springboot的船舶监造管理系统(有论文)

基于Springboot的船舶监造管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…