引言从前一篇“网络底层知识讲解”文章中,我们知道计算机中会维护一个arp缓存表,这个表记录着ip地址与mac地址的映射关系,我们可以通过在电脑的控制台通过arp -a指令查看一下我们自己计算机的arp缓存表:
arp缓存表
那么什么是arp协议呢?
初识arparp协议是地址解析协议(address resolution protocol)是通过解析ip地址得到mac地址的,是一个在网络协议包中极其重要的网络传输协议,它与网卡有着极其密切的关系,在tcp/ip分层结构中,把arp划分为网络层,为什么呢,因为在网络层看来,源主机与目标主机是通过ip地址进行识别的,而所有的数据传输又依赖网卡底层硬件,即链路层,那么就需要将这些ip地址转换为链路层可以识别的东西,在所有的链路中都有着自己的一套寻址机制,如在以太网中使用mac地址进行寻址,以标识不同的主机,那么就需要有一个协议将ip地址转换为mac地址,由此就出现了arp协议,所有arp协议在网络层被应用,它是网络层与链路层连接的重要枢纽,每当有一个数据要发送的时候都需要在通过arp协议将ip地址转换成mac地址,在ip层及其以上的层次看来,他们只标识ip地址,从不跟硬件打交道,就像我一样,我做应用层的工作,而不会去写底层驱动,得专门有个同事将驱动写完给我,我只需要知道他提供的api接口就行了,而我就专心处理我的工作,我相信他能把驱动写好,我只需要直接调用即可。
arp缓存表既然已经解释了arp协议的用途及重要性,那么它是如何工作的?为了实现ip地址与mac地址的查询与转换,arp协议引入了arp缓存表的概念,每台主机或路由器在维护着一个arp缓存表(arp table),这个表包含ip地址到mac地址的映射关系,表中记录了对,我称之为arp表项,如我们前面那张图所展示的一样,他们是主机最近运行时获得关于其他主机的ip地址到mac地址的映射,当需要发送数据的时候,主机就会根据数据报中的目标ip地址信息,然后在arp缓存表中进行查找对应的mac地址,最后通过网卡将数据发送出去。arp缓存表包含一个寿命值(ttl,也称作生存时间),它将记录每个arp表项的生存时间,生存时间到了就会从缓存表中删除。从一个表项放置到arp缓存表中开始,一个表项通常的生存时间一般是10分钟吗,当然,这些生存时间是可以任意设置的,我们一般使用默认即可。
一句话总结arp协议的工作arp协议的主要工作就是建立、查询、更新、删除arp表项。
arp表项的建立当主机开机的时候,arp缓存表肯定是空的,那么怎么一步步建立 arp表项呢?如果此时想发送数据怎么办呢?因为没有arp表项,说明就找不到ip地址到mac地址的映射关系,这样子也就无法发送数据了。
其实协议栈的实现还是很强大的,如果没有arp表项,那么主机就会去建立arp表项。
以我们的电脑为例,在开机的时候,我们的电脑肯定是没有arp表项的(或者应该说只有路由器的arp表项,因为可能是动态获取ip地址):
7
对于局域网如果我想向局域网中的某个电脑发送一个数据,那么我的电脑就会从已有的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请求。
对于公网比如我的电脑向访问我的博客:https://jiejietop.cn
因为我的博客主机是处于外网的,那么我的电脑在访问的时候,也是找不到缓存表的,那它只能通过网关,让网关将数据转发到我的博客主机上,即:
8
因为我的电脑与博客主机不在一个网段,电脑查询自己的路由表,知道如果想和博客主机通信则必须通过网关(gateway)来中转,所以会在与网关直连的网卡上请求网关的mac地址,因为电脑要把发给博客主机的数据先发给网关,当合法以太帧到达网关并且顺利接收,网关会将数据递交给ip层,ip层查询路由表,找到与博客主机直连的接口(假设是直连的,实际上肯定不是直连的),网关会发一个arp请求到博客主机上,请求它的mac地址,网关收到应答后将建立新的arp表项并将开始维护arp缓存表,然后完成最终的通信。
arp缓存表的超时处理arp是动态处理的,现在总结一下:arp表项的生存时间是一般为5-10分钟(lwip中默认是5分钟),而arp请求的等待时间是5秒钟,当这些时间到达后,就会更新arp表项,如果在物理链路层无法连通则会删除表项。
因此每个协议栈的实现都必须维护着一个定时器(超时机制)来管理arp缓存表,在必要的时候更新及删除arp表项,关于怎么处理的我们就不多追究,有兴趣的可以看lwip的etharp_tmr()源码。
说点题外话:因为arp协议是一个动态的协议,很多网络攻击都是利用arp协议进行的,如arp欺骗,arp洪水攻击等等,而且这种攻击是很难防御的,当然也有办法,直接将动态的arp缓存表设置为静态就行了,但是这就违背了arp协议的动态地址解析特性。
arp报文arp的请求与应答都是依赖arp报文结构进行的,arp报文是放在以太网数据帧中进行发送的,下面是arp报文的格式:
9
当它封装在以太网帧中的格式:
10
在arp表建立前,主机并不知道目标mac地址,所以在一开始的时候只能通过广播的方式将arp请求包发送出去,处于同一局域网的主机都能接收到广播的数据包。所以一开始目标mac地址是ff-ff-ff-ff-ff-ff,而以太网首部的帧类型是有多种,对于arp数据包来说,其值为0x0806,对于ip数据报来说,其值为0x0800。
在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的请求与应答即可,rarp是逆地址解析协议,在这里我们就不用去了解,它在网络中基本已经被淘汰,用于主机在启动的时候获得自己的ip地址。
对于arp首部后面的四个字段分别是源mac地址、源ip地址、目标mac地址、目标ip地址,这些就是比较简单的了。
为了加深理解,我们使用wireshark网络抓包工具形象地讲解报文格式与内容,关于wireshark网络抓包工具的使用方式我就不做过多讲解,网上教程一大把,打开工具,然后抓取电脑网络中的数据包。
11
下一代线路传感器盘点_采集电能、互联、减少维护工作量
电源整流与滤波电路
交友APP:AI和机器能帮助你找到那个“他”吗?
AdMob依托谷歌基础架构为开发者提供开展业务的稳定可靠环境
5G可以应用在哪些商业领域
ARP协议原理是什么
PCB设计技巧的常见问题解答
随着人工智能的发展,人形机器人的技术也开始变得成熟起来
余承东现场玩转“巨幕手机”灵犀指向遥控非常给力
2024年全球存储营收将大增66.3%,带动半导体营收增长16.8%
Facebook宣布:人工智能软件目前可以检测出平台上删除的94.7%的言论
魅族作大死, 还敢用联发科P10?
嵌入式ARM开发环境搭建解析
天津力神公司发展历程史
索尼WF-SP700N分体耳机评测 还是熟悉的索尼黑科技
就在本周六!全国巡回最后一站——南京站RT-Thread线下入门培训!
华为亮相OpenInfra Days China 2023,分享开源基础设施的实践和技术展望
超声波水位传感器用于水处理
芯片国产化进程提速 赶超洋品牌核心技术尚欠火候
全新的SimpleLink超低功耗平台解决方案