ARP

ARP(Address Resolution Protocol,地址解析协议)是将IP地址解析为以太网MAC地址(物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IP地址)。但是仅仅有IP地址是不够的,因为IP数据报文必须封装成帧才能通过物理网络发送。因此发送方还需要有接收方的物理地址,也就需要一个从IP地址到物理地址的映射,ARP就是事先这么功能的协议。

1、ARP报文格式

ARP是一个独立的三层协议,所以ARP报文在此数据链路层传输时不需要经过IP协议的封装,而是直接生成自己的报文,其中包括ARP报头,到数据链路层后再由对应的数据链路层协议进行封装。ARP报文分为ARP请求和ARP应答报文两种,二者格式可以统一用下图表示:

硬件类型,表示ARP报文可以在哪种类型的网络上传输

上层协议类型,表示硬件地址要映射的协议地址类型

操作类型,指定本次ARP报文类型(请求/应答)

ARP报文并不是直接在网络层上发送的,它还是需要向下传输到数据链路层,所有当ARP报文传输到数据链路层后,需要再次进行封装。在以太网中,ARP传输到数据链路层后会封装成ARP帧。其格式如下图所示

可以看出,其帧封装都是一样的,网络层的直接作为数据链路层帧的数据部分。

目的MAC地址,如果是ARP请求帧,因为它是一个广播帧(后面会介绍),所以要填上广播MAC地址——FF-FF-FF-FF,其目标为网络上的所有主机

源MAC地址,发送ARP帧的节点MAC地址

帧类型,标识帧封装的上层协议

2、ARP映射表

无论是主机,还是交换机都会有一个用来缓存同一网段设备IP地址和MAC地址的ARP映射表,用于数据帧的转发。设备通过ARP解析到目的MAC地址后,将会在自己的ARP映射表中增加IP地址到MAC地址的映射表项,以用于后续到同一目的地数据帧的转发。

ARP表项分为动态ARP表项和静态ARP表型。

3*、ARP地址解析原理

  1. 主机A首先查看自己的ARP表(一个IP地址与MAC地址的映射表),确定其中是否包含有主机B的IP地址和对应的MAC地址。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址对IP数据报进行帧封装,并将数据报发送给主机B。类似于计算机组成中高速缓存的命中。
  2. 如果主机A在ARP表中找不到对应的MAC地址,则先缓存该数据报文,然后以广播方式(参见数据链路层物理地址寻址部分,目的MAC地址为广播MAC地址——FFFFFF,任一同网段的节点均可收到,该网络上的所有主机)发送一个ARP请求报文,ARP请求报文中的发送端(源)IP地址和发送端MAC地址分别为主机A的IP地址和MAC地址,目的IP地址和目的MAC地址为主机B的IP地址和全0的MAC地址。ARP请求报文是以广播的形式发送,所以该网段上的所有主机都会接收到这个请求包,但只有其IP地址与目的IP地址一致的主机B会对该请求进行处理。
  3. 主机B将ARP请求报文中的发送端(主机A)的IP地址和MAC地址存入自己的ARP表中,然后以单播方式(一对一,点对点形式)向主机A发送一个ARP响应报文,应答报文中就包含了自己的MAC地址,即原来请求报文中要请求的MAC地址。
  4. 主机A在收到来自主机B的ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将原来缓存的IP数据报再次修改(在目的MAC地址子弹填上已获得的主机B的的MAC地址)后发送出去。
上面就是同一网段中两主机的ARP地址解析的全过程。当两主机不在同一个网段中,其ARP地址解析过程如下:
  1. 如果主机A不知道网关(一个网络连接另一个网络的关口)的MAC地址(即主机A的ARP表没有命中),则主机A现在本网段中发出一个ARP请求广播报文,ARP请求报文中的目的IP地址为网关IP地址,代表其目的就是想获得网关的MAC地址。如果主机A已知网关MAC地址,则略过此步。
  2. 如果网关的ARP表(网关也有ARP映射表项)中已有主机B对应的MAC地址,则网关直接将在来自主机A的报文中的目的MAC地址字段填上主机B的MAC地址后转发给主机B。
  3. 如果网关ARP中没有,那么网关会再次向主机B所在网段发送ARP广播请求报文,此时目的IP地址为主机B的IP地址,其后续处理同前。
可以看出,不在一个网段的两个主机的ARP地址解析过程实际上是拆分为两个网段中的ARP地址解析过程,只不过介入一个网关充当主机。

这里说一下网关,网关实质上是一个网络通向其他网络的IP地址,是一个逻辑概念,定义网络的边界。路由器是物理设备,除具备网关功能外,还具备路由功能(以后再说)。

比如说只有两个网络,网络A(192.168.1.1~192.168.1.254)和网络B(192.168.2.1`192.168.2.254),子网掩码为255.255.255.0。可以看出这两个网络属于不同的两个网络,不能直接进行通信。即使连接在同一台交换机上,TCP/IP协议也会根据子网掩码判定两个网络中的主机处于不同网络里,不能进行网络间通信。(交换机是在物理层上工作,按MAC地址访问,所以也称二层交换机,两个子网间不能互访,除非是具备路由功能和VLAN功能的三层交换机)。这种情况下则需要通过网关进行通信。因为只有两个网络,也就一条连接路径,所以只需要网关就可以。

但如果是多个网络结构,形成一个网状,即两个网络之间可以有多条访问路径,这样则需要网关和路由器两种设备,不过现在路由器已经继承了网关的功能,所以只需要一个路由器即可,利用路由器的路由功能选择最佳路径进行通信。

RARP

RARP分组的格式与ARP分组基本一致。RARP为逆地址解析协议,作用与ARP相反,用于将MAC地址转换为IP地址。

具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址,但是无盘机,如X中断或无盘工作站,则需要采用其他方法来获得IP地址。

总得说来就是,网络上的每个系统都具有唯一的硬件地址,它是由网络接口生产厂家配置的。无盘系统的RARP实现过程是从接口卡上读取唯一的硬件地址,然后发送一份RARP请求,请求某个主机响应该无盘系统的IP地址。

RARP的工作过程如下:

  1. 网络上每台设备都会有一个独一无二的硬件地址,一般是由设备厂商分配的MAC地址。发送主机从网卡上读取MAC地址,然后在网络上发送一个RARP请求的广播数据包,请求任何收到此请求的RARP服务器分配一个IP地址;
  2. RARP服务器收到此请求后,检查其RARP表项,查找该MAC地址对应的IP地址;
  3. 如果存在,RARP服务器就给发送主机回复一个响应数据包,并将此IP地址提供给对方主机使用;
  4. 如果不存在,RARP服务器对此不做任何的响应;
  5. 发送主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯,如果一直没有收到RARP服务器的响应消息,表示初始化失败。
需要清楚,与ARP不同的是RARP是主机向RARP服务器获取自己的IP地址。
RARP从概念上看起来比较简单,但实际上比较复杂,服务器一般要为多个主机提供硬件地址到IP地址的映射,该映射包含在一个磁盘文件中,而内核一般不读取和分析磁盘文件,所以RARP服务器的功能就需由用户进程来提供。更为复杂的是,RARP请求是作为一个特殊类型的以太网数据帧来传送的,其请求是在硬件层上进行广播的,不经过路由器进行转发。
RARP协议是许多无盘系统在引导时用来获取IP地址的,一个RARP请求在网络上进行广播,它在分组中表明发送端的MAC地址,以请求相应IP地址的响应。另外RARP服务器的实现与系统相关。
对应于ARP,RARP请求是以广播方式发送,而ARP,RARP应答则一般是单播传送的。
 
关于ARP地址解析过程的源码剖析参见博文【Linux 内核网络协议栈源码剖析】ARP地址解析协议
 
参考资料:
《深入理解计算机网络》、《TCP/IP 一》。

【计算机网络】详解网络层(二)ARP和RARP的更多相关文章

  1. 【转】logback logback.xml常用配置详解(二)<appender>

    原创文章,转载请指明出处:http://aub.iteye.com/blog/1101260, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...

  2. logback 常用配置详解(二) <appender>

    logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写 ...

  3. OutputCache属性详解(二)一 Location

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  4. 【three.js详解之二】渲染器篇

    [three.js详解之二]渲染器篇   本篇文章将详细讲解three.js中渲染器(renderer)的设置方法. three.js文档中渲染器的分支如下: Renderers CanvasRend ...

  5. 安卓集成发布详解(二)gradle

    转自:http://frank-zhu.github.io/android/2015/06/15/android-release_app_build_gradle/ 安卓集成发布详解(二) 15 Ju ...

  6. ViewPager 详解(二)---详解四大函数

    前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合Android的API说明 ...

  7. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  8. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

  9. iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...

  10. Tomcat--各个目录详解(二)

    Tomcat整体目录: 一.bin文件(存放启动和关闭tomcat脚本) 其中.bat和.sh文件很多都是成对出现的,作用是一样的,一个是Windows的,一个是Linux. ① startup文件: ...

随机推荐

  1. Tensorflow入门(安装)

    TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统.主要用于深度学习(神经网络)方面的研究与应用.Tensorflow适用与Python.C++.Java,本博客中主 ...

  2. 源码之Java集合

    No1: ArrayList的扩容策略是,新容量扩大为原来的1.5倍. ArrayList不是线性安全的,因为没有使用synchronized关键字,但是优点是效率提高了.与之相比,Vector是线性 ...

  3. Mybatis框架简单使用

    Mybatis框架简单使用 环境搭建 新建一个JavaWeb项目,在web\WEB-INF\创建lib文件,并且在其下添加Mybatis的核心包以及依赖包,以及Mysql驱动包,junit4测试包等. ...

  4. “通用类型系统”(CTS)

    一.什么是“通用类型系统”(CTS) 描述类型的定义和行为 二.CTS规范 一个类型可以包含零个或者多个成员1,成员①字段(Field)作为对象状态一部分的数据变量.字段根据名称和类型来区分②方法(M ...

  5. String StringBuffer stringbuilder 区别

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 字符串类 ,长度不可变. 字符串缓存器类, 长度可变, 线程安全, 字符串构造器类,长度 ...

  6. 使用Java创建Excel,并添加内容

    使用Java创建Excel,并添加内容 一.依赖的Jar包 jxl.jar,使用jxl操作Excel Jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Ex ...

  7. CF946D Timetable 动态规划

    预处理出每一行去掉$k$个1能获得的最小代价 之后做一次分组背包$dp$即可 预处理可以选择暴力枚举区间... 复杂度$O(n^3)$ #include <set> #include &l ...

  8. disable_functions php-fpm root

    php.ini disable_functions 禁用某些函数 需要时注意打开 php-fpm 对应conf user group为root时 ERROR: [pool www] please sp ...

  9. Jenkins 使用 maven 出现C:\Windows\system32\config\systemprofile的解决

    jenkins 使用 maven 出现 C:\Windows\system32\config\systemprofile 的原因是 Jenkins 服务启动的账号使用了系统的账号,在服务里改成具体的桌 ...

  10. UIwebview 文件的下载与保存,以及mp3文件的播放

    这里只是说说异步 单线程下载与文件的保存 以下载一个mp3文件并保存为例: -(void)loading { //设置文件下载地址 NSString *urlString = [NSString st ...