ARP地址解析过程(同一子网和不同子网)

2023-05-16

人们最熟悉的网络可以说是以太网,而且人们都知道,每块网卡都有一个编号,也就是网卡地址(称为MAC地址),代表计算机的物理地址。另外,网络中的每一台计算机都分配了一个IP地址,这样,每台计算机上都有两个地址,IP地址和MAC地址。
IP地址并不能代替MAC地址,前者是在大网中为了方便定位主机所采用的方式,如果网络规模不大,完全可以不使用IP地址。但是,无论什么网络环境物理地址都是要使用的。因为物理地址对应于网卡的接口,只有找到它才算真正到达了目的地。而IP地址是为了方便寻址人为划分的地址格式,因此IP地址也被称为逻辑地址,又因为这种结构化地址是在OSI的第3层定义的,也被称为3层地址。相应地,物理地址是在第2层定义的,被称为2层地址。IP地址是一种通用格式,无论其下一层的物理地址是什么类型,都可以被统一到一致的IP地址形式上,因此IP地址屏蔽了下层物理地址的差异。
既然IP地址并不能代替物理地址,它只是在逻辑上表示一台主机,物理地址才对应于网卡的接口,只有找到它才能将数据送达到目的地。那么如何把二者对应起来就是要解决的首要问题,因为二者代表的是同一台机器。为此人们开发了地址解析协议(Address Revolution Protocol,ARP),地址解析协议负责把IP地址映射到物理地址。
下面分两种情况解释ARP的工作过程:同一子网内的arp和不同子网间的arp。
(1)同一子网内的ARP
主机A (172.16.20.20/24)与主机B通信。假设在A上Ping主机B的IP地址172.16.20.5/24。
为了把测试信息发送到主机B和A,将构造关于Ping的IP数据包。可以确定,这个包头中的源IP地址是172.16.20.20,目的地址172.16.20.5。IP数据包构造完成以后,需要将它从网卡发送出去,在这之前必须要封装2层的帧头,本例中2层是以太网环境,因此需要构建以太网帧头。分析帧头中的MAC地址情况,它的源地址应该是00-0C-04-18-19-aa,这个地址很容易获得,主机A直接从自己的网卡中获取即可,帧头中的目的MAC地址应该是00-0C-04-38-39-bb,它对应于主机B的MAC地址。主机A如何得知主机B的MAC地址呢?这是主机A在封装2层帧头时必须解决的问题,否则无法发送这个帧出去。主机A唯一的办法是向主机B发出询问,请主机B回答它自己的MAC地址是什么。ARP协议正是负责完成这一工作的,即已知目的节点的IP地址来获取它相应的物理地址。
ARP的操作过程如下。
① 主机A发出ARP请求,请求帧中的数据部分包括发送者MAC地址00-0C-04-18-19-aa、发送者IP地址 172.16.20.20和目标MAC地址,这里全部填充0,因为它未知(这正是ARP要询问的),目标IP地址是172.16.20.5。
② 在请求帧的帧头部分,目的MAC地址是广播地址,因此所有收到的站点(其中就包括主机B)都打开这个帧查看其数据部分的内容。
③ 只有符合目标IP地址172.16.20.5的主机(主机B)回答这个ARP请求,其他站点则忽略这个请求。
④ 主机B把自己的MAC地址写入“目标地址”字段中,送给主机A。
主机A通过ARP的操作得到了主机B的MAC地址,可以继续完成它的封装过程,从而最终执行了Ping的操作。
ARP请求者收到应答后,会在自己的缓存中构建一个ARP表,将得到的地址信息缓存起来,以备将来和同一目的节点通信时直接在ARP表中查找,避免了多次的广播请求。
实际上,完整的操作过程是:主机A在准备构造2层帧头时,首先根据目的IP去查找ARP表,如果找到对应项,则直接得到目的MAC地址,如果没有查到才执行上面所说的ARP广播请求。这样做是为了最大限度地减少广播。
(2)不同子网间ARP
假设在主机A(172.16.10.10/24)上Ping主机B的IP地址172.16.20.5/24,随后主机A将构造关于Ping的IP数据包,这一过程与前面相同,只是目的地址在另外一个子网中。主机A仍然面临如何确定2层帧头中的目的MAC地址的问题。
如果仍然依照目的节点和源节点位于同一子网中的思路,这个目的MAC应该是主机B网卡的MAC地址。顺着这个思路走下去,看看会发生什么情况。
由于主机B位于路由器的另外一侧,因此主机B要想收到主机A发出的以太网帧必须通过路由器转发,那么路由器是否会转发呢?答案是否定的。路由器在收到某个以太网帧后首先检查其目的MAC,而这里假设A发出的帧中的目的MAC是B的网卡地址,路由器从Ethernet 0接口收到该帧后,查看目的MAC地址,发现它不是自己的MAC地址,从而将其丢弃掉。由此看来,位于不同子网的主机之间在通信时,目的MAC地址不能是目标主机的物理地址。
实际上,不同子网之间的主机通信要经过路由过程,这里就是需要路由器A进行转发。因此,主机A发现目标主机与自己不在同一个子网中时就要借助于路由器。它需要把数据帧送到路由器上,然后路由器会继续转发至目标节点。在该例中,主机A发现主机B位于不同子网时,它必须将数据帧送到路由器上,这就需要在帧头的“目的地址”字段上写入路由器接口Ethernet 0的MAC地址。因此,主机A需要通过ARP询问路由器Ethernet 0接口的MAC地址。
这里仍然是两个操作过程,一个是ARP请求;另一个是ARP应答。不过在ARP的请求帧中,目标IP地址将是路由器Ethernet 0接口的IP地址,这个地址实际上就是子网172.16.10.0/24中主机的默认网关。路由器收到ARP请求后回答自己Ethernet 0接口的MAC地址,这样主机A就获得了其默认网关的MAC地址。主机A构建完整的数据帧并将其发送给到路由器。路由器收到主机A的数据后,根据路由表的指示将从另一接口Ethernet 1把数据发送给主机B。同样,在发送前路由器也要封装2层帧头,也需要知道主机B的MAC地址,路由器也是通过ARP协议来获得B的MAC地址的。
综合以上两种情况,主机A的完整操作过程如下:
主机A首先比较目的IP地址与自己的IP地址是否在同一子网中,如果在同一子网,则向本网发送ARP广播,获得目标IP所对应的MAC地址;如果不在同一子网,就通过ARP询问默认网关对应的MAC地址。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARP地址解析过程(同一子网和不同子网) 的相关文章

随机推荐

  • IDEA maven项目中刷新依赖的两种方法

    前言 IDEA maven项目中刷新依赖分为自动刷新 和 手动刷新 两种 xff01 自动刷新 xff1a File Settings 手动刷新 xff1a
  • CMAKE Opencv配置

    本人使用场景 xff1a 项目中别人使用CMAKE维护的一个项目代码 xff0c 里面没有配置Opencv xff0c 自己使用的时候希望配置上 xff0c 尝试直接在项目中利用项目属性进行修改 xff08 未成功 xff0c 有经验的同学
  • Windows下配置Hadoop环境(全过程)

    首先到官方下载官网的hadoop2 7 7 链接如下 https mirrors tuna tsinghua edu cn apache hadoop common 找网盘的hadooponwindows master zip 链接如下 h
  • ARM立即寻址中有效立即数的计算

    前言 感觉这方面的计算参考书上也讲的比较模糊 xff0c 在这里分享一下计算的方法 立即数寻址有效数的计算 xff08 一 xff09 ARM立即数寻址的指令格式 xff08 二 xff09 例1 汇编指令 xff1a mov R0 0x0
  • mysql8.0安装后设置密码

    mysql8 0安装后密码调整 创建密码策略 xff1a INSTALL COMPONENT file component validate password 查看是否创建成功 xff0c 执行后显示如下内容标识密码策略安装成功 属性值可修
  • C++读取文件夹中的文件

    下面是一种简便的读取文件夹里所有子文件夹和文件的方法 xff0c 如果想读取子文件夹下所有文件 xff0c 可以递归一下 span class token macro property span class token directive
  • 树莓4B+samba+nextcloud搭建nas私有云

    文章目录 概述环境准备网络机械硬盘格式化及分区 Samba安装部署nextCloud安装部署docker安装安装相关容器配置及优化创建数据库next cloud注册错误提示 xff1a nextcloud install Error whi
  • linux 配置java环境变量 报错 `=': 不是有效的标识符

    linux 配置java环境变量 运行source etc profile时 报错 96 61 39 不是有效的标识符 解决办法 export JAVA HOME 61 usr local java jdk1 8 0 151 的 61 左右
  • Word 自带公式转为mathtype格式

    选中公式 xff0c 在公式中 xff0c 选择LaTeX 复制后 xff0c 插入mathtype公式中
  • 从头用脚分析FFmpeg源码 - avcodec_send_frame | avcodec_receive_packet

    avcodec send frame和avcodec receive packet 作用 相对应avcodec send packet avcodec receive frame而言 xff0c avcodec send frame xff
  • Debian系统解决中文乱码问题

    1 安装locales apt get install locales 2 设置语言选项 dpkg reconfigure locales 选择如下四项 xff1a zh CN GB2312zh CN GBK GBKzh CN UTF 8
  • raspbian-buster安装php7.3

    安装php sudo apt get install php7 3 fpm php7 3 curl php7 3 gd php7 3 mbstring php7 3 mysql php7 3 imap php7 3 opcache php7
  • Linux下查看服务器各硬件信息

    span class hljs comment 内存 span span class hljs preprocessor free m span span class hljs preprocessor cat proc meminfo s
  • Day2、Hive json_tuple性能比get_json_object更高吗?为什么?

    目录 一 执行过程 二 源码比较 三 实验论证 四 总结 在对离线任务进行优化时 xff0c 一般来说有两种思路 一是参数优化 xff0c 尽量提高CPU 内存利用率 xff0c 或者减少spill率 xff1b 二是SQL优化 xff0c
  • Ubuntu18.04下更改apt源

    任意版本的系统代号 xff1a Ubuntu 12 04 LTS 代号为precise Ubuntu 14 04 LTS 代号为trusty Ubuntu 15 04 代号为vivid Ubuntu 15 10 代号为wily Ubuntu
  • C语言中数的二进制、八进制、十进制以及十六进制表示及输出

    以十进制数163为例 xff1a 二进制的英文是Binary xff0c 简写为B或BIN xff0c 所以163 61 0b10100011 xff08 前面加上 0b 或 0B xff09 八进制的英文是Octal xff0c 简写为O
  • java-字符串数组排序

    问题 43 代码 xff1a 创建一个长度是8的字符串数组 使用8个长度是5的随机字符串初始化这个数组 对这个数组进行排序 xff0c 按照每个字符串的首字母排序 无视大小写 注1 xff1a 不能使用Arrays sort 要自己写 注2
  • python 装饰器

    1 装饰器 装饰器 Decorators 是Python的一个重要部分 简单地说 xff1a 他们是修改其他函数的功能的函数 他们有助于让我们的代码更简短 xff0c 也更Pythonic xff08 Python范儿 xff09 大多数初
  • Java的俩个list之间比较,判断是否一致的方法

    前文 我看了一篇博客 xff0c 是关于判断俩个list的 看完之后我觉得可能并不是很好 结合他的思路 xff0c 我重新整理了一下代码 同时也看了看String中的equals的实现 原文是 xff1a https blog csdn n
  • ARP地址解析过程(同一子网和不同子网)

    人们最熟悉的网络可以说是以太网 xff0c 而且人们都知道 xff0c 每块网卡都有一个编号 xff0c 也就是网卡地址 xff08 称为MAC地址 xff09 xff0c 代表计算机的物理地址 另外 xff0c 网络中的每一台计算机都分配