地址解析协议(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. thinkphp用ajax遇到的坑——ajax请求没有反应

    view视图的 html 的 js 代码如下, $.ajax({             url:"test",//这里指向的就不再是页面了,而是一个方法.             ...

  2. django 在centos 7 下 指定ip地址和端口 报错问题

    windows environment: python manage.py runserver host:port centos environment: python manage.py runse ...

  3. SpringMVC Http请求工具代码类

    在SpringMVC的源代码中也提供了一个封装过的ThreadLocal,其中保存了每次请求的HttpServletRequest对象,(详细请看org.springframework.web.con ...

  4. 搭建Fabric网络(二)下载bin和images

    上一篇已经把运行和开发Fabric需要的程序都安装好了,这一篇主要讲怎么运行一个简单的Fabric网络. 1.  下载官方Sample代码 git clone -b master https://gi ...

  5. AI绘制毛线的小技巧

    1.新建一个500*500的画布.       2.绘制一个大小一样的正方形[颜色#060B1d]       3.绘制圆形1pt描边.       4. ctrl+c ctrl+F 原位复制圆形等比 ...

  6. shell启动执行cypher语句

    1.跳转到目录:cd /data/soft/neo4j-community-not/ 2.修改配置文件:nano ./conf/neo4j.conf: 3. 登录:bin/cypher-shell - ...

  7. MySQL5.7 Group Replication (MGR)--Mysql的组复制之多主模式

    MGR——Mysql的组复制之多主模式 以下测试在VMware环境: 操作系统:Centos 6.9 X86_64 数据库:Mysql 5.7 (mysql  Ver 14.14 Distrib 5. ...

  8. jdbc随笔

    通过jdbc连接数据库的基本步骤:  导入jar包驱动类  jdbc语法:jdbc:子协议:厂商内容  对于mysql而言:jdbc:mysql://主机地址:端口号/库名               ...

  9. canvas画圆环

    <!DOCTYPE html><html> <head> <title> </title> <meta http-equiv=&quo ...

  10. fcitx4.2.0自定义中文标点符号

    +fcitx 定制标点 http://forum.ubuntu.com.cn/viewtopic.PHP?t=376701&p=2755636 下载punc.mb.gz放到~/.config/ ...