开篇小述:这篇文章咱们就拿网络中不可或缺的地址解析协议ARP和与之相关的ARP缓存机制、硬件mac地址等,这里不讲“在当今世界,几乎已经没有人脱离网络而独立存在、、、、、、我们每个人都要懂一些网络数据基础知识、、、、、、、”什么的,下面我们开篇就来(微笑抱拳+前后左右)。
ARP协议是以太网中不可或缺的最基础的协议,为什么说它不可或缺和最基础呢?根据以太网的数据包组成规则我们可以发现每个数据包中都有以太网Ethernet II 即Src(Destination: 目的硬件mac地址)和Dst(Source:源硬件mac地址 ),也就是说数据流量的每个包都必须需要Ethernet II 的mac地址,而本篇文要讲的ARP协议就是提供IP地址与硬件地址(以太网地址)之间的对应关系的作用,ARP的基本行为有两种:提供ARP缓存表项和由已知的IP地址获取未知的硬件mac地址,为数据包的封装链路传输层提供了基础。
图1 数据包的Ethernet II封装
既然我们这篇文讲的ARP协议的应用与Ethernet II有必然联系,那么这小节简单说一下Ethernet II是‘啥’!专业点来讲的说就是我们所说的链路传输层,链路传输层封装了数据包必须的硬件mac地址和上层(网络层即ip层)封装的协议,如上图1举例的上层封装的协议类型Type为IPv4,当然要是ARP包的话这个字段的Type是ARP。上文我们说ARP是提供IP地址和mac地址对应关系的,那么硬件地址mac地址是什么呢?硬件mac地址是每一个网络设备的网口(如电脑、交换机、路由器等)出厂就带的标识这个网口独一性的ID编号,就像每个人的身份证号一样,在整个网络中没有重复的。
开头我们说ARP的两种基本行为是提供ARP缓存表项和由已知的IP地址获取未知的硬件mac地址,本小节简单说一下ARP缓存表和mac地址获取的过程。ARP表在每个具备路由功能的网络设备上或终端上都必存在的用于转发查询的表,主要标注目的IP地址所对应的硬件mac地址,如图2 。如果我们电脑或者路由器新接入网络中,要进行数据转发但是有没有对应的ARP缓存表项会怎么办?这是就会触发ARP的获取目的IP地址对应的硬件mac地址来更新自己的ARP表,设备会先以广播的方式发出去一个请求该IP地址的ARP询问包,同时是向网络中宣布自己的IP和mac,这样别的设备收到这个广播的询问包就会将这个设备的ARP表项自动更新到自己的ARP表中,当被请求的IP地址设备收到这个询问包就会回复一个对应的单播ARP应答包给发起设备,这样发起设备就获取了请求IP的mac地址并更新到自己的ARP表中,以用于数据包封装转发。
图2 电脑上的ARP表
那么为什么称为ARP缓存表呢?大家知道mac地址是每个设备网口的唯一标识,但是IP地址是按需要设置的(手动设置IP或获取已经设置好的动态IP),IP地址就像我们电脑的临时身份,在不同网络场景里可以有不同的IP地址,这就使ARP表中的IP与mac的对应关系在不停的变化,所以ARP表的机制被设计成了缓存机制,自动的动态学习,缓存超时时间一般20分钟。当然也可以设定固定的ARP表项,一般很少用到。
简练而又低调的arp协议,arp在我们使用的网络中很是低调,如果不着重注意很容易会将它忽视,但是当我们稍微用点心,就会发现arp无处不在,同时arp也是最勤快和乐于奉献的,当然服务对象只针对与需要mac的需求。
讲过arp的作用、特点等基础认识,我们就对着arp的询问包和应答包来具体讲一下arp的具体构造。
图3 一组ARP询问包和对应应答包
首先我们看一下ARP包中封装了以太网头部,以太网报头中前两个字段是以太网的源地址和目的地址,各占6Byte,全为1,是广播地址。然后是帧类型,表示后面数据的类型,占2Byte,对arp请求或应答来说,该字段的值都是0x0806。
图4 ARP包封装结构示意图
接下来就是ARP头部(28字节)及报文,如下图5,首先是hardware type(硬件字段类型)和protocel type(协议类型),各占2Byte,0x0800表示ip协议。然后是硬件地址长度和协议地址长度,各占1Byte,对于以太网上的arp应答或请求来说,它们的值分别为6和4。之后是2Byte的操作字段Opcode,只有四种操作类型(1为ARP请求,2为ARP应答,3为RARP请求,4为RARP应答)。
图5 ARP询问包ARP头部
其实对于ARP协议来说,重点关注的是数据包的操作类型Opcode,发送端的硬件地址Sender MAC address(6Byte),IP地址Sender IP address(4Byte),目的端的硬件地址Target MAC address(6Byte),IP地址Target IP address(4Byte)。从上文讲述我们知道ARP询问包携带着自己的ip与mac去请求目的ip的mac,对比上图5中Sender MAC/IP address是携带的自己的ip和mac,Target IP address是需要获取的对象的ip地址,那么ARP询问包中的Target MAC address问什么却是全0呢?ARP询问包中的Target MAC address=全0意思是需要Target IP address的设备需要回复填充的,不要纠结为什么用全0,这是ARP协议规则规定的,纠结无用。
当设备收到ARP询问包看到Target MAC address字段是自己的ip地址时它就明白需要它回复一个类型为reply的ARP应答包并以单播形式回复给Sender IP address字段的ip的设备,如下图6。
图6 ARP应答包
最后提一下Ethernet II 中的Padding字段,它属于填充字端,至于为什么要填充,这就和数据包的封装、各层的头部组成有关系了,下面有时间我会发文讲一下(话不多说+挥手)。