地址解析协议(ARP)提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射。ARP仅用于IPv4,IPv6使用邻居发现协议,它被合并入ICMPv6。地址解析是发现两个地址之间的映射关系的过程,ARP提供从网络层地址到相关硬件地址的动态映射。

使用地址解析协议,可根据网络层IP数据报头部的IP地址信息解析出目标硬件地址(MAC地址)信息,以保证通信的顺利进行。

直接交付

直接交付发生在一个IP数据报被发送到一个IP地址,而该地址与发送方具有相同IP前缀的情况下,数据报可被直接发送到这个地址而不经过任何路由器。

假设一个发送方主机要向一个接收主机发送数据报直接交付的基本操作:

  1. 假设以太网兼容地址被用于IPv4子网,发送主机必须将32位的IPv4目的地址转换成48位的以太网地址(需要从逻辑Internet地址想对应物理硬件地址转换)。ARP工作在正常模式下仅适用于广播网络,链路层能将一个消息交付到它连接的所有网络设备;在非广播网络中,可能需要更复杂的映射协议。

  2. 在一个共享的链路层网段上,ARP向所有主机发送一个称为ARP请求的以太网帧(被称为链路层广播)。

  3. 通过ARP,同一广播域中的所有主机可接收ARP请求,接收ARP帧后针对IP做对比,如果匹配则发送应答;不匹配则丢弃ARP请求。

  4. ARP应答被原始请求的发送方接收,现在可发送引起"这次请求的ARP请求/应答交换过程"的数据报。

  5. 发送方可将数据报封装在以太网帧中直接发送到目的主机,并使用有ARP交换得到的以太网地址作为目的地址。(由于以太网地址仅指向正确的目的主机,所以其他主机或路由器不会接收到这个数据报)。

以上一次简单的直接交付中对ARP(以初次应用,无缓存的情况为例)应用的基本过程,简化后:发送主机在发送数据时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址,以此建立正确的链接来发送数据报。

ARP用于运行IPv4的多接入链路层网络,每个主机都有自已首选的硬件地址;第三章提到例如PPP的点到点链路不使用ARP。ARP高效运行的关键是维护每个主机和路由器上的ARP缓存(或表),其本质是记录IP地址和MAC地址的映射关系数据。当地址解析协议被询问一个已知IP地址节点的MAC地址时,先在ARP缓存中查看,如果存在,就直接返回与之对应的MAC地址了;如果不存在,才发送ARP请求向局域网查询。

可以通过 arp 命令可以查看arp缓存,arp命令及使用参数如下图:

缓存中完整的条目会比不完整的条目超时时间长,[RFC1122]规定每个条目即使在使用也应启动超时,但很多实现中是每次使用条目后重新启动超时。

ARP帧格式

对于ARP请求,目的以太网地址ff:ff:ff:ff:ff:ff(全为1)是广播地址,在同一个广播域的所有以太网接口可接收这些帧。在以太网帧中,ARP2字节的长度或类型字段必须为0x0806。

硬件类型字段指出硬件地址类型(对于以太网,值为1);

协议类型宁段指出映射的协议地此类型(对于IPv4,值为0x0800);

硬件大小和协议大小分别指出硬件地址和协议地址的字节数(对于IPv4的ARP,值分别为6和4);

Op字段指出该操作是ARP请求(1)、 ARP应答(2)、 RARP请求(3)或RARP应答(4)。

代理ARP

代理ARP使一个系统可回答不同主机的ARP请求,使的发送方认为做出响应的系统就是目的主机,但实际上目的主机可能在其他地方。

代理ARP也称混杂ARP或者黑客ARP,它具有"两个物理网络相互隐蔽自己"的用途。

在这种情况下,两个物理网络可使用相同的IP前缀,只要将中间的路由器配置为一个代理ARP,在一个网络中由代理系统来响应其他网络中主机的ARP请求。

免费ARP和地址冲突检测

现在有一个"一台主机发送ARP请求以寻找自己的地址"的骚操作,这操作也被称为"免费ARP"。

免费ARP需要达到两个目标:

  1. 允许一台主机确定另一台主机是否配置相同的IPv4地址。如果收到了ARP应答,则表示同一广播域中有一个系统地址配置错误。

  2. 如果发送免费ARP的主机已玫变硬件地址,该帧导致任何接收广播并且缓存中有该条目的其他主机将该条目的旧硬件地址更新为与该帧一致(更新缓存)。

IPv4地址冲突检测(ACD)定义了ARP探测分组和ARP通告分组。探测分组用于查看一个候选IPv4地址是否被广播域中的任何其他系统所使用;通告分组则用于通告发送方使用侯选IPv4地址的意图。

ACD和免费ARP的区别在于免费ARP是一次ARP请求/应答过程,而ACD被认为是一个持续的过程。

当一台主机通告它正使用的地址后,它会继续检查输入的ARP流量(请求和应答),查看自已的地址是否出现在发送方协议地址字段中。如果是的话,说明其他系统与自已在使用相同的地址。在这种情况下,[RFC5227]提供了3种可能的解决方案:停止使用这个地址;保留这个地址,但发送一个“防御性”ARP通告,如果冲突继续,则停止使用它;不理会冲突,仍继续使用。对于最后一个选择,仅建议那些真正需要一个围定、稳定地址的系统(例如打印机或路由器等嵌人式设备)使用。

[RFC5227]对尝试获得地址设置了10次的冲突限制,在请求的主机进入限速阶段之前,它被允许每60秒执行一次ACD,直至成功。

RARP

地址解析协议是根据IP地址获取物理地址的协议,而反向地址转换协议(RARP)是局域网的物理机器从网关服务器的ARP表或者缓存上根据MAC地址请求IP地址的协议,其功能与地址解析协议相反。

与ARP相比,RARP的工作流程也相反:

  1. 查询主机向网路送出一个RARP请求,向别的主机查询自己的IP地址。

  2. 网络上的RARP服务器就会将发送端的IP地址用RARP应答给查询者,这样查询主机就获得自己的IP地址。

小结 

ARP是TCP/IP中的一个基本协议。通过上述知识点能感知到ARP也是很重要的:功能方面用以确保数据正确的传送到目的主机;安全方面简单的比如代理ARP伪装主机,复杂的涉及ARP缓存条目的安全或者欺骗。

参考:

《TCP IP 详解卷1:协议》

RFC官方文档

TCP/IP 笔记 - 地址解析协议的更多相关文章

  1. TCP/IP 笔记 - Internet协议

    IP是TCP/IP协议族中的核心协议,TCP.UDP.ICMP.IGMP数据都通过IP数据报传输.IP提供了一种"尽力而为.无连接"的数据交付服务:尽力而为表示不保证IP数据报能成 ...

  2. TCP/IP和HTTP协议代理

    TCP/IP协议族 TCP/IP(传输控制协议/网际协议)是用于计算机通信的一个协议族. TCP/IP协议族包括诸如Internet协议(IP).地址解析协议(ARP).互联网控制信息协议(ICMP) ...

  3. TCP/IP笔记(1)

    TCP/IP 背景和介绍 上世纪 70 年代,随着计算机技术的发展,计算机使用者意识到:要想发挥计算机更大的作用,就要将世界各地的计算机连接起来.但是简单的连接是远远不够的,因为计算机之间无法沟通.因 ...

  4. http与https与socket tcp/IP与UDP 协议等

    网络由下往上分为:   物理层--                       数据链路层-- 网络层--                       IP协议 传输层--               ...

  5. TCP/IP 和HTTP 协议基础知识

    来源:http://www.myhack58.com/Article/60/63/2014/50072.htm 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过 ...

  6. TCP/IP及http协议 SOAP REST

    TCP/IP及http协议: TCP/IP协议主要解决数据如何在网络中传输, 而HTTP是应用层协议,主要解决如何包装数据 SOAP:简单对象访问协议(Simple Object Access Pro ...

  7. TCP/IP 5层协议簇/协议栈

    TCP/IP 5层协议簇/协议栈 数据/PDU 应用层 PC.防火墙 数据段/段Fragment 传输层 防火墙 报文/包/IP包packet 网络层 路由器 帧Frame 数据链路层 交换机.网卡 ...

  8. TCP/IP具体解释学习笔记——地址解析协议ARP

    一 概述 我们知道,IP协议是用来在不同的物理网络之间数据传输的.要在不同的网络之间数据传输,至少须要将IP协议所用的地址转换成特定网络所使用的物理地址. 一般来说.就是将IPv4地址转换为mac地址 ...

  9. TCP/IP笔记(四)IP协议

    前言 IP相当于OSI参考模型的第3层--网络层:主要作用是"实现终端节点之间的通信"又称"点对点通信". IP作为整个TCP/IP中至关重要的协议,主要负责将 ...

随机推荐

  1. laravel简书(1)

    Laravel的社区生态 中文社区(http://laravel-china.org) 5.4中文文档(http://d.laravel-china.org/docs/5.4) Laravel源码地址 ...

  2. thinkphp 视图(一)

    视图 View <?php namespace app\index\controller; class Index{ public function index(){ return view() ...

  3. EF ++属性会更新实体

    var lastBaby = await _babyRepository.FirstOrDefaultAsync(); ++lastBaby.sort; -- sort原本为1 -- 最终会生成一条语 ...

  4. maven 监理web war 项目

  5. 安装配置python环境,并跑一个推荐系统的例子

    1.官网下载python2.7,安装完后,在环境变量Path中加上这个路径 在控制台输入python,出现版本信息,就成功了. 2.我使用的是 pycharm,注册后,在 把自己的python.exe ...

  6. Array of Doubled Pairs LT954

    Given an array of integers A with even length, return true if and only if it is possible to reorder ...

  7. 接口测试3A原则

    手工的功能测试用例也可以用3A原则来编写. Arrange: 准备被测功能相关的测试数据,比如往系统里录入一批工单以便测试工单的分页功能 Act : 调用被测的功能,实际上这就是我们一直讲的测试步骤 ...

  8. _ZNote_Objective-C_用终端编译OC程序

    某些情况下,仅仅想写一些简单的代码,可以不用Xcode,仅仅使用终端即可编译OC程序. 打开终端. 输入vi test.m 输入一下代码: #import <Foundation/Foundat ...

  9. opencv源码编写规则

    OPENCV作为一种开源的计算机视觉库,我们有必要去了解这个库的一些编码格式及文件结构. 1.文档命名规则 必须将所有功能放入一个或多个.cpp和.hpp文件到OpenCV的相应模块中,或者如果贡献的 ...

  10. 菜刀(代码执行)函数和命令执行函数详解及Getshell方法

    i春秋作家:大家奥斯的哦 原文来自:https://bbs.ichunqiu.com/thread-41471-1-1.html 代码执行函数 VS 命令执行函数 一直想整理这两块的内容,但是一直没时 ...