ARP协议(Wireshark分析)

一直都觉得自己的计算机网络很差,大学那会上课老师讲得云里雾里的,自己也没想过会做开发,后来做了开发又觉得不是做网络工程师,应该也不会用到计算机网络就一直没有认真去学习,到工作之后发现很多地方需要用到计算机网络,这个时候决定要认真去学习一下,然后因为有一个同时期一起进来的同事wireshark非常好,我打算接下来的网络协议能用wireshark分析的尽量用wireshark分析,毕竟现在网上用wireshark进行协议分析还是很少,还是希望大家一起进步吧,多多交流。

 

至于我目前的复习线路主要就是《计算机网络》(谢希仁)、《TCP/IP协议栈详解》主要是这两本书,当然免不了网上搜索资料,这个就不一一贴出来了。另外,我这个系列可能只会讲我目前工作遇到的协议,不会讲我还没有遇到的协议!

今天要讲的是ARP协议,就是地址解析协议。这个协议会根据我们的IP地址来获取我们设备的MAC地址进而使得数据可以数据链路层传输。但是这个获取是在局域网内,如果跨局域网需要用到路由,这个下面会讲。

 首先我们要知道,在IP层及以上的协议层都是使用IP地址来传输数据的,但是在数据链路层及以下都是用mac地址来传输的,所以为了使得数据能在数据链路层和物理链路(光纤等)传输,就需要用到ARP协议来进行地址解析。

ARP分组是通过IP协议来传输的,所以可以把ARP协议归到网络层,但是有些地方是把它归到数据链路层,按照书上的说法都是可以的。我个人的看法是:因为mac地址是通过IP地址查找的,然后需要在网络层把mac地址添加到IP帧再转发出去,所以归到网络层更好

我们每一个设备都会有一个ARP高速缓存,这个高速缓存保存了局域网的IP地址到mac地址的映射关系。接下来我先看一下我自己电脑的ARP高速缓存。电脑cmd终端上输入arp -a可以看到如下

可以看到我电脑的ARP高速缓冲中已经保存了很多的IP地址跟mac地址的对应关系,这是因为我在之前就使用过ARP协议来完成这些映射,并且映射完之后这个映射表是有一定生存周期的,目前这个表还没有过期。现在我先把这张表给清空,输入arp -d,但是,输入这个命令需要你以管理员的身份运行cmd

运行完之后再arp -a看一下,明显高速缓存里的内容就变少了

那假设说我要跟一个设备通信,我在只知道IP地址的情况下(事实上我们也只知道IP地址,IP地址的设置就是为了方便我们记忆,我们大概没有人愿意去记住48个自己的mac地址),怎么完成数据的传输呢?下面讲解一下ARP协议的工作过程

假设我局域网只有A、B、C、D四台主机,A要跟C通信,这个时候A就会主动想局域网上发送ARP请求,这个请求是以广播的方式发送的,也就是说,在这个局域网上的所有主机都是可以接收到的。在发送的广播包中只包含有C的IP地址,所以也就只有C会回复这个ARP请求,在C回复的ARP响应中就包含了C的mac地址,这个时候我们就获取了C的IP地址和C的mac地址的映射关系,ARP会自动把这个映射关系保存到ARP高速缓存中。在之后如果A要向C发数据,就可以直接从高速缓存中拿到C的mac地址,不需要再发送ARP广播,这样就可以节省时间。另外有一个需要注意的地方,在以后C可能也要向A发送数据,如果等到要发送数据的时候再进行一次C到局域网的ARP广播同样也是很浪费时间的,所以在A向C发送ARP广播的时候,A会把自己的IP地址跟mac地址的映射关系写入ARP广播分组里,C在收到这个ARP分组的时候就会把A的IP地址与mac地址的映射关系写到自己的高速缓存中。下次就直接从缓存中拿到mac地址进行通信。

 

接下来我们用wireshark抓包分析一下这个协议,我直接在我电脑上去ping我的虚拟机(ping包其实还是用到ICMP协议,这个以后会讲)。上面已经把电脑的arp缓存清空了。为了确保没有太多其他的信息,我把外网断开了。我们看一下ping包之后会发生什么

 我本机windows的地址是192.168.40.36, 虚拟机的地址是192.168.40.37。两个的网关都设置成192.168.40.254

 我在本机上执行ping 192.168.40.37 -t,然后开始抓包,上面是抓取的一部分截图。

因为我要跟192.168.40.37 通信,所以我要先有他的mac地址,这个时候在ping这个命令开始之前,ARP就会自动发送分组请求192.168.40.37的mac地址,留意看15和16这两个包都是broadcast即广播包。这两个包都在询问局域网中谁有192.168.40.37的mac地址,告诉192.168.40.36.

再看第17和18个包,这两个包是对前面两个包的回复,也就是ARP响应,响应的内容就是192.168.40.37的mac地址是00:26:c5:e0:1c:0e

之后就是ICMP协议了,这个以后再说。我们具体看一下ARP请求和ARP响应两个包的具体内容是什么。

我们先看第15个包,也就是ARP请求包,这个包跟第16个包是一样的

首先目的mac地址全是ff:ff:ff:ff:ff:ff:ff代表是广播分组,谁发出来的,是微软电脑mac地址00:d8:61:3e:8f:a3发出来的请求。这里啰嗦一句,wireshark的前三个字节分配给厂商了,只要识别到前面三个自己就会识别出厂商,这里就刚好识别到Micro-st。然后就是ARP协议类型。我为什么会知道第15个包是一个ARP分组请求呢,看下面是不是有一个request,这就是请求的意思,这里代表操作码是请求,所以这个是ARP请求包。下面那些就很直观了。

接下来看一下ARP响应,第17个包

这里注意看源地址的前缀是Guangdon我猜这里应该是"广东"吧,我现在确实是在广州,原本这里应该是VMware的厂商的,但是因为我修改了我Ubuntu的mac地址,所以就变成这个了。另外这里的操作码是reply,所以这个是ARP响应包,其他的应该可以看明白了。

正 是有了这个ARP,我们接下来就可以正常发ping包。而且我们可以看一下我们 电脑现在是不是有我虚拟机的IP地址和mac地址的映射了

可以看到,我电脑现在确实是有ARP高速缓存表,下次我再跟我虚拟机通信就不需要再发arp请求了。同时我们可以看一下我虚拟机的arp缓存

可以看到我虚拟机的arp缓存也有192.168.40.36跟mac地址的映射了,下次通信就不需要再发arp请求了。

 

上面说了ARP是局域网上的协议,我们网络肯定不会一直都在一个局域网,假如我们要ping百度怎么办呢?百度没有跟我电脑是一个局域网,这个时候就会有一个叫路由的设备来进行转发分组,路由可以连接两个不同的局域网,使得两个局域网可以进行通信。我电脑跟百度相隔肯定有许多许多局域网,中间就需要很多很多的路由进行转发。但是我只需要知道跟我电脑相连的那个路由(这个路由会走连接到百度的链路)的mac地址就可以。

上面就演示了这样一种通信的方式,假设我的主机在LAN1,那我只需要知道LAN1跟LAN2之前的路由的mac地址就可以,这样我分组可以转发出去,最后给百度的服务器接收之后。

这个抓包分析工作量有点大,我这里就不分析了,有兴趣的可以自己去抓包分析一下。

以上就是ARP协议的全部内容,以后如果有新内容在新增,有什么不对的还请大家指出,一起学习一起进步!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值