前置知识:mac地址
在说到ARP协议之前,需要了解MAC地址,在OSI七层模型中,第三层是网络层,要解决的是下一跳机制确定的设备位置,具体来说就是网卡地址,MAC地址用于在网络中唯一标示一个 网卡 ,一台设备若有一或多个网卡,则每个网卡都需要并有一个唯一的MAC地址。
MAC地址格式
MAC地址共48位(6个字节),以十六进制表示。第1Bit为广播地址(0)/群播地址(1),第2Bit为广域地址(0)/区域地址(1)。前3~24位由IEEE决定如何分配给每一家制造商,且不重复,后24位由实际生产该网络设备的厂商自行指定且不重复。
ff:ff:ff:ff:ff:ff则作为广播地址。
01:xx:xx:xx:xx:xx是多播地址,01:00:5e:xx:xx:xx是IPv4多播地址。
ARP协议简介
地址解析协议(英语:Address Resolution Protocol,缩写:ARP)是一个 通过解析网络层地址来找寻数据链路层地址的网络传输协议 ,它在IPv4中极其重要。
ARP是通过 网络地址 来定位MAC地址。ARP已经在很多 网路层 和 数据链接层 之间得以实现,包括IPv4,Chao.NET, DECnet和Xerox PARC Universal Packet(PUP)使用IEEE 802标准, 光纤分布式数据接口, X.25, 帧中继和异步传输模式(ATM),IEEE 802.3和IEEE 802.11标准上IPv4占了多数流量。
在IPv6中, 邻居发现协议 (NDP)用于代替 地址解析协议 (ARP)。
ARP功能
在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的 MAC地址 。而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时, 数据链路层 的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法, 根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。所谓地址解析(address resolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程 。
另外,当发送主机和目的主机不在同一个局域网中时,即便知道对方的MAC地址,两者也不能直接通信,必须经过 路由转发 才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的 路由器的MAC地址 。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为 委托ARP或ARP代理 (ARP Proxy)。
在点对点链路中不使用ARP,实际上在点对点网络中也不使用MAC地址,因为在此类网络中分别已经获取了对端的IP地址。
图解ARP协议
根据OSI数据封装顺序,发送方会自顶向下(从应用层到物理层)封装数据,然后发送出去,如果P1 ping P2,那么发生下图所示过程:
由于MAC是确定物理设备(网卡)唯一标识,那么这个包在数据链路层就会失败,因为没法找到对应的主机,于是有了ARP协议,说得简单点就是根据在发送数据之前,通过IP2获取MAC2的过程:
这时候,有了 [IP1=>IP2, MAC1=>MAC2] ,这两个信息就可以确定主机,并且建立通讯,这时候有个问题,我们图上是一对一的,如果这两个主机不在一个局域网呢?离得很远很远,那怎么办?
解决办法是广播:
当arp协议数据包进行广播时,非目的主机接受到这个包会直接丢弃,接收到这个包的目的主机PC2会直接将信息发送给PC1,注意,由于这时候PC2接收到的包中已经有了PC1的IP地址以及MAC地址,所以不需要广播,直接进行发送进行了。
经过上面的处理,PC1获取了PC2的MAC2地址,就可以把数据包发送出去,之后便可以进行正常的通信。ARP的功能和实现过程是如此的简单:它在发送方需要目标MAC地址的时及时出手,通过"一问一答"的方式获取到特定IP对应的MAC地址,然后存储到本地【ARP缓存表】,后续需要的话,就到这里查找。
ARP缓存表
如果我想向局域网中的某个电脑再发送一个数据,那么我的电脑就会从已有的 ARP缓存表 中寻找这个IP地址对应的物理地址的ARP表项,然后直接将数据写入以太网数据帧中让网卡进行发送即可,而如果没有找到这个IP地址,那么这个数据就没法立即发送,电脑会先在局域网上广播一个 ARP请求 (目标MAC地址为 FF-FF-FF-FF-FF-FF ),广播的ARP请求发出后,处于同一局域网内的所有主机都会接收到这个请求,如果目标IP地址与接收到ARP请求的主机自身IP地址吻合就会返回一个ARP应答,告诉请求者(即我的电脑)自身的MAC地址,当我的电脑收到这个ARP应答后,就去建立一个ARP表项,并且重新将数据发送出去。
ARP协议的核心就是对缓存表的操作,发送数据包的时候,查找ARP缓存表以得到对应的MAC地址,在ARP缓存表中的TTL即将过期的时候更新缓存表以保证ARP表项有效,此外ARP协议还需要不断处理来自局域网中其他主机的ARP请求。
如果两台电脑不在一个网段,电脑查询自己的路由表,知道如果想和博客主机通信则必须通过网关(gateway)来中转, 所以会在与网关直连的网卡上请求网关的MAC地址,因为电脑要把发给PC2主机的数据先发给网关,当合法以太帧到达网关并且顺利接收,网关会将数据递交给IP层,IP层查询路由表,找到与博客主机直连的接口 (假设是直连的,实际上肯定不是直连的),网关会发一个ARP请求到博客主机上,请求它的MAC地址,网关收到应答后将建立新的ARP表项并将开始维护ARP缓存表,然后完成最终的通信。
APR缓存表有一定的时限性,因为ARP是动态处理的,ARP表项的生存时间是一般为5-10分钟(LwIP中默认是5分钟),而ARP请求的等待时间是5秒钟,当这些时间到达后,就会更新ARP表项,如果在物理链路层无法连通则会删除表项, 另外电脑重启的话ARP缓存表会被清空 。因此每个协议栈的实现都必须维护着一个定时器(超时机制)来管理ARP缓存表,在必要的时候更新及删除ARP表项,关于怎么处理的就不多追究,有兴趣的可以看LwIP的etharp_tmr源码。
ARP报文
ARP报文格式如下:
当ARP报文封装在以太网帧中,格式:
在ARP首部一开始的 2个字节 存储的是硬件类型,表示要知道目标网卡的硬件类型,其中,值为 1 表示以太网地址;接下来还有 2字节 的协议类型,其中, 0x0800 表示IP协议,其他还可能是 ICMP/IGMP协议 等;接下来有 1个字节 表示硬件地址长度,指出该报文中硬件地址的长度,对于以太网硬件类型,它的值为6;还有 1字节 的协议地址长度,如果是ARP协议、IP协议等,该值为4;ARP首部最后的op字段用于记录ARP操作的类型,分别是:
ARP请求,其值为1。
ARP应答,其值为2。
RARP请求,其值为3。
RARP应答,其值为4。
ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。
在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。
一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。
来源:https://www.cnblogs.com/Courage129/p/14322842.html