【计算机网络系列】网络层③:地址解析协议ARP_地址解析协议arp的四种典型-程序员宅基地

技术标签: 网络  服务器  计算机网络  ARP  

地址解析协议ARP

地址解析协议ARP的作用:已知一个主机或路由器的IP地址,需要找出其相应的MAC地址

下图说明了协议ARP的作用:
image.png

逆地址解析协议RARP的作用:使只知道自己MAC地址的主机能够通过协议RARP找出其IP地址。DHCP协议已经包含了协议RARP的功能,所以不讨论这个协议了。

网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用链路层的MAC地址。IP地址和下面链路层的MAC地址之间由于格式不同不存在简单的映射关系

例如,IP地址有32位,而链路层的MAC地址是48位。

此外,在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。更换网络适配器也会使主机的MAC地址改变。地址解析协议ARP解决这个问题的方法是在主机的ARP高速缓存中存放一个从IP地址到MAC地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)

注意,主机的MAC地址实际上就是其网络适配器的MAC地址。

每一台主机都设有一个ARP高速缓存(ARP cache),里面存有本局域网上的各主机和路由器的IP地址到MAC地址的映射表,这些都是该主机目前知道的一些MAC地址。那么主机怎样知道这些MAC地址呢?我们可以通过下面的例子来说明。

当主机A要向本局域网上的某台主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如有,就在ARP高速缓存中查出其对应的MAC地址,再把这个MAC地址写入MAC帧,然后通过局域网把该MAC帧发往此MAC地址。

也有可能查不到主机B的IP地址。这可能是主机B才入网,也可能是主机A刚刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP,然后按以下步骤找出主机B的MAC地址。

  1. ARP进程在本局域网上广播发送一个ARP请求分组
  2. 在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。
  3. 主机B的IP地址与ARP请求分组中要查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组,同时在这个ARP响应分组中写入自己的MAC地址。由于其余所有主机的IP地址都与ARP请求分组中要查询的IP地址不一致,因此都不理睬这个ARP请求分组。
  4. 主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到MAC地址的映射。

请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。

image.png
ARP高速缓存是非常有用的,如果不使用ARP高速缓存,那么任何一台主机只要进行一次通信,就必须在网络上用广播方式发送ARP请求分组,这就会使网络上的通信量大大增加。ARP把已经得到的地址映射保存在高速缓存中,这样就使得该主机下次再和具有同样目的地址的主机通信时,可以直接从高速缓存中找到所需的MAC地址而不必再用广播方式发送ARP请求分组。

ARP对保存在高速缓存中的每一个映射地址项目都设置生存时间(例如,10~20分钟)。凡超过生存时间的项目就从高速缓存中删除掉。

请注意,ARP用于解决同一个局域网上的主机或路由器的IP地址和MAC地址的映射问题。

从IP地址到MAC地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个己知IP地址的主机或路由器进行通信,协议ARP就会自动地把这个IP地址解析为链路层所需要的MAC地址,然后插入到MAC帧中。

下面我们归纳出使用ARP的四种典型情况:

  1. 发送方是主机(如 H 1 H_1 H1),要把IP数据报发送到同一个网络上的另一台主机(如 H 2 H_2 H2)。这时 H 1 H_1 H1发送ARP请求分组(在网络 N 1 N_1 N1上广播),找到目的主机 H 2 H_2 H2的MAC地址。
  2. 发送方是主机(如 H 1 H_1 H1),要把IP数据报发送到另一个网络上的一台主机(如 H 3 H_3 H3 H 4 H_4 H4)。这时 H 1 H_1 H1发送ARP请求分组(在网络 N 1 N_1 N1上广播),找到 N 1 N_1 N1上的一个路由器 R 1 R_1 R1的MAC地址。剩下的工作由路由器 R 1 R_1 R1来完成。 R 1 R_1 R1要做的事情是下面的3或4。
  3. 发送方是路由器(如 R 1 R_1 R1),要把IP数据报转发到与 R 1 R_1 R1连接在同一个网络 N 2 N_2 N2上的主机(如 H 3 H_3 H3)。这时 R 1 R_1 R1发送ARP请求分组(在 N 2 N_2 N2上广播),找到目的主机 H 3 H_3 H3的MAC地址。
  4. 发送方是路由器(如 R 1 R_1 R1),要把IP数据报转发到网络 N 3 N_3 N3上的一台主机(如 H 4 H_4 H4)。 H 4 H_4 H4 R 1 R_1 R1不是连接在同一个网络上的。这时 R 1 R_1 R1发送ARP请求分组(在 N 2 N_2 N2上广播),找到连接在 N 2 N_2 N2上的一个路由器 R 2 R_2 R2的MAC地址。剩下的工作由这个路由器 R 2 R_2 R2来完成。

在许多情况下需要多次使用ARP,但这只是以上几种情况的反复使用而已。

image.png
问题:既然在网络链路上传送的帧最终是按照MAC地址找到目的主机的,那么为什么我们还要使用两种地址(IP地址和MAC地址),而不直接使用MAC地址进行通信?

由于全世界存在着各式各样的网络,它们使用不同的MAC地址。要使这些异构网络能够互相通信就必须进行非常复杂的MAC地址转换工作,因此由用户或用户主机来完成这项工作几乎是不可能的事。即使是对分布在全世界的以太网MAC地址进行寻址,也是极其困难的。然而IP编址把这个复杂问题解决了。连接到互联网的主机只需各自拥有一个IP地址,它们之间的通信就像连接在同一个网络上那样简单方便,即使必须多次调用ARP来找到MAC地址,但这个过程都是由计算机软件自动进行的,对用户来说是看不见的。

因此,在虚拟的IP网络上用IP地址进行通信给广大的计算机用户带来了很大的方便。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37085158/article/details/128393242

智能推荐

进程间通信的利器——unix域套接字编程详解_unix域协议应用-程序员宅基地

文章浏览阅读1.7k次。背景最近项目中使用unix域数据报套接字实现线程间通信,在此总结一下。进程间通信进程间通信的方式很多,包括管道、FIFO、消息队列、信号量、共享内存unix域套接字等。管道一般是半双工的,只能在具有公共祖先的两个进程间使用。#include <unistd.h>int pipe(int fd[2]);/* 成功返回0,失败返回-1 */FIFO..._unix域协议应用

新玺配资:尚未形成趋势主线 困境下的策略曝光-程序员宅基地

文章浏览阅读66次。 回顾周二A股行情,沪深两市整体呈现震荡反弹格局。沪指和深成指表现较为强势,全天呈现脉冲式上行格局,其中深成指涨幅超过1%,上证指数距离 3600点仅一步之遥;而创业板指开盘快速冲高,随后逐步回落,全天表现相对分化。  当前在成交量持续回落、宏观经济增速趋缓、海外风险仍存的背景下,建议更多关注具备防御性质的方向,业绩稳定、前期涨幅较小、三季报预计良好的方向存在一定的机会。  从技术面来看,周二沪指震荡走高收红,个股板块涨多跌少,赚钱效应偏好,两市成交额表现温和,预计短线大盘有望逐步震荡企稳,关注板块

控制台-程序员宅基地

文章浏览阅读783次。windowsAllocConsole FreeConsole AttachConsole GetStdHandleAttachConsole(ATTACH_PARENT_PROCESS);// 将当前程序附着到父进程上,因为是从控制台启动的,所以当前程序的父进程就是那个控制台。freopen("CONIN$", "r+t", stdin); // 重定向 STDINfreopen("CONOUT$", "w+t", stdout); // 重定向STDOUTConsole FunctionsGetCons

直流充电机TK22010Z电源模块TK22020F_eds230d10zz-程序员宅基地

文章浏览阅读53次。直流充电机TK22010Z电源模块TK22020F,电源模块TK22010F,直流屏整流模块TK22020F,TK11010F,充电模块TK11020F_eds230d10zz

数据流中的中位数_输入是一个很长的数据流,如何返回它的中位数-程序员宅基地

文章浏览阅读162次。数据流中的中位数如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。样例输入:1, 2, 3, 4输出:1,1.5,2,2.5解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。优先级队列时间复杂度O(logn)class Solution { PriorityQueue<Integer> minheap = new_输入是一个很长的数据流,如何返回它的中位数

log4js-node在VisualStudioCode内置调试控制台无输出解决_nodejs vscode stdout-程序员宅基地

文章浏览阅读6.3k次。最近学习到了nodejs的日志输出模块,选择了log4js-node这个模块,但是当我兴高采烈的在vsc中写好log输出的时候,debug的时候在调试控制台(debug console)却没有任何显示,最后经过在官方github里询问查找得到如下解决方案1:   log4js的输出采用的是stdout的方式,而vsc目前的内置调试控制台还默认不从stdout的输出流中抓取内容,需要在vsc的启动配_nodejs vscode stdout

随便推点

从SRA数据下载开始学习ATACseq数据分析_sra文件怎么打开-程序员宅基地

文章浏览阅读765次。第2行储存的是序列信息,正常情况都是用ATCG四个字母表示,但是当测序仪无法准确分辨该位置的序列信息时,会以N来代指此处的序列信息;第4行存储的就是第2行每一个碱基的测序质量信息,其中的每一个符号所对应计算机的ASCII值是经过换算的phred值,而phred值等于33-10*logP,这里的P代表该位置测序发生错误的概率,简单来说,如果某个位置测得的序列十分可信,那么意味着该位置发生错误的概率极小,所以phred值就很大,即该值越大,说明测序的质量越好。明码标价之ATACseq|生信菜鸟团。_sra文件怎么打开

C语言打印转义字符-程序员宅基地

文章浏览阅读362次,点赞5次,收藏10次。打印转义字符、\ddd,表示1~3个八进制的数字

技术点记录_hive timediff-程序员宅基地

文章浏览阅读965次。函数Hive的内置函数数学函数取整函数:round、floor、ceil、fixfix朝零方向取整,如fix(-1.3)=-1; fix(1.3)=1;floor:地板数,所以是取比它小的整数,即朝负无穷方向取整,如floor(-1.3)=-2; floor(1.3)=1; floor(-1.8)=-2; floor(1.8)=1。ceil:天花板数,也就是取比它大的最小整数,即朝正无穷方向取整,如ceil(-1.3)=-1; ceil(1.3)=2; ceil(-1.8)=-1; ceil_hive timediff

19.相机,棱镜和光场_相机视野经过棱镜后-程序员宅基地

文章浏览阅读1k次,点赞20次,收藏23次。1.Synthesis(图形学上)合成:比如之前学过的光线追踪或者光栅化2.Capture(捕捉):把真实世界存在的东西捕捉成为照片。_相机视野经过棱镜后

Docker多机集群部署之MySQL集群(PXC)_不同云服务器搭建pxc集群-程序员宅基地

文章浏览阅读1.2k次。一、环境说明:宿主机:Win10虚拟机工具:VMware Workstation 15系统及版本:Ubuntu16.04Docker版本:18.09.3涉及到的虚拟主机:192.168.1.100 haproxy192.168.1.101 node1192.168.1.102 node2192.168.1.103 node3二、准备镜像#拉取percona/percona-xtradb-cluster:5.6#pxc5.7版本不支持不使用k8s或者et.._不同云服务器搭建pxc集群

AT命令_at命令默认采用的是text模式吗?-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏10次。AT命令最常见的应用场景:1、智能手机:一般智能手机都是一个主芯片控制一个通信模块,这个通信模块就是一个完整的、简单的手机,包括手机应该有的射频、基带等部分,还有GSM协议栈,完全可以独立打电话、发短信、用GPRS上网等。主芯片实现复杂的应用软件。主芯片和通信模块之间通过AT命令,也就是做主芯片通过AT命令控制通信模块打电话,发短信等。2、其他通信模块。例如出租车上的车载台,通信模块可以接收控..._at命令默认采用的是text模式吗?