ARP协议概述
每个网络接口都有一个48bit的硬件地址来标示自己,这就是我们常说的mac地址。在硬件层次上进行数据帧交换必须要有正确的接口地址,但是,tcp/ip有自己的32bit地址(我们常说的mac地址)。
我们访问某个主机一般是先通过DNS解析域名,获得对方的ip地址,但是我们不知道对方的mac地址,以太网驱动程序必须知道硬件地址(mac地址)才能发送数据。
ARP的功能就是在我们已知目的端ip地址前提下,去获得目的端mac地址。严格意义上来说,ARP为IP地址到对应的物理地址之间提供动态映射。之所以用动态是因为这个过程是自动完成的,应用程序和用户都不感知。
arp协议只使用两种数据包:ARP请求数据包和ARP响应数据包。
arp分组格式如下:
无论是arp请求数据包还是arp响应数据包,都是42字节。每个字节对应的含义如下:
-
以太网报头中前两个字段是以太网源地址和目的地址。目的地址为全1的特殊地址是广播地址。电缆上所有以太网接口都要接收广播数据帧。
-
以太网帧类型表示后面数据的类型。对于arp请求和应答来说,该字段值固定为0x0806
-
硬件类型字段表示硬件地址类型,值为1表示以太网地址。
-
协议类型字段表示要映射的协议地址类型,值为0x0800表示ip地址
-
硬件地址长度表示要mac地址长度,固定值为6 (字节),对应48bit
-
协议地址长度表示协议地址长度,当前值为4 (字节), 对应ipv4的ip地址为32bit
-
操作(op)字段指出四种操作类型:
—>1 arp请求
—>2 arp应答
—>3 rarp请求
—>4 rarp应答 -
发送端的硬件地址
-
发送端的ip地址
-
接收端的硬件地址
-
接收端的IP地址
ARP请求包分析
首先看到ARP包Info信息那一栏写着 who has 192.168.1.8? Tell 192.168.1.1 这句活告诉我们这是一个ARP请求
我们可以在Packet Detail 中看到以太网头部信息来确认,首先看Frame这个帧里面看到目的地址是全1,
Destination: Broadcast (ff:ff:ff:ff:ff:ff). 这是个广播地址,说明当前数据包会被广播到当前网段中的所有设备上
这个上面的以太网的源地址(本机mac地址) fc:f2:9f:e9:3c:18
接下来看下arp请求的头部信息
依次是:
硬件类型值为1, 表示是以太网地址
协议类型值为0x0800, 表示是ipv4 ip协议
硬件地址的长度为6, 和第二节分组格式描述吻合
操作码值为1, 属于ARP请求
发送方的mac地址:fc:f2:9f:e9:3c:18 是本机的mac地址
发送方的ip地址:192.168.1.1
接收方的mac地址: 这个是需要应答信息返回的,当前填零
接收方的ip地址:192.168.1.5 对端主机的ip
ARP响应包分析
现在看下目的主机返回给源主机的应答消息:
硬件类型值为1, 表示是以太网地址
协议类型值为0x0800, 表示是ipv4 ip协议
硬件地址的长度为6, 和第二节分组格式描述吻合
协议的长度为4,和第二节描述吻合
操作码值为2, 属于ARP应答
发送方的mac地址:f8:59:71:10:07:98 是目的端的mac地址 // 可以看到这里不再是全1,arp的应答消息是单播
发送方的ip地址:192.168.1.5 目的端ip地址,
接收方的mac地址: fc:f2:9f:e9:3c:18 这个是源主机的mac,现在变成接收方
接收方的ip地址:192.168.1.1 源主机的ip地址
当目的端收到一份目的地址是本机的arp请求之后,它就把自己的硬件地址填进去(发送方mac),并将自身的ip填到发送方ip;
然后将请求包里面的发送方mac和ip拷贝到应答消息的接收方mac和ip。
接着将操作字段置为2。最后将数据发送回去即可。
最后
当源端拿到了目的端的mac地址之后,会更新到自己的arp高速缓存中。
实际上目的端收到源端的arp请求广播之后,也会将源的ip及其对应的mac更新到自己的高速缓存中。
这样每个主机里面通过这种方式就形成了一张ip映射mac地址的表。
后续的消息就可以不用广播,直接通过mac地址发送到对应的主机上。