ARP详解
ARP详解
1、前言
地址解析协议(Address Resolution Protocol,ARP)是一个通过解析网络层地址来寻找数据链路层地址的网络传输协议,它在IPv4中极其重要。ARP是通过网络地址来定位MAC地址。
1.1 建立TCP连接与ARP的关系
应用接受用户提交的数据,触发TCP建立连接,TCP的第一个SYN报文到达网络层并开始查询路由表:
1)如果目的IP和自己在同一个网段:
当发送端的ARP高速缓存表中在目的端对应的MAC地址时,则发送端在TCP SYN封装时,直接将目的端IP和MAC地址进行填充并发送出去。
当发送端的ARP高速缓存表中不存在目的端对应的MAC地址时,则IP层将TCP SYN连接缓存下来,发送ARP广播请求目的端的MAC地址,在目的端收到ARP请求,将自己的MAC和IP进行封装形成应答包,发送给发送端,发送端在收到ARP应答包之后,将目的端的IP和MAC缓存至自己的ARP高速缓存表中并进行填充,随后发送端将自己的TCP SYN连接发送出去。
(1)ARP请求包
(2)ARP应答
2)如果目标地址和自己不在同一个网段,就需要将包发送给默认网关,这需要知道默认网关的MAC地址:
当IP层的ARP高速缓存表中在默认网关对应的地址时,则发送端在TCP SYN封装时,直接将目的MAC填充为默认网关发送出去。
当发送端的ARP高速缓存表中不存在默认网关对应的MAC地址时,则IP层将TCP SYN连接缓存下来,发送ARP广播请求默认网关的MAC地址,在网关收到ARP请求,将自己的MAC和IP进行封装形成应答包,发送给发送端,发送端在收到ARP应答包之后,将默认网关的IP和MAC缓存至自己的ARP高速缓存表中,随后发送端将自己的TCP SYN连接发送出去。
1.2 ARP的位置
OSI模型有7层,TCP在4层传输层,IP在3层网络层,ARP在2层数据链路层,高层对底层有强制依赖性,所以在TCP的建立前需要读取网络层中ARP高速缓存表中的数据,如果有则直接使用;如果没有就需要网络层对数据链路层进行依赖,则数据链路层进行ARP请求和应答,并发送给网络层并对ARP高速缓存进行补充。
2、ARP分组格式
以太网地址就是指MAC地址
2.1 以太网链路层-以太网首部(14字节)
目标以太网地址:ARP请求的目标MAC地址,FF:FF:FF:FF:FF:FF(二进制全为1)为广播地址。
源以太网地址:ARP发送方的MAC地址。
帧类型:以太网类型表示的是后面的数据类型,ARP为0x0806
2.2以太网报文数据-ARP请求/应答(28字节)
硬件类型:如以太网(0x0001)、分组无线网
协议类型:如网际协议(IP,0x0800)、IPv6(0x86DD)
硬件地址长度:每种硬件地址的字节长度,一般为6
协议地址长度:每种协议地址的字节长度,一般为4
操作码:1为ARP请求,2为ARP应答;3为RARP请求,4为RARP应答
源硬件地址:发送端ARP请求或应答的应答地址,这里是以太网地址,和填充在源以太网地址相同
源协议地址:发送ARP请求或应答的IP地址
目的硬件地址:在ARP请求时为FF:FF:FF:FF:FF:FF(二进制全为1)广播地址;在ARP应答时发送端的MAC。
目的协议地址:在ARP请求时为目的IP地址。
3、ARP高速缓存
3.1 定义:
ARP缓存是一个缓存区。用来储存IP地址和MAC地址,本质是<IP地址,MAC地址>的对应表中。表中一个条目记录了网络上一个主机的IP地址和其对应的MAC地址。
每一个以太网或令牌环网网络设配器都会有一个自己的ARP表,如下图:
Linux:
Windows:
当地址解析协议被询问一个已知IP地址节点,先查看本地ARP缓存表,若存在则直接返回对应的MAC地址;如果不存在,本地端才会发送ARP请求报文。
3.2 ARP缓存时间
在ARP缓存表中,动态ARP和静态ARP:
动态ARP:动态ARP条目随着时间推移自动添加或删除,每一个动态ARP缓存项目都设置了生存时间(TTL),TTL为0时此项目就会从ARP表中删除,
Linux默认60秒:
Windows默认120秒:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters(如下不存在,需要创建)
(1)ArpCacheLife:定义arp老化时间,默认120秒
(2)ArpCacheMinReferencedLife:定义arp最大老化时间,默认10分钟
4、ARP报文总长度
ARP报文总长度为64字节
但是在ARP传输过程中只有42字节:
以太网首部+ARP包头=14+28=42字节(bytes)
而在现实情况下,为了保证以太网帧的最小帧长为64字节(bytes),所以会在报文李添加一个padding字段用来填充,而保证帧大小为64字节(bytes)。