《Linux高性能服务器编程》笔记2--tcpdump观察ARP通信实验

ARP协议工作原理

ARP协议能实现任意网络层地址到任意物理地址的转换。
工作原理:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的其他机器都将接收到这个请求,但只要被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。

以太网ARP请求/应答报文详解

《Linux高性能服务器编程》笔记2--tcpdump观察ARP通信实验

  • 硬件类型:物理地址类型,为1时表示MAC地址
  • 协议类型:要映射的协议地址类型,为0x800时,表示IP地址
  • 硬件地址长度和协议地址长度,单位是字节。MAC地址长度是6,IPv4长度是4
  • 操作:四种操作类型,ARP请求(值为1),ARP应答(2),RARP请求(3),RARP应答(4)
  • 后面四个是通信双方的以太网地址和IP地址。发送方填充除目的端以太网地址外的其他3个字段,以构建ARP请求并发送之。接收端发现该请求的目的端IP地址是自己时,把自己的以太网地址填入,然后交换两个目的端地址和两个发送端地址,以构建ARP应答并返回之(此时,操作数为2)。

ARP高速缓存的查看和修改

ARP维护一个高速缓存,其中包含经常访问或最近访问的机器的IP地址到物理地址的映射。避免重复的ARP请求,提高了发生数据包的速度。
Linux使用arp命令查看和修改ARP高速缓存。

tcpdump观察arp通信过程

在虚拟机新建两个Ubuntu系统,主机1的IP地址为:192.168.157.137,主机2的IP地址为192.168.157.131.
在主机1上输入arp命令,查看其高速缓存,如图:
《Linux高性能服务器编程》笔记2--tcpdump观察ARP通信实验

没有看到主机2地址,说明没有将其加入高速缓存。
使用ping 主机2IP命令后,再次使用arp命令,可以观察到主机2的IP地址。如图
《Linux高性能服务器编程》笔记2--tcpdump观察ARP通信实验

在Ubuntu1804上开启echo服务,请见:
ubuntu开启echo

在主机1上先清除主机2对应的项,命令:sudo arp -d 主机2IP
然后使用tcpdump抓取这个过程中两个机器交换的以太网帧,命令:tcpdump -i 网卡 -ent '(dst ip1 and src ip2) or (dst ip1 and src ip2)',监听网卡,从ip1发往ip2或从ip2发往ip1的数据。
《Linux高性能服务器编程》笔记2--tcpdump观察ARP通信实验

然后再在主机1上另外开一个终端,使用telnet与主机2建立连接后关闭.

《Linux高性能服务器编程》笔记2--tcpdump观察ARP通信实验

查看数据包:

《Linux高性能服务器编程》笔记2--tcpdump观察ARP通信实验

第一个数据包中,00:0c:29:7e:9e:b0是源端物理地址,ff:ff:ff:ff:ff:ff是目的端物理地址,此时未填充,0x0806表示ARP类型,Request表示一个ARP请求,192.168.157.131即目的端IP地址,192.168.157.137为源端IP地址。帧的长度为42字节(实际为46字节,未提及以太网帧尾部4字节的CRC字段),数据长度为28字节。
第二个数据包中,00:0c:29:04:04:6d是目的端物理地址,Reply表示ARP应答。帧的长度为60字节(实际为64字节)。

《Linux高性能服务器编程》笔记2--tcpdump观察ARP通信实验