《TCP/IP详解 卷1:协议》之第四、五章:ARP RARP
目录
一、ARP && RARP 报文结构
1、ARP请求报文示例
2、ARP响应报文示例
3、RARP请求报文示例
4、RARP响应报文示例
5、关于 padding
6、免费ARP
二、tcpdump 的使用
1、基本语法
2、常用选项
3、常用过滤条件
三、arp 命令的使用
1、基本语法
2、常用选项
3、示例
一、ARP && RARP 报文结构
ARP 主要用于将 IP 地址解析为 MAC 地址,而 RARP 用于将 MAC 地址解析为 IP 地址。
RARP报文的格式与ARP报文非常相似,它们都使用相同的报文结构,主要区别在于帧类型的不同(ARP帧类型为0x0806,RARP帧类型为0x8035),以及操作码(Operation Code)字段值不同。报文结构如下:
字段 | 长度(字节) | 说明 |
---|---|---|
硬件类型 | 2 | 表示硬件地址类型,以太网为1 |
协议类型 | 2 | 表示协议地址类型,IPv4为0x0800 |
硬件地址长度 | 1 | 硬件地址(MAC地址)的长度,以太网为6字节 |
协议地址长度 | 1 | 协议地址(IP地址)的长度,IPv4为4字节 |
操作码 | 2 | 表示操作类型,1为ARP请求,2为ARP响应,3为RARP请求,4为RARP响应 |
发送方硬件地址 | 6 | 发送方的MAC地址 |
发送方协议地址 | 4 | 发送方的IP地址 |
目标硬件地址 | 6 | 目标设备的MAC地址 |
目标协议地址 | 4 | 目标设备的IP地址 |
1、ARP请求报文示例
以太网帧头:
目的MAC地址 | 源MAC地址 | 类型 |
---|---|---|
FF:FF:FF:FF:FF:FF | 00:11:22:33:44:55 | 0x0806(ARP协议) |
ARP请求报文内容:
字段 | 值(十六进制) | 说明 |
---|---|---|
硬件类型 | 0001 | 以太网 |
协议类型 | 0800 | IPv4 |
硬件地址长度 | 06 | MAC地址长度 |
协议地址长度 | 04 | IP地址长度 |
操作码 | 0001 | ARP请求 |
发送方硬件地址 | 00:11:22:33:44:55 | 主机A的MAC地址 |
发送方协议地址 | C0:A8:01:64 | 主机A的IP地址(192.168.1.100) |
目标硬件地址 | 00:00:00:00:00:00 | 未知,用全0填充 |
目标协议地址 | C0:A8:01:C8 | 主机B的IP地址(192.168.1.200) |
2、ARP响应报文示例
以太网帧头:
目的MAC地址 | 源MAC地址 | 类型 |
---|---|---|
00:11:22:33:44:55 | AA:BB:CC:DD:EE:FF | 0x0806(ARP协议) |
ARP响应报文内容:
字段 | 值(十六进制) | 说明 |
---|---|---|
硬件类型 | 0001 | 以太网 |
协议类型 | 0800 | IPv4 |
硬件地址长度 | 06 | MAC地址长度 |
协议地址长度 | 04 | IP地址长度 |
操作码 | 0002 | ARP响应 |
发送方硬件地址 | AA:BB:CC:DD:EE:FF | 主机B的MAC地址 |
发送方协议地址 | C0:A8:01:C8 | 主机B的IP地址(192.168.1.200) |
目标硬件地址 | 00:11:22:33:44:55 | 主机A的MAC地址 |
目标协议地址 | C0:A8:01:64 | 主机A的IP地址(192.168.1.100) |
3、RARP请求报文示例
以太网帧头:
目的MAC地址 | 源MAC地址 | 类型 |
---|---|---|
FF:FF:FF:FF:FF:FF | 00:11:22:33:44:55 | 0x8035(RARP协议) |
RARP请求报文内容:
字段 | 值(十六进制) | 说明 |
---|---|---|
硬件类型 | 0001 | 以太网 |
协议类型 | 0800 | IPv4 |
硬件地址长度 | 06 | MAC地址长度 |
协议地址长度 | 04 | IP地址长度 |
操作码 | 0003 | RARP请求 |
发送方硬件地址 | 00:11:22:33:44:55 | 无盘工作站的MAC地址 |
发送方协议地址 | 00:00:00:00 | 无盘工作站的IP地址(未知,用0.0.0.0填充) |
目标硬件地址 | 00:00:00:00:00:00 | 未知,用全0填充 |
目标协议地址 | 00:00:00:00 | 未知,用0.0.0.0填充 |
注:无盘工作站没有本地存储设备,启动时需要从网络上的服务器获取操作系统映像。它们通过RARP请求一个IP地址,以便能够与服务器通信。
4、RARP响应报文示例
假设RARP服务器收到请求后,为无盘工作站分配了IP地址192.168.1.100,并发送一个RARP响应报文。
以太网帧头:
目的MAC地址 | 源MAC地址 | 类型 |
---|---|---|
00:11:22:33:44:55 | 服务器的MAC地址 | 0x8035(RARP协议) |
RARP响应报文内容:
字段 | 值(十六进制) | 说明 |
---|---|---|
硬件类型 | 0001 | 以太网 |
协议类型 | 0800 | IPv4 |
硬件地址长度 | 06 | MAC地址长度 |
协议地址长度 | 04 | IP地址长度 |
操作码 | 0004 | RARP响应 |
发送方硬件地址 | 服务器的MAC地址 | RARP服务器的MAC地址 |
发送方协议地址 | C0:A8:01:64 | RARP服务器的IP地址(192.168.1.1) |
目标硬件地址 | 00:11:22:33:44:55 | 无盘工作站的MAC地址 |
目标协议地址 | 00:00:00:00 | 分配给无盘工作站的IP地址(192.168.1.100) |
5、关于 padding
ARP数据为28字节,根据以太网帧最小负载长度为46字节的规定,需要 padding 18个字节。如下报文所示:
①、常见的几个字节长度解释:
46:以太网帧(Ethernet Frame)的最小数据负载长度。
60:46字节的基础上 + 14字节长度的以太网帧头。
64:60字节的基础上 + 4字节长度的以太网帧尾。
②、关于以下原文的解释:“其原因是我们在发送该以太网数据帧的系统(bsdi)上运行tcpdump命令。应用程序rarpd写42字节到BSD分组过滤设备上(其中14字节为以太网数据帧的报头,剩下的28字节是RARP应答),这就是tcpdump收到的副本。但是以太网设备驱动程序要把这一短帧填充空白字符以达到最小传输长度(60)。如果我们在另一个系统上运行tcpdump命令,其长度将会是60。” :
1、在本"主机A"上使用 tcpdump 捕获发包,捕获的是副本,没有经过以太网设备驱动程序的 padding 处理。
2、如果在另一台"主机B"上使用 tcpdump 捕获(接收)这个报文,是经过 padding 处理的,因为包在从“主机A”发出时,经过了以太网设备驱动程序的处理。
6、免费ARP
免费ARP报文结构:
免费ARP是一种特殊的ARP报文,报文的格式与普通ARP报文相同,但有一些特定的字段值。以下是报文的详细结构:
字段 | 长度(字节) | 说明 |
---|---|---|
硬件类型 | 2 | 硬件地址类型,以太网为1 |
协议类型 | 2 | 协议地址类型,IPv4为0x0800 |
硬件地址长度 | 1 | 硬件地址长度,以太网为6字节 |
协议地址长度 | 1 | 协议地址长度,IPv4为4字节 |
操作码 | 2 | 操作类型,免费ARP通常使用2(ARP响应) |
发送方硬件地址 | 6 | 发送方的MAC地址 |
发送方协议地址 | 4 | 发送方的IP地址 |
目标硬件地址 | 6 | 目标硬件地址,通常为发送方的MAC地址 |
目标协议地址 | 4 | 目标协议地址,通常为发送方的IP地址 |
假设设备A(IP地址为192.168.1.100,MAC地址为00:11:22:33:44:55)发送一个免费ARP报文,以下是报文的具体内容:
以太网帧头:
字段 | 值(十六进制) | 说明 |
---|---|---|
目的MAC地址 | FF:FF:FF:FF:FF:FF | 广播地址 |
源MAC地址 | 00:11:22:33:44:55 | 设备A的MAC地址 |
类型 | 0806 | 表示这是一个ARP报文 |
ARP报文内容:
字段 | 值(十六进制) | 说明 |
---|---|---|
硬件类型 | 0001 | 以太网 |
协议类型 | 0800 | IPv4 |
硬件地址长度 | 06 | MAC地址长度 |
协议地址长度 | 04 | IP地址长度 |
操作码 | 0002 | ARP响应(免费ARP通常使用响应格式) |
发送方硬件地址 | 00:11:22:33:44:55 | 设备A的MAC地址 |
发送方协议地址 | C0:A8:01:64 | 设备A的IP地址(192.168.1.100) |
目标硬件地址 | 00:11:22:33:44:55 | 设备A的MAC地址(免费ARP中通常与发送方MAC地址相同) |
目标协议地址 | C0:A8:01:64 | 设备A的IP地址(192.168.1.100) |
目的MAC地址:免费ARP报文通常以广播形式发送,因此目的MAC地址为全1(FF:FF:FF:FF:FF:FF)。
操作码:免费ARP通常使用操作码2(ARP响应),而不是1(ARP请求)。这是因为免费ARP的目的是通告自己的IP和MAC信息,而不是请求其他设备的MAC地址。
目标硬件地址和目标协议地址:在免费ARP中,目标硬件地址和目标协议地址通常与发送方的硬件地址和协议地址相同。这是因为设备在通告自己的信息。
应用场景:
1、检测IP地址冲突:设备启动时发送免费ARP报文,如果收到响应,则表明网络中存在IP地址冲突。
2、更新ARP缓存表:当设备的MAC地址发生变化(如更换网卡)时,发送免费ARP报文以更新其他设备的ARP缓存表。
二、tcpdump 的使用
1、基本语法
tcpdump [选项] [过滤条件]
2、常用选项
-
-i <interface>
:指定监听的网络接口。-
示例:
tcpdump -i eth0
(监听 eth0 接口的流量)。
-
-
-n
:不解析主机名(显示 IP 地址而不是主机名)。-
示例:
tcpdump -n
(不解析主机名)。
-
-
-nn
:不解析主机名和端口号(显示原始 IP 地址和端口号)。-
示例:
tcpdump -nn
(不解析主机名和端口号)。
-
-
-v
:详细模式,显示更多报文信息。-
示例:
tcpdump -v
(显示详细信息)。
-
-
-vv
:更详细模式,显示更多报文信息。-
示例:
tcpdump -vv
(显示更详细信息)。
-
-
-c <count>
:捕获指定数量的报文后停止。-
示例:
tcpdump -c 10
(捕获 10 个报文后停止)。
-
-
-w <file>
:将捕获的报文保存到指定文件中。-
示例:
tcpdump -w capture.pcap
(将捕获的报文保存到 capture.pcap 文件中)。
-
-
-r <file>
:从指定文件中读取报文。-
示例:
tcpdump -r capture.pcap
(从 capture.pcap 文件中读取报文)。
-
-
-s <size>
:设置捕获的报文大小(默认为 65535 字节)。-
示例:
tcpdump -s 100
(捕获每个报文的前 100 字节)。
-
-
-e:用于显示以太网帧的头部信息,包括源MAC地址、目的MAC地址以及以太网帧的类型等
-
实例:
tcpdump -e
-
3、常用过滤条件
-
host <IP>
:捕获指定主机的报文。-
示例:
tcpdump host 192.168.1.100
(捕获来自或发往 192.168.1.100 的报文)。
-
-
net <网络>
:捕获指定网络的报文。-
示例:
tcpdump net 192.168.1.0/24
(捕获来自或发往 192.168.1.0/24 网络的报文)。
-
-
port <端口>
:捕获指定端口的报文。-
示例:
tcpdump port 80
(捕获端口 80 的报文)。
-
-
tcp
:捕获 TCP 协议的报文。-
示例:
tcpdump tcp
(捕获所有 TCP 报文)。
-
-
udp
:捕获 UDP 协议的报文。-
示例:
tcpdump udp
(捕获所有 UDP 报文)。
-
-
icmp
:捕获 ICMP 协议的报文。-
示例:
tcpdump icmp
(捕获所有 ICMP 报文)。
-
-
arp
:捕获 ARP 协议的报文。-
示例:
tcpdump arp
(捕获所有 ARP 报文)。
-
-
src <IP>
:捕获来自指定 IP 的报文。-
示例:
tcpdump src 192.168.1.100
(捕获来自 192.168.1.100 的报文)。
-
-
dst <IP>
:捕获发往指定 IP 的报文。-
示例:
tcpdump dst 192.168.1.100
(捕获发往 192.168.1.100 的报文)。
-
-
src port <端口>
:捕获来自指定端口的报文。-
示例:
tcpdump src port 80
(捕获来自端口 80 的报文)。
-
-
dst port <端口>
:捕获发往指定端口的报文。-
示例:
tcpdump dst port 80
(捕获发往端口 80 的报文)。
-
-
not <条件>
:排除指定条件的报文。-
示例:
tcpdump not host 192.168.1.100
(排除来自或发往 192.168.1.100 的报文)。
-
三、arp 命令的使用
1、基本语法
arp [选项] [主机名或IP地址]
2、常用选项
-
-a
:显示系统中的所有 ARP 表项。-
示例:
arp -a
(显示所有 ARP 表项)。
-
-
-n
:不解析主机名,直接显示 IP 地址。-
示例:
arp -n
(显示所有 ARP 表项,不解析主机名)。
-
-
-d
:删除指定的 ARP 表项。-
示例:
arp -d 192.168.1.100
(删除 IP 地址为 192.168.1.100 的 ARP 表项)。
-
-
-s
:添加或修改一个静态 ARP 表项。-
示例:
arp -s 192.168.1.100 00:11:22:33:44:55
(添加或修改 IP 地址为 192.168.1.100 的静态 ARP 表项,MAC 地址为 00:11:22:33:44:55)。
-
-
-f
:从文件中读取 ARP 表项。-
示例:
arp -f /path/to/arpfile
(从文件中读取 ARP 表项)。
-
3、示例
执行 arp -a:
? (192.168.1.1) at 00:11:22:33:44:55 [ether] on eth0
-
?
表示主机名未知。 -
192.168.1.1
是 IP 地址。 -
00:11:22:33:44:55
是对应的 MAC 地址。 -
[ether]
表示这是一个以太网设备。 -
on eth0
表示这些条目属于eth0
接口。