简介
IP协议的设计目的是为跨越不同类型物理网络的分组交换提供互操作。这需要网络层软件使用的地址和底层网络硬件使用的地址之间进行转换。网络接口硬件通常有一个主要的硬件地址。由硬件交换的帧需要正确的硬件地址定位到正确的接口;否则无法传输数据。但是,传统的IPv4网络需要使用自己的地址:32位的IPv4地址。如果一台主机要将一个帧发送到另一台主机,仅知道这台主机的IP地址是不够的,还需要知道主机在网络中的有效硬件地址。对于TCP/IP网络,地址解析协议(ARP)提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射。IPv6使用邻居发现协议,它被合并入ICMPv6。
网络层地址和链路层地址是由不同部门分配的。对于网络硬件,主地址是由设备制造商定义的,并存储在设备的永久性内存中,它是不会改变的。网络接口的IP地址是由用户或者网络管理员分配的,并且可以按需选择。
地址解析是发现两个地址之间的映射关系的过程,ARP提供从网络层地址到相关硬件地址的动态映射。
一个列子
我们假设使用Web浏览器打开一个网址,http://10.0.0.1。
1、应用程序是Web浏览器,调用一个特殊函数解析URL,看它是否包含主机名称。(这里说的应该是主机的物理地址)
2、应用程序要求TCP协议建立一条道10.0.0.1的连接。
3、通过向10.0.0.1发送一个IPv4数据报,TCP尝试向远程主机发送一个连接请求。
4、我们假设10.0.0.1 使用与发送主机相同的网络前缀,数据报可以直接发达这个地址,不需要路由器转发。
疑问,数据报直接发到这个地址不就可以了?那为什么还需要ARP?
我们在Web浏览器里输入的是 http://10.0.0.1,这是IPv4地址,我们不知道目的主机的硬件地址是多少,上面说到,如果一台主机要将一个帧发送到另一台主机,仅知道这台主机的IP地址是不够的,还需要知道主机在网络中的有效硬件地址。但是目前我们只知道目的主机的IP地址(http://10.0.0.1),剩下的工作是由地址解析协议完成的。
5、主机将32位的IPv4地址转换为48位的以太网地址,这就是ARP的功能。
6、在一个共享的链路层网段上,ARP向所有主机发送一个称为ARP请求的以太网帧(被称为链路层广播)。ARP请求包含目的主机的IP地址,并寻找以下答案,“如果你将你的IP地址配置成10.0.0.1,请向我回应你的MAC地址”。
7、如果某个系统使用请求中指出的IPv4地址,它仅需要响应一个ARP应答。应答包括IPv4地址(与请求相匹配)和对应的MAC地址。这个应答通常不是广播形式的。同时,接收ARP请求的主机学习IPv4到MAC地址的映射,并记录在内存,供以后使用。
8、ARP应答被原始请求的发送方接收,现在可以发送数据报了。
9、发送方将数据报封装在以太网帧中直接发送到目的主机,并使用ARP交换学到的以太网地址作为目的地址。当链路被建立后,在链路的两端通知正在使用的地址,之后就不需要地址解析协议或ARP了。
ARP缓存
ARP高效运行的关键是维护主机和路由表上的ARP缓存。该缓存使用地址解析协议为每个接口维护从网络层地址到硬件地址的最新映射。
我们可以用 ARP命令查看ARP缓存。 -a用于显示缓存中的所有条目,适用于Linux和Windows, Linux提供的操作更多一些。
ARP帧格式
ARP缓存超时
超时通常与ARP缓存中的每个条目相关,大多数实现中,完成条目的超时为20分钟,而不完整条目的超时为3分钟。这些实现通常在每次使用一个条目后为它重新启动20分钟的超时。
软状态是指在超时到达之前没有更新而被丢弃的信息。如果网络条件发生改变,软状态有助于启动自动重新配置。
代理ARP
代理ARP使一个系统(通常是一个专门配置的路由器)可以回答不同主机的ARP请求,它使ARP请求的发送者认为做出响应的系统就是目的主机。
免费ARP和地址冲突检测
ARP的另一个功能被称为免费ARP,它发生在一台主机发送ARP请求以寻找自己的地址时。发送方协议地址和目的协议地址相同。
免费ARP需要达到两个目的:
1、允许一台主机确定另一台主机是否配置相同的IPv4地址。
2、如果发送免费ARP的主机已改变硬件地址,该帧导致任何接收广播并且其缓存中有该条目的其他主机,将该条目中的旧硬件地址更新为与该帧一致。
IPv4地址冲突检测(ACD)。ACD定义了ARP探测分组和ARP通告分组。ARP探测分组是一个ARP请求分组,用于查看一个候选IPv4地址是否被广播域中的任何其他系统所使用。通过将发送方协议地址字段设置为0,避免候选IPv4地址被另一台主机使用时的缓存污染,这是它与免费ARP工作方式的一个差别。ARP通告和ARP探测相同,除了其发送方协议地址和目的协议地址被填充位IPv4地址外。它用于通告发送方使用候选IPv4地址的意图。
为了执行ACD,当一个接口被启动或从睡眠中唤醒,或一个新链路建立时,这台主机发送一个ARP探测分组。当请求站发送自己的探测时,它可能收到ARP请求或应答。对其探测的应答表明其他站已使用候选IP地址。从不同系统发送的请求,其目的协议地址字段中包含相同的候选IPv4地址,表明其他系统也在同时尝试获得候选IPv4地址。在这种情况下,该系统将会显示一个地址冲突消息,并采用其他可选地址。如果发送请求的主机没有发现冲突,它会间隔2秒向广播域中发送2个ARP通告,以表明它现在使用这个IPv4地址。发送这些通告的目的是确保更新缓存地址映射,以正确反映发送方当前使用的地址。
ACD被认为是一个持续的过程,这是它与免费ARP的区别。当一台主机通告它正使用的地址后,它会继续检查输入的ARP流量(请求和应答),查看自己的地址是否出现在发送方协议地址字段中,如果是的话,说明其他系统与自己在使用相同的地址。[RFC5227]提供了3种可能的解决方案:停止使用这个地址;保留这个地址,发送一个“防御性”ARP通告,如果继续冲突,则停止使用它;不理会冲突,继续使用。