1. 地址解析协议(ARP)提供了一种在IPv4地址和以太网地址之间的动态映射。
备注:
[1]. ARP仅用于IPv4,IPv6使用ICMPv6来完成类似的功能。
[2]. ARP仅工作在同一IP子网,这意味着ARP缓存中只会存在位于同一IP子网中的ARP表项。
2. ARP帧格式(不考虑802.1q或其他标记)
字段名 占用长度 解释
type 2Bytes ARP协议号0x0806
硬件地址类型 2Bytes 对于以太网,该值为1(事实上ARP几乎只会描述以太网类型的硬件地址)
协议地址类型 2Bytes 对于IPv4,该值位0x0800(同样的,ARP几乎只会描述IPv4类型的协议地址)
硬件地址长度 1Bytes 以太网地址固定为6字节
协议地址长度 1Bytes IPv4地址固定为4字节
操作码 2Bytes 标识该ARP的具体操作,目前基本只存在ARP请求(1)和ARP应答(2)这两种
源硬件地址 6Bytes 跟src-mac字段内容重复
源协议地址 4Bytes 通常就是发送方的IPv4地址
3. ARP协议基本工作流程如下:
请求方发出一个携带ARP请求的链路层广播帧;
同一广播域中的所有主机都会接收到该ARP请求,IP地址不匹配的主机直接丢弃;
只有IP地址匹配的主机会响应一个ARP应答,这个应答中包含了所请求的IPv4地址以及对应的MAC地址,并且这个ARP应答通常直接是以单播的形式发给请求方;
同时应答方会学习ARP请求中请求方的IPv4地址和对应的MAC地址,并将这种映射关系记录在其ARP缓存表中;
最后,ARP应答被请求方接收,将请求到的映射关系记录在其ARP缓存表中。至此两边主机的ARP缓存表中都有了对方的ARP表项
4. ARP缓存为系统中所有接口维护协议地址到硬件地址的最新映射关系,每条动态ARP表项的老化时间是20分钟。
linux中使用arp命令操作ARP缓存,常用options如下:
-a 显示ARP缓存中的所有ARP表项
-s <IP/host> <MAC> 手动添加一条ARP表项(这种静态ARP表项不会老化)
-d <IP/host> 删除指定ARP表项(删除后这条ARP表项还会残留,但标记为incomplete)
备注:
[1]. 如果系统收到的ARP请求来自一个已经记录在ARP缓存中的IPv4地址,则这条ARP表项记录的MAC地址会被该ARP请求刷新,并且还通常伴随着老化时间复位。
[2]. linux中如果对一个同一IP子网中的不存在主机发起ARP请求,则会在ARP缓存中记录一条标记为incomplete的对应的ARP表项。
5. IPv4地址冲突检测(ACD),顾名思义,就是用来检测同一广播域中的IPv4地址是否存在冲突。
标准的ACD定义了以下两类分组:
[1]. ARP探测分组,用于探测一个候选IPv4地址是否已经被广播域中的任何其他系统所使用。
当一个接口被启用或从睡眠中唤醒或一个新链路建立时触发ARP探测分组。
该分组格式上是3个特殊的ARP请求报文,其中"源协议地址"字段被设置为0,"目的协议地址"字段为本机准备使用的候选IPv4地址。
备注:
"源协议地址"字段被设置为0可以避免候选IPv4地址被另一台主机使用时的ARP缓存污染
[2]. ARP通告分组,用于通告发送方使用候选IPv4地址的意图,确保广播域中相关系统的该ARP表项(如果存在)正确反映了当前使用的地址。
当本机在发送ARP探测分组期间没有收到针对相同候选IPv4地址的ARP请求或应答,意味着在广播域中没有发现冲突,则开始向广播域中发送ARP通告分组。
该分组格式上是2个特殊的ARP请求报文,其中"源协议地址"字段和"目的协议地址"字段都被设置为本机准备使用的候选IPv4地址(这跟免费ARP格式上一样)。
备注:
备注:
[1]. ARP仅用于IPv4,IPv6使用ICMPv6来完成类似的功能。
[2]. ARP仅工作在同一IP子网,这意味着ARP缓存中只会存在位于同一IP子网中的ARP表项。
2. ARP帧格式(不考虑802.1q或其他标记)
字段名 占用长度 解释
dst-mac 6Bytes 目的以太网地址,对于ARP请求,该字段为链路层广播地址ff:ff:ff:ff:ff:ff;
对于ARP应答,该字段为对应ARP请求报文中的src-mac
src-mac 6Bytes 源以太网地址type 2Bytes ARP协议号0x0806
硬件地址类型 2Bytes 对于以太网,该值为1(事实上ARP几乎只会描述以太网类型的硬件地址)
协议地址类型 2Bytes 对于IPv4,该值位0x0800(同样的,ARP几乎只会描述IPv4类型的协议地址)
硬件地址长度 1Bytes 以太网地址固定为6字节
协议地址长度 1Bytes IPv4地址固定为4字节
操作码 2Bytes 标识该ARP的具体操作,目前基本只存在ARP请求(1)和ARP应答(2)这两种
源硬件地址 6Bytes 跟src-mac字段内容重复
源协议地址 4Bytes 通常就是发送方的IPv4地址
目的硬件地址 6Bytes 对于ARP请求,该字段全0;
对于ARP应答,该字段为对应ARP请求报文中的src-mac
目的协议地址 4Bytes 通常就是目的IPv4地址3. ARP协议基本工作流程如下:
请求方发出一个携带ARP请求的链路层广播帧;
同一广播域中的所有主机都会接收到该ARP请求,IP地址不匹配的主机直接丢弃;
只有IP地址匹配的主机会响应一个ARP应答,这个应答中包含了所请求的IPv4地址以及对应的MAC地址,并且这个ARP应答通常直接是以单播的形式发给请求方;
同时应答方会学习ARP请求中请求方的IPv4地址和对应的MAC地址,并将这种映射关系记录在其ARP缓存表中;
最后,ARP应答被请求方接收,将请求到的映射关系记录在其ARP缓存表中。至此两边主机的ARP缓存表中都有了对方的ARP表项
4. ARP缓存为系统中所有接口维护协议地址到硬件地址的最新映射关系,每条动态ARP表项的老化时间是20分钟。
linux中使用arp命令操作ARP缓存,常用options如下:
-a 显示ARP缓存中的所有ARP表项
-s <IP/host> <MAC> 手动添加一条ARP表项(这种静态ARP表项不会老化)
-d <IP/host> 删除指定ARP表项(删除后这条ARP表项还会残留,但标记为incomplete)
备注:
[1]. 如果系统收到的ARP请求来自一个已经记录在ARP缓存中的IPv4地址,则这条ARP表项记录的MAC地址会被该ARP请求刷新,并且还通常伴随着老化时间复位。
[2]. linux中如果对一个同一IP子网中的不存在主机发起ARP请求,则会在ARP缓存中记录一条标记为incomplete的对应的ARP表项。
5. IPv4地址冲突检测(ACD),顾名思义,就是用来检测同一广播域中的IPv4地址是否存在冲突。
标准的ACD定义了以下两类分组:
[1]. ARP探测分组,用于探测一个候选IPv4地址是否已经被广播域中的任何其他系统所使用。
当一个接口被启用或从睡眠中唤醒或一个新链路建立时触发ARP探测分组。
该分组格式上是3个特殊的ARP请求报文,其中"源协议地址"字段被设置为0,"目的协议地址"字段为本机准备使用的候选IPv4地址。
备注:
"源协议地址"字段被设置为0可以避免候选IPv4地址被另一台主机使用时的ARP缓存污染
[2]. ARP通告分组,用于通告发送方使用候选IPv4地址的意图,确保广播域中相关系统的该ARP表项(如果存在)正确反映了当前使用的地址。
当本机在发送ARP探测分组期间没有收到针对相同候选IPv4地址的ARP请求或应答,意味着在广播域中没有发现冲突,则开始向广播域中发送ARP通告分组。
该分组格式上是2个特殊的ARP请求报文,其中"源协议地址"字段和"目的协议地址"字段都被设置为本机准备使用的候选IPv4地址(这跟免费ARP格式上一样)。
备注:
在多台设备上的测试发现,实际系统似乎并不一定严格遵守了标准的ACD机制,比如有的省略了ARP通告分组: