ARP协议可以完成任意网络地址到任意物理地址的转化,本次主要讲解IP网络地址到以太网(MAC地址)地址的转化。ARP的工作原理:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。该网络中的其他机器都会收到这个ARP请求,但只有包含目标网络地址的机器会回应这个ARP请求,并且回应的信息中包含目标的物理地址。
- 以太网ARP请求/应答报文详解
以太网ARP请求/应答报文格式如下图所示:
硬件类型 | 协议类型 | 硬件地址长度 | 协议地址长度 | 操作 | 发送端以太网地址 | 发送端IP地址 | 目的端以太网地址 | 目的端IP地址 |
2字节 | 2字节 | 1字节 | 1字节 | 2字节 | 6字节 | 4字节 | 6字节 | 4字节 |
以太网ARP请求/应答报文各字段介绍:
- 硬件类型字段定义物理地址的类型,MAC地址使用1来表示。
- 协议类型字段表示要映射的协议地址类型,IP地址使用0x800表示。
- 硬件地址长度和协议地址长度,顾名思义,代表他们由几个字节来表示。以太网类型的硬件地址长度需要6个字节来表示,IP(V4)类型的协议地址长度需要4个字节来表示。
- 操作字段指出4种操作类型:ARP请求(值1)、ARP应答(值2)、RARP请求(值3)、RARP应答(值4)。
- 最后4个字段指定通信双方的以太网地址与IP地址。发送方需要指定除了目的端的以太网地址外的其他三个地址,从而构建出ARP请求并发送出去。接受端发送ARP请求的目的端IP地址是自己,就将自己的以太网地址填充到里面,并且交换发送端与目的端的以太网地址和IP地址,将操作字段的值设置为2并发送出去。
由上表可知,ARP报文的长度为28字节。如果再加上以太网帧的头部与尾部的18个字节,则一个携带ARP请求/应答包的以太网帧的长度为46个,字节。不过有些要求以太网帧的数据部分的长度不低于46个字节,所以ARP请求/应答包将增加一些填充字节,以满足该要求。在这种情况下,一个携带ARP请求/应答的以太网帧的长度为64个字节。
2. ARP高速缓存的查看和修改
通常ARP会维护一个高速缓存,其中保存着经常访问(例如网关地址)以及最近访问的机器的IP地址到物理地址的映射。这样避免了重复的ARP请求,大大提高了发送数据包的速度。
Linux可以使用arp命令来查看和修改ARP高速缓存。例如:我的Ubuntu在某一时刻(注意:ARP高速缓存是动态变化的)的ARP高速缓存内容如下(命令arp -a)
第一行描述的是本机在docker0上面的IP地址与MAC地址,第二行描述的是本机在eth0上面的IP地址与MAC地址。下面两条命令分别是删除和添加一条ARP高速缓存项
$sudo arp -d 192.168.48.254 #删除ARP缓存项
$sudo arp -s 192.168.48.254 00:50:56:e6:2d:1f #添加ARP缓存项
3. 使用tcpdump观察ARP通信过程
为了清楚地了解ARP的通信过程,我们从本机上使用telnet命令登录到docker0的echo服务(已开启echo服务),并且使用tcpdump抓取两个测试机器交换的以太网帧,具体操作如下所示:
$sudo arp -d 172.17.0.2 #清楚ARP缓存中的docker0的缓存项
$sudo tcpdump -i docker0 -ent '(dst 172.17.0.2 and src 172.17.0.1) or (dst 172.17.0.1 and src 172.17.0.2)' #开始抓包
$telnet 172.17.0.2 echo #在新的终端上面输入该命令
在执行telnet命令之前,应该先使用arp -d 命令清除arp缓存区。否则的话,ARP通信将不被执行,我们也就无法获得包含ARP的以太网帧。tcpdump抓取的众多数据包中,只有最靠前的两个与ARP通信有关系,现将内容列举到下面:
1. 02:42:56:39:22:6e > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 172.17.0.2 tell 172.17.0.1, length 28
2. 02:42:ac:11:00:02 > 02:42:56:39:22:6e, ethertype ARP (0x0806), length 42: Reply 172.17.0.2 is-at 02:42:ac:11:00:02, length 28
由tcpdump抓取的数据包本质上还是以太网帧,我们通过该命令的众多选项来控以太网帧制帧的过滤(比如:使用dst与src来指定目标端的IP地址与源端的IP地址)和显示(使用 -e来显示以太网帧的头部信息)
第一个以太网帧数据包中,ARP的源端的物理地址是02:42:56:39:22:6e,目标端的物理地址是ff:ff:ff:ff:ff:ff,这是以太网的广播地址,用来表示整个LAN。该LAN上的所有机器都会收到并处理这样的帧。0x0806是以太网帧头部的类型字段的值,它表示分用的模块是ARP模块。该以太网帧的长度是42个字节,其中数据部分的长度是28个字节。Request 表示这是一个ARP请求。“who-has 172.17.0.2 tell 172.17.0.1”表示本机要查询的docker0的IP地址。
第二个以太网帧数据包中,ARP的源端的物理地址是02:42:ac:11:00:02,目标端的物理地址是02:42:56:39:22:6e。Reply表示这是一个ARP应打包。“172.17.0.2 is-at 02:42:ac:11:00:02”表示目标机器报告其物理地址。
原文地址:http://blog.51cto.com/13813797/2155946