HCIA笔记-ARP
ARP协议
协议作用:ARP全程Address Resolution Protocol,中文叫地址解析协议。当终端或网络设备需要发送数据时,只知道对方IP地址,却不知道对方MAC地址的时候,就可以通过ARP去查询目的MAC地址。
我们先来看下ARP的报文格式,也就是ARP报文中的内容,了解了ARP报文格式之后,方便我们理解下面的例子:

我们重点关注下面几个个字段:
Operation Code:操作码,用来表示这个ARP报文是请求报文还是响应报文
Source Hardware Address:源硬件地址,也就是源MAC地址
Source Protocol Address:源协议地址,在当前IP网络中,这个字段中的协议就是IP协议,那么这个字段就代表源IP地址
Destination Hardware Address:目的硬件地址,也就是目的MAC地址
Destination Protocol Address:目的协议地址,也就是目的IP地址
应用场景举例:

如图,主机A想要访问主机C,主机A知道主机C的IP地址10.0.0.3/24。A首先会查看自己本地的MAC地址表,是否存在和10.0.0.3/24相关联的MAC地址。在电脑刚刚开机的时候,默认的ARP表是空的(通过 arp -a来查看本地的ARP缓存表)

我们知道,主机要想发送数据,必须要按照TCP/IP协议模型的层次从上往下进行封装。我们假设主机A发送的是ICMP Echo Request报文。那么我们的封装顺序应该是:
1、ICMP数据---------------[ICMP DATA]
2、网络层封装--------------[IP]|[ICMP DATA] //网络层封装IP报头,IP报头中需要包含源IP地址和目的IP地址,源IP地址为主机A的IP,目的IP为主机C的IP
3、数据链路层封装--------[Ethernet II]|[IP]|[ICMP DATA] //数据链路层封装Ethernet II的帧头,其中包含源MAC地址和目的MAC地址,源MAC地址为主机A的MAC地址,目的MAC地址应该是主机C的MAC地址
在网络层封装时,主机A知道主机C的IP地址,因此可以顺利完成封装。但是在进行数据链路层封装时,由于主机A查看自己的ARP表,并没有主机C的MAC地址缓存,没有主机C的MAC地址,于是无法完成封装。
为了获得主机C的MAC地址,因此需要通过某种方法去“询问”,这种方法,就是发送ARP查询报文。
主机A发送的ARP报文内容:

由于不知道主机C的MAC地址,因此二层的ETH_II帧头中目的MAC地址字段无法填写具体的MAC地址。为了确保主机C能够收到ARP请求报文,目的地址使用了全F的广播MAC地址,只要主机C和主机A在同一个广播域中,主机C就可以收到主机A发送的ARP报文。
这个ARP报文是由主机A发送出来的,因此而成的ETH_II帧头中的源MAC地址字段应该填写主机A的MAC地址。
开篇我们介绍过ARP报文中的重要的四个字段,在这里我们再进一步详解每个字段的含义:
目的IP:10.0.0.3,我们看这个IP地址,是主机C的IP地址,代表我们需要查询主机C的MAC地址;
源IP:10.0.0.1,这个IP地址是主机A的IP地址,代表这个ARP报文是由主机A发送出来的;
目的MAC地址:00-00-00-00-00-00,全为0,是因为我们不知道主机C的MAC地址,因此用全0填充这个字段。请注意,这里的目的MAC是ARP报文中的字段,而数据转发是看ETH_II帧头中的目的MAC地址,两者需要区分清楚。
源MAC:00-01-02-03-04-AA,这个MAC地址就是主机A的MAC地址,放到ARP报文字段中,让主机C看到自己的MAC地址
操作类型:Request,表明这个ARP报文是一个ARP请求报文
主机A发送了这个目的地址为全F的广播帧,交换机收到之后,会从其他所有端口转发出去一份相同的数据帧,这种全端口转发的方式称为泛洪。

经过交换机的转发,主机B和主机C都收到了这个ARP报文,同时,交换机查看了源MAC地址,知道了自己左边的接口连接的是主机A,于是把主机A的MAC地址和左边的端口号进行绑定,生成一个“MAC地址---端口号”这样的条目缓存在自己的MAC地址表中;对于这个相同的ARP报文,主机B和主机C将会是不同的处理方式:
主机B:收到ARP报文之后,会首先查看二层的ETH_II帧头。查看之后发现是一个目的地址全F的广播报文,然后就进行处理,查看帧头中Type字段值为ARP协议,拆掉二层的帧头,然后交给上层协议ARP模块进行继续处理。
ARP模块处理报文,发现目的IP是10.0.0.3,而B的IP地址是10.0.0.2,于是B知道,这个ARP报文并不是找自己的,于是丢弃这个ARP报文,B的处理过程到此结束;
主机C:收到ARP报文之后,会首先查看二层的ETH_II帧头。查看之后发现是一个目的地址全F的广播报文,然后就进行处理,查看帧头中Type字段值为ARP协议,拆掉二层的帧头,然后交给上层协议ARP模块进行继续处理。
ARP模块处理报文,发现目的IP是10.0.0.3,而C的IP地址就是10.0.0.3,于是C知道,这个ARP报文是A来请求自己的MAC地址的,于是C对A进行回复。
C对A进行回复,回复时,由于C已经从A发过来的ARP报文中,知道了A的MAC地址了,因此C发送ARP报文时,ETH_II帧头中目的MAC地址字段可以明确的填写A的MAC地址,发送单播的数据帧进行回应。
交换机收到主机C发送的单播数据帧时,查看其目的MAC地址,发现是A的MAC地址,于是交换机知道了这个数据帧需要发送给A。通过查看自己的缓存的MAC地址表,交换机查到了关于主机A的MAC地址,是和左边的端口关联的,于是交换机就将主机C发送给主机A的数据帧,从自己的左边端口转发出去。

主机C发送给主机A的ARP报文内容如下:

主机C知道了主机A的MAC地址,因此ETH_II封装时,目的MAC地址字段就填写主机A的MAC地址,源MAC地址填写自己的MAC地址。
ARP报文中,因为是主机C对主机A的回复,因此,对于主机C而言,目的地址就是主机A,因此,目的IP为10.0.0.1,即主机A的IP地址,源IP填写为自己的IP地址,目的MAC地址就是主机A的MAC地址,源MAC地址,填写自己的MAC地址,操作类型为Reply,代表是对A的回应。
当A收到主机C的ARP回应之后,通过查看ARP中的字段,于是就知道了主机C的MAC地址。主机A就把C的MAC地址写入自己的ARP表中

至此,主机A就知道了主机C的MAC地址,后续发送数据时,二层封装就可以顺利完成了。

浙公网安备 33010602011771号