拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

北航计算机网络实验三:ARP与ICMP抓包分析及ping命令详解

北航计算机网络实验三:ARP与ICMP抓包分析及ping命令详解

简介:这份PDF是北航研究生计算机网络课程的实验三网络层实验报告,面向正在学习计算机网络、需要完成ARP与网络层相关实验的高校学生及自学者。报告围绕ARP协议展开,涵盖ARP请求与应答的交互过程、ARP缓存的作用、ARP报文各字段结构,以及默认网关在跨网段通信中的必要性,并结合Wireshark抓包对ICMP回送请求与应答、地址掩码请求、时间戳请求等报文进行逐字段分析,配有完整的实验数据表格与对比结论。资源包共1个PDF文件,约40KB,内容为实验报告正文,便于直接查阅与对照填写。目前已有111人学习下载。读者可借此理清IP与MAC地址映射机制,掌握同网段与跨网段ARP解析的异同,并学习如何用Wireshark分析网络层报文,适合作为实验参考与复习资料。

1. 北航研究生计算机网络实验三:从 ARP 到 ICMP 的一次抓包复盘

如果你正在做北航研究生计算机网络实验三,大概率会卡在同一个地方:Wireshark 抓了一堆包,却说不清 ARP 请求和 ICMP 回显之间到底谁先谁后、为什么 ping 同网段和跨网段的表现完全不同。这个实验的核心不是让你背协议字段,而是逼你用抓包工具把「网络层转发」这件事看穿——ARP 怎么解析 MAC、ICMP 怎么封装在 IP 里、ping 命令背后到底发了什么。适合已经学过谢希仁《计算机网络》或王道八股、但一到动手就发懵的研一同学,也适合想重新梳理 ARP 协议原理和 ping 命令用法的从业者。下面按我实际做实验的顺序,把拓扑搭建、抓包分析、参数设置和踩过的坑一次讲清楚。

2. 实验拓扑与抓包环境:先把「能复现」这件事做扎实

2.1 为什么选 GNS3 而不是 Packet Tracer

北航这个实验常见做法是用 GNS3 搭拓扑,原因是它跑的是真实的路由器镜像和主机协议栈,抓出来的 ARP 报文头部字段、ICMP 超时行为跟真实网络一致。Packet Tracer 是模拟器,ARP 缓存老化时间、ICMP 重定向这些细节会被简化,做实验三的分析时容易得出错误结论。我一般会选 GNS3 加两台路由器、两台 VPCS 或 Linux 主机,拓扑结构是:主机 A — 路由器 R1 — 路由器 R2 — 主机 B,中间用 /30 网段互联。这样既能观察同网段 ARP,又能观察跨网段时 ARP 解析的是网关而不是最终目的主机。

如果你手头只有虚拟机,用两台 CentOS 7 或 Ubuntu 加一台做路由转发也能复现,但要注意 Linux 默认不开转发,需要手动开。GNS3 的好处是路由器镜像自带转发,省去内核参数调试。实验开始前先确认三件事:每台设备的 IP 和子网掩码配对了、路由器接口 no shutdown 了、抓包接口选在正确的链路上。这三件事任何一件出问题,后面抓包全是空的。

2.2 最小拓扑的配置命令

下面是我常用的 GNS3 拓扑配置,路由器用 Cisco IOS 镜像,主机用 VPCS。先配 R1:

# R1 配置 enable configure terminal interface fastEthernet0/0 ip address 192.168.1.1 255.255.255.0 no shutdown interface fastEthernet0/1 ip address 10.0.0.1 255.255.255.252 no shutdown exit ip routing end write

R2 对称配置,f0/0 接主机 B 网段 192.168.2.0/24,f0/1 接 10.0.0.2/30。主机 A 配 192.168.1.10/24 网关 192.168.1.1,主机 B 配 192.168.2.10/24 网关 192.168.2.1。配置完先在两台路由器上show ip interface brief确认接口 up,再在主机上互相 ping。

参数说明:ip routing在部分 IOS 版本默认开启,但显式写上避免翻车;no shutdown必须敲,否则接口是 administratively down,抓包看不到任何流量。子网掩码用 /30 是为了省地址,互联链路只需要两个可用 IP。如果你用 Linux 做路由器,对应命令是sysctl -w net.ipv4.ip_forward=1和ip addr add,效果一样。

2.3 Wireshark 抓包点的选择

抓包位置决定你能看到什么。实验三里我建议至少抓两个点:主机 A 的出口链路和 R1 的 f0/1 出口。主机 A 出口能看到 ARP 请求广播和 ICMP 请求的完整封装;R1 出口能看到跨网段时源 MAC 变成 R1 的 MAC、目的 MAC 变成 R2 的 MAC,而 IP 层源目地址不变。这个对比是理解「网络层端到端、链路层逐跳」的关键。

Wireshark 过滤器用arp or icmp就够了,不要一上来就抓全部,否则背景流量会干扰。抓包前先在主机 A 上arp -d清空 ARP 缓存,再执行 ping,这样能抓到完整的 ARP 请求-应答过程。如果不清缓存,第二次 ping 直接走缓存,你就看不到 ARP 了,这是很多同学第一次做实验时「抓不到 ARP」的头号原因。

3. ARP 协议抓包分析:请求为什么是广播、应答为什么是单播

3.1 ARP 报文头部字段逐个拆

抓到 ARP 包后,Wireshark 的协议树会展开这些字段:Hardware type、Protocol type、Hardware size、Protocol size、Opcode、Sender MAC、Sender IP、Target MAC、Target IP。实验报告里要求你解释的就是这些。Hardware type 为 1 表示以太网,Protocol type 为 0x0800 表示上层是 IPv4,Opcode 为 1 是请求、2 是应答。Hardware size 6 是 MAC 长度,Protocol size 4 是 IP 长度。

关键点在于:ARP 请求里 Target MAC 字段是全 0,因为请求方还不知道对方 MAC;应答里 Sender MAC 填的是被请求方的 MAC,Target MAC 填的是请求方的 MAC。这个对称关系是判断 ARP 包方向的最快方法。很多同学看 Opcode 分不清谁问谁答,其实看 Target MAC 是否全 0 更直观。

3.2 同网段 ping 的完整时序

在主机 A 上清空 ARP 缓存后 ping 192.168.1.20(同网段另一台主机),Wireshark 里会看到这个顺序:

1. ARP Request Who has 192.168.1.20? Tell 192.168.1.10 2. ARP Reply 192.168.1.20 is at aa:bb:cc:dd:ee:02 3. ICMP Echo Request 192.168.1.10 -> 192.168.1.20 4. ICMP Echo Reply 192.168.1.20 -> 192.168.1.10

ARP 请求是二层广播,目的 MAC 是 ff:ff:ff:ff:ff:ff,所有同网段设备都会收到,但只有 IP 匹配的那台会回单播应答。ICMP 请求和应答都是单播,因为此时双方 MAC 都已经知道了。这个时序说明:ARP 是 ICMP 的前置条件,没有 ARP 解析就没有 ICMP 的封装。

如果你 ping 的是同网段但对方关机,会看到 ARP 请求重复发三次左右然后 ICMP 报 host unreachable。这个重传次数由操作系统决定,Linux 默认 3 次,Windows 也差不多。实验报告里可以把这个现象写进去,说明 ARP 解析失败时上层协议的表现。

3.3 跨网段 ping 时 ARP 解析的是谁

这是实验三最容易搞混的地方。主机 A ping 192.168.2.10(跨网段),主机 A 发现目的 IP 不在自己网段,于是查路由表找到默认网关 192.168.1.1,然后 ARP 请求的是网关的 MAC,不是主机 B 的 MAC。抓包会看到:

ARP Request Who has 192.168.1.1? Tell 192.168.1.10 ARP Reply 192.168.1.1 is at aa:bb:cc:dd:ee:01 ICMP Echo Request 192.168.1.10 -> 192.168.2.10

注意 ICMP 包的源 IP 是 192.168.1.10,目的 IP 是 192.168.2.10,但二层目的 MAC 是网关的 MAC。到了 R1 之后,R1 查路由表发现 192.168.2.0/24 走 f0/1,于是重新封装二层帧,源 MAC 变成 R1 f0/1 的 MAC,目的 MAC 变成 R2 f0/1 的 MAC,IP 层不变。这个「逐跳改 MAC、端到端不改 IP」的对比,是实验报告里必须写清楚的核心结论。

3.4 用 arp -a 和 arp -d 验证缓存行为

抓包之外,用命令行验证 ARP 缓存更直接。在主机 A 上执行:

arp -a # 查看当前 ARP 缓存 arp -d 192.168.1.1 # 删除指定条目 ping 192.168.2.10 # 触发重新 ARP arp -a # 再看缓存,确认网关 MAC 被重新学习

参数说明:arp -d在 Linux 上需要 root,Windows 上直接arp -d *清全部。清缓存后第一次 ping 会有短暂延迟,因为要等 ARP 解析完成,这个延迟在抓包时间戳上能看出来,通常 1 到 3 毫秒。如果arp -a里出现(incomplete)状态,说明 ARP 请求发了但没收到应答,检查对方是否在线、防火墙是否拦截了 ARP。

4. ICMP 与 ping 命令:回显请求里到底装了什么

4.1 ICMP 报文结构在 Wireshark 里的呈现

ICMP 回显请求的字段很少:Type 8、Code 0、Checksum、Identifier、Sequence number,后面跟 Data。回显应答 Type 0、Code 0,其余字段原样返回。Identifier 用来匹配请求和应答,Linux 下通常是进程 ID,Windows 下是固定值。Sequence number 从 1 开始递增,每发一个 ping 包加 1。

实验报告里常问「ping 命令发了几个包、每个包多大」。默认 Linux ping 发 4 个包,每个 ICMP 数据部分 56 字节,加上 8 字节 ICMP 头和 20 字节 IP 头,总共 84 字节。Wireshark 里看到的 Frame length 是 98 字节,因为还加了 14 字节以太网头。这个计算过程写进报告能体现你真的看懂了封装。

4.2 ping 命令的常用参数与实验对应

做实验三时这几个参数必须会:

ping -c 4 192.168.2.10 # 只发 4 个包,默认行为 ping -s 1000 192.168.2.10 # 指定数据部分 1000 字节,观察分片 ping -i 0.5 192.168.2.10 # 间隔 0.5 秒,观察 ARP 缓存老化 ping -t 255 192.168.2.10 # 设置 TTL,观察 ICMP 超时

-s 1000会让 IP 包超过 MTU 1500,触发分片,Wireshark 里能看到 Fragment offset 字段。-t 255设小一点比如 1,跨路由器时 TTL 减到 0,路由器回 ICMP Time Exceeded,Type 11。这两个参数是实验报告里分析 ICMP 差错报文的入口。注意-t在 Linux 是 TTL,在 Windows 是-i,别搞混。

4.3 用 ping 输出反推网络状态

ping 的输出不只是通不通。time=0.5 ms说明同网段或直连;time=10 ms以上可能有跨广域网或拥塞;Request timeout说明 ICMP 应答没回来,可能是路由不可达、防火墙拦截或对方关机;Destination Host Unreachable通常是 ARP 解析失败或路由表没有条目;TTL expired in transit是 TTL 耗尽,说明路径上有环路或 TTL 设太小。

实验里如果出现dup!重复应答,说明网络里有重复的 ARP 应答或 ICMP 应答,常见于有环路的二层网络或 ARP 欺骗场景。这个现象在实验报告里可以作为扩展分析,但不要跑偏去讲安全攻防,聚焦在协议行为上。

5. 避坑与排查:实验三最容易翻车的五个地方

5.1 抓不到 ARP 请求

现象:Wireshark 里只有 ICMP 没有 ARP。原因:主机 ARP 缓存里已经有网关或目的主机的条目,ping 直接走缓存。解决:抓包前先arp -d清缓存,或者重启主机网络接口。Linux 下ip neigh flush all更彻底。

5.2 跨网段 ping 不通但同网段通

现象:ping 网关通,ping 对端主机不通。原因:路由器没开转发、路由表缺条目、或者对端主机网关配错。解决:在 R1 上show ip route确认有 192.168.2.0/24 的路由,在 R2 上确认有 192.168.1.0/24 的路由。如果是 Linux 做路由器,检查net.ipv4.ip_forward=1。

5.3 ICMP 包显示为「不可达」但 ARP 正常

现象:ARP 请求应答都有,ICMP 请求发出去了但回不来。原因:对端主机防火墙拦截 ICMP,或者对端没有到源网段的路由。解决:临时关掉对端防火墙systemctl stop firewalld测试,确认是防火墙问题后加规则放行 ICMP。路由问题则检查对端默认网关。

5.4 Wireshark 抓到的包不完整

现象:只抓到请求没抓到应答,或者包长度不对。原因:抓包接口选错,比如抓了主机的 loopback 而不是出口网卡;或者抓包过滤器写错把应答过滤掉了。解决:确认抓包接口是连接拓扑的那块网卡,过滤器先用arp or icmp不加其他条件,抓到后再用显示过滤器细分。

5.5 ping 延迟忽大忽小

现象:同网段 ping 延迟从 0.5ms 跳到 50ms。原因:GNS3 或虚拟机环境 CPU 占用高,抓包和模拟本身消耗资源;或者 ARP 缓存老化导致周期性重新解析。解决:关掉不必要的抓包窗口,给虚拟机分配足够内存;把 ARP 缓存老化时间调长(Linux 下net.ipv4.neigh.default.gc_stale_time),减少重新解析频率。

6. 进阶技巧:用 tcpdump 在 Linux 主机上做无 GUI 抓包

实验环境里如果主机是 Linux 且没有图形界面,Wireshark 用不了,tcpdump 是替代方案。我一般用这条命令抓 ARP 和 ICMP:

tcpdump -i eth0 -nn -e 'arp or icmp' -w lab3.pcap

参数说明:-i eth0指定网卡,-nn不解析主机名和端口名,-e显示 MAC 层头部,-w写入文件后续用 Wireshark 打开分析。抓完后用tcpdump -r lab3.pcap -e回放,或者把 pcap 拷到有 Wireshark 的机器上。这个组合在服务器环境里特别实用,因为很多生产机器不装图形界面。

另一个技巧是用ping -f洪水 ping 观察 ARP 缓存压力,但实验环境里慎用,容易把 GNS3 打满。更温和的做法是ping -c 100 -i 0.2连续发 100 个包,观察 ARP 缓存条目是否稳定、有没有出现 incomplete 状态。如果出现 incomplete,说明 ARP 解析在高频请求下丢包,这在真实网络里对应 ARP 表溢出或链路拥塞。

最后说一个我踩过的坑:实验报告里要求画时序图,很多同学把 ARP 和 ICMP 画在同一层。正确画法是 ARP 在二层和三层之间,ICMP 在三层之上,ICMP 封装在 IP 里,IP 再封装在以太网帧里。时序上 ARP 先完成,ICMP 才能发出。这个层次关系画对了,报告的分析部分基本就稳了。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表