ARP协议工作原理

网友投稿 1995 2022-10-16


ARP协议工作原理

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”表示目标机器报告其物理地址。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:利用Java设置Word文本框中的文字旋转方向的实现方法
下一篇:技术干货 | 从测试中探索LC连接器选择的小窍门
相关文章

 发表评论

暂时没有评论,来抢沙发吧~