在TCP/IP协议中,有许多的协议会用于网络管理部分,这部分内容一般不会出现在用户的应用层中,而且都是MAC,IP的应用,该层并没有完整实现IP层的协议,协助实现网络中的各种管理功能,这些协议包括ARP, RARP,PING,ICMP,IGMP等。这些协议介于二层与三层之间,因此有时会被称为2.5层,就像RGMII被称为1.5层一样。本文将介绍有用户密切相关的协议–地址解析协议ARP(Address Resolution Protocol)。
1. 地址解析协议
在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是地址解析协议(ARP)协议要做的事情。所谓地址解析(Address Resolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
另外,当发送主机和目的主机不在同一个局域网中时,即便知道对方的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的MAC地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为委托ARP或ARP代理(ARP Proxy)。
地址解析协议的消息格式很简单,仅包含单一的地址解析请求或响应。ARP 消息的长度取决于上下两层地址的大小,上层地址由所使用的网络协议类型(通常是 IPv4)决定,下层地址则由上层协议所使用的硬件或虚拟链路层的类型决定。消息的报头中包含了这些类型以及对应的地址长度信息,此外还包含了表示请求(1)和应答(2)的操作码。数据包的有效负载为收发双方的硬件地址、协议地址,总计四个地址。
2. 反向地址解析协议
反向地址解析协议RARP(Reverse Address Resolution Protocol)与ARP正好相反,根据对方的MAC地址获取对方的IP地址。RARP协议一般很少使用,主要原因是在TCP/IP协议中先封装IP包也就是目的IP是确定的,在封装MAC包之前如果没有对方的MAC地址可以重新通过ARP获得对方的MAC地址,形成MAC-IP对放在主机内存中,在以后的通信中就可以查表实现MAC-IP的配对。
-
ARP包的结构
-
ARP协议部分在MAC层的位置
-
ARP高于MAC层,因此在以太网中接收MAC层服务,下面结合MAC层一起介绍ARP的结构,由ARP组成的MAC层结构如图1所示。

图1 由ARP包组成的MAC层结构
图1描述的MAC层构成如下:
(1)14字节的以太网首部,
目的地址: 为FFFF_FFFF_FFFF,表示广播地址。
源地址: 为本机的MAC地址
类型: 为0x0806,表示MAC层封装了ARP协议。
(2)28字节 ARP协议(请求或应答)
(3)填充部分:填充数据长度18(46-28)字节00
(4)FCS: 使用4字节CRC32
-
ARP包的具体结构
ARP包的具体结构如图2所示,ARP首部及地址部分合计28个字节,细节如图3。

图2 ARP包结构

图3 ARP协议细节
-
-
ARP首部:
-
(1)硬件类型 以太网 0001,两个字节
(2)协议类型 IP 0800 ,两个字节
(3) 硬件地址长度 6,表示MAC地址长度,一个字节
(4)协议地址长度4,表示IP地址长度,一个字节
(5) 操作码(OP) 0001 -ARP请求 0002-ARP应答 ,两个字节。
-
-
地址部分:
-
(1)发送者硬件地址(MAC地址),6个字节。(2)发送者IP地址,4个字节(3)目的硬件地址,6个字节(4)目标IP地址,4个字节。
根据具体的MAC及IP地址,组装后的ARP请求包如图4所示。

图4 包含ARP 请求包的MAC 包
课堂练习:根据ARP组包规则,请写出应答包对应的MAC包。
关于应答包的格式内容, 请参照视频中的讲解。
4. 主机ARP的使用:
- 在计算机的CMD窗口,输入ipconfig /all,查看本机的IP地址及MAC地址,如图5所示。

图5 ipconfig 查看IP与MAC地址
- 输入ARP -a 查看本机存储的IP地址对应的MAC地址,如图6所示。

图6 使用ARP命令查看IP-MAC对
5. ARP在网络通信中的作用及操作流程
以主机A(192.168.38.10)向主机B(192.168.38.11)发送数据为例。
(1)当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到就知道目标MAC地址為(00-BB-00-62-C2-02),直接把目标MAC地址写入帧里面发送就可。
(2)如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播(ARP request),目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.38.11的MAC地址是什么?”
(3)网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应(ARP response):“192.168.38.11的MAC地址是00-BB-00-62-C2-02”,此回应以单播方式。这样,主机A就知道主机B的MAC地址,它就可以向主机B发送信息。同时它还更新自己的ARP高速缓存(ARP cache),下次再向主机B发送信息时,直接从ARP缓存表里查找就可。
(4)ARP缓存表采用老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可减少缓存表的长度,加快查询速度。
(5)免费ARP(gratuitous ARP),他是指主机发送ARP查询(广播)自己的IP地址,当ARP功能被开启或者是端口初始配置完成,主机向网络发送免费ARP来查询自己的IP地址确认地址唯一可用。作用:(1)确定网络中是否有其他主机使用了该IP地址,如果有应答则产生错误消息。(2)免费ARP可以做更新ARP缓存用,网络中的其他主机收到该广播则在缓存中更新条目,收到该广播的主机无论是否存在与IP地址相关的条目都会强制更新,如果存在旧条目则会将MAC更新为广播包中的MAC。
练习:
(1)利用双口BRAM构建ARP请求包
(2)利用双口BRAM构建ARP应答包
(3) 练习使用ARP的各种命令