首先我们需要先大致了解一下Mac地址,Mac(Media Access Control, 介质访问控制)地址是烧录在Network Interface Card(网卡,NIC)里的,也叫硬件地址,是由48比特长(6字节),16进制的数字组成.0-23位叫做组织唯一标志符(organizationally unique ,是识别LAN(局域网)节点的标识.24-47位是由厂家自己分配。网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。
如何才能知道自己PC的IP地址?一个很简单的方法是使用IPconfig/all命令,如下图:
如果你的PC中安装有多个网卡,那么相对于每块网卡Ethernet adapter项所显示的内容都会有所不同,相信大多数PC上显示的都是“本地连接”,这是中文版WIDNOWS XP系统中以太网卡的默认命名。此处Physical Address项目所显示的就是“本地连接”的Mac地址。
在以太网中,如果主机A需要向主机B发送数据,在发送前必须先解决一个问题——我怎么才能知道主机B“位置”呢?可能有人会说我知道主机B的IP地址啊……,但实际上,在以太网环境中数据的传输所依懒的是Mac地址而非IP地址,而将已知IP地址转换为Mac地址的工作是由ARP协议来完成的。
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的Mac地址的。在以太网中,一个主机和另一个主机进行直接通信,必须要知道目标主机的Mac地址。但这个目标Mac地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标Mac地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的Mac地址,以保证通信的顺利进行。
在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与Mac地址是一一对应的,我们可以使用ARP –a命令查看当前缓存表,如下图:
我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标Mac地址,直接把目标Mac地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标Mac地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.1.1的Mac地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.1.1的Mac地址是00-aa-00-62-c6-09”。这样,主机A就知道了主机B的Mac地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。
下面我们通过一个实例来简单说明一下ARP协议是如何工作的:如下图,小编首先使用ARP –d命令将ARP缓存表清空,第二步Ping一个IP地址192.168.99.252,第三步使用ARP –a命令查看ARP缓存表,这时表中出现了一条 192.168.99.252 00-19-21-0a-95-9d dynamic 记录,该条记录的类型为Dynamic,意思是说,这条记录是动态产生的。ARP记录也会出现静态的记录条目,相应的类型为static。正如前面所说的,ARP缓存表具有老化机制,几分钟后小编再次使用ARP –a命令查看缓存表,刚才的那条记录已经不存在了。
下图是小编使用wireshark(一个抓包工具)抓到的刚才ARP数据包的信息,由于在本机ARP缓存表中没有IP地址192.168.99.252相对应的Mac地址记录,所以在通讯之前系统会向网络中首先发送一个广播包——所有字符都为”f”的Mac地址,用来询问192.168.99.252的Mac地址是什么?局域网中所有的PC都将收到这个广播包,但只有IP地址为192.168.99.252的PC才会对此请求作出回应——告之192.168.99.204我的Mac地址是00:19:21:0a:95:9d,其它PC则将数据包直接丢弃,在发送方知到了目的主机的Mac地址后便可以进行通讯了。
ARP Request 数据包
ARP Reply 数据包