网络中的一台主机A想和另一台主机B通信时,数据需要经过一层一层地封装,在网络层,需要将
源IP(主机A的IP)和目的IP(主机B的IP)封装到数据包里,继续往下封装,在数据链路层也就
是以太网中,需要将源mac地址(主机A的mac)和目的mac地址(主机B的mac)封装到数据帧
中。经过封装后的数据才通过物理层进行传输,实现网络通信。
这样,就产生了以下问题:
1、主机A怎么获取主机B的mac地址?
2、数据到达交换机,交换机怎么找到主机B,进行数据转发?
一、ARP协议
问题1的答案,就是本节的主题,ARP(Address Resolution Protocol)地址解析协议。
主机A本地会维护一个ARP缓存表,内容是IP地址和mac地址的对应关系。如图所示:
当主机A想要获取主机B的mac地址时,会首先从本地的ARP缓存表中进行查询,如果有主机B的
mac地址,则进行数据封装;如果没有,就需要通过ARP协议来获取。
ARP协议过程:
- 主机A发送ARP Request报文,由于不知道接收方的mac地址,需要将数据帧的目的mac设置为FF-FF-FF-FF-FF-FF,也就是广播数据帧。
- 交换机收到ARP Request报文,由于是广播数据帧,交换机会执行泛洪操作,把该报文转发到其他所有端口,同时交换机也会把主机A的IP地址和mac地址学习到自己的mac地址表。
- 连接该交换机的所有主机收到这个广播报文,会进行数据解封装,比对目的IP。如果目的IP不是自己,直接丢弃。主机B发现目的IP是自己,就进行处理,回复ARP Reply报文。
- 主机B会把主机A的IP地址和mac地址学习到自己的ARP缓存表中,所以进行回复时是通过单播的方式,ARP Reply报文是单播报文。
- 交换机收到主机B发送的ARP Reply报文,会把主机B的IP地址和mac地址学习到自己的mac地址表,然后转发到主机A。
- 主机A收到ARP Reply报文,把主机B的IP地址和mac地址学习到自己的ARP缓存表中,然后就可以根据arp缓存表的信息进行数据封装,主机A和主机B就可以进行通信。
二、交换机的mac地址表
工作在数据链路层的二层交换机进行数据转发时,是根据其维护的一张mac地址表进行的。
mac地址表内容是交换机端口和所连接各个主机的mac地址的映射关系。当交换机收到数据时会进
行解封装,读取到数据帧里的目的mac,然后查询mac地址表找到对应的端口,把数据通过对应的
端口发送出去,这样就完成了数据的转发。
三、实验
1、配置
主机A:IP地址10.0.0.1,mac地址00-00-00-00-00-01
主机B:IP地址10.0.0.2,mac地址00-00-00-00-00-02
2、通信前:
主机A的ARP缓存表:
主机B的ARP缓存表:
交换机的mac地址表:
3、通信后:
主机A通过ping命令和主机B通信:
ping命令执行完后,主机A的arp缓存表:
主机B的arp缓存表:
交换机mac地址表:
4、抓包分析:
可以看到,在ping命令(属于ICMP协议)执行之前,有两条ARP报文,包括主机A发送的ARP
Request报文和主机B回复的ARP Reply报文。
在ARP Request报文内部,有四个参数,
Sender IP:10.0.0.1 --主机A的IP
Sender MAC:00-00-00-00-00-01 --主机A的mac
Target IP:10.0.0.2 --主机B的IP
Target MAC:FF-FF-FF-FF-FF-FF, --正确应该是全0,起填充作用
注意:此处是ensp软件的问题,Target MAC应该是00-00-00-00-00-00。
ARP报文内部的Target MAC和数据链路层封装的目的MAC是不同的,前者是全0,后者是全F(代
表广播数据帧)。
ARP Reply报文中,四个参数分别为
Sender IP:10.0.0.2 --主机B的IP
Sender MAC:00-00-00-00-00-02 --主机B的mac
Target IP:10.0.0.1 --主机A的IP
Target MAC:00-00-00-00-00-01 --主机A的mac