Skip to content

LV045-网络调试工具与抓包 ​

一、 为什么要会看线上的包 ​

1. 日志只告诉你"自己这一侧看到了什么" ​

排查网络问题时,最容易陷入的误区是"只看自己这边的日志"。日志的局限在于它只覆盖一个观测点:

  • 板子日志说"没收到包"——可能是包根本没发出来,也可能是发出来了但没到达板子;
  • PC 说"超时"——可能是请求没到达,也可能是到达了但应答没回来。

这两个观测点之间的事,日志永远看不到。

2. 抓包能看到线上真实发生了什么 ​

抓包(在链路上原样复制一份流量)补的就是这个缺口。它回答的是"线上到底跑过什么包":

问题日志能答吗抓包能答吗
PC 到底把 ARP 请求发出去了吗不能能
板子的应答被交换机转发出来了吗不能能
请求与应答的间隔有多长板子看不到发端时间能
包里哪个字段不对只能猜逐字节看

嵌入式开发的特殊性在于:板子本身没法装抓包工具,所以抓包点要选在 PC 侧(直连时 PC 网卡就能看到全部流量)或交换机的镜像口上。直连实验的抓包条件其实非常好——所有流量必过 PC 这块网卡。

排查层级与工具的对应关系

二、 三件套:ping、arp、ipconfig ​

1. ping:读输出里的三个数 ​

bash
ping 192.168.16.30

输出里值得看的三样东西:

输出含义排错用法
时间=1ms 这类值往返时延第一包明显慢是 ARP 的一问一答,正常现象
TTL=128包的剩余跳数板子直连时应该看到初始值;变小说明中间有路由器
丢包率发了多少、回了多少时通时不通时,先看丢包是不是集中在某几包

第一包慢的原理见 LV050-一次ping的完整旅程 第二节。

2. arp -a / ip neigh:看解析结果 ​

系统命令看什么
Windowsarp -a板子的 IP 有没有对应 MAC、MAC 对不对
Linuxip neigh同上,状态为 REACHABLE 才算学到

两个典型结论:

(1)表里根本没有板子的 IP:ARP 没通,问题在链路层以下(网线、交换机、中断标志),轮不到 IP。

(2)IP 在但 MAC 不对:学到了错误的映射(IP 冲突或换了板子没清缓存),用 arp -d 192.168.16.30 删掉再 ping。

3. ipconfig / ip addr:先确认你用的是哪块网卡 ​

笔记本上通常同时存在多块网卡:有线、WiFi、虚拟机虚拟网卡。直连实验最常见的低级错误是PC 把地址配到了 WiFi 网卡上,而有线网卡还是自动获取状态。

bash
# Windows
ipconfig

# Linux
ip addr

要核对的是"和板子连着的那块网卡"的地址与掩码,而不是"系统里存在这么一条配置"。

三、 快速连通性验证:nc ​

1. 测 TCP:确认端口能不能握手 ​

bash
nc -v 192.168.16.30 8888

这条命令的价值在于把 TCP 与应用层协议解耦:不需要上位机脚本、不需要固件帧,只要握手成功,就说明 DM9000、lwIP、TCP、端口监听这条链全通。

三种结果对应三种结论:

结果结论
立刻 Connected to ...传输层全通,问题在帧协议或上位机
一直挂起直到超时端口没监听或 SYN 没到达,查 IAP_TCP_EN、端口占用
立刻 Connection refused到达了对端但端口没开(对 TCP 来说这是个"好消息":IP 通了)

本工程是单连接服务器,一个已建立的 nc 会话会占住通道:之后再用升级脚本连接会被 tcp_abort 拒绝。测完记得把 nc 关掉(见 LV020-网络通信实验 第三节)。

2. 测 UDP:确认服务器端口开着 ​

bash
nc -u -v 192.168.16.100 69

UDP 没有握手,所以 nc -u 的"连通"不代表什么;它的用法是发一个包出去,看服务器有没有反应。对 TFTP 来说更直接的办法是用 TFTP 客户端实际拉一次文件。

四、 tcpdump 与 Wireshark ​

1. tcpdump 常用命令 ​

Linux 下抓包的入口是 tcpdump(需要 root 或相应权限):

bash
# 抓指定网卡上与板子相关的全部流量
sudo tcpdump -i eth0 host 192.168.16.30

# 只看 ARP 与 ICMP(ping 排错最常用的组合)
sudo tcpdump -i eth0 arp or icmp

# 把抓到的包存成文件,之后用 Wireshark 打开慢慢看
sudo tcpdump -i eth0 host 192.168.16.30 -w board.pcap

-w 写文件这个组合最值得记住:嵌入式现场往往只有串口和一根网线,先把流量录下来,事后在图形界面里分析。

2. Wireshark 过滤表达式 ​

Windows 或图形环境里用 Wireshark,常用过滤写法:

过滤表达式看什么
arpARP 的一问一答:请求广播、应答单播
icmpping 的请求与应答是否成对
tcp.port == 8888升级通道的三次握手、数据段、重传
udp.port == 69 or udpTFTP 的 RRQ、DATA、ACK
frame contains "IAPBIN"直接在字节里搜帧头魔数

看 TCP 流量时特别值得关注的标志:有没有重传(Retransmission)。同一段数据被发两遍,说明 ACK 没回到发送方——直连实验里出现大量重传,多半是对端处理太慢(比如板子在回调里做了耗时操作)。

3. 对照本工程的三种典型包 ​

场景线上应该看到什么说明
首次 pingARP 请求(广播)→ ARP 应答(单播)→ ICMP 请求 → ICMP 应答四包齐全才算全通
TCP 升级SYN → SYN/ACK → ACK → 数据段(每个段有 ACK)缺握手先查端口;缺 ACK 看板子回调
TFTP 升级RRQ(到 69)→ DATA(从服务器的 TID 端口)→ ACK → …服务器会换端口,注意第二条的方向

三个包的详细解析分别见 LV050、LV035-传输层端口UDP与TCP 第三节、LV025-基于TFTP的网络升级实验 第五节。

五、 症状到工具的对照表 ​

把前面几篇和本篇合起来,得到一张"先拿什么工具"的对照表:

现象第一个工具看什么大概率结论
完全不通,灯也不亮肉眼 + ipconfig网线、网卡选对没物理层问题
ping 不通,灯亮ipconfig两边是否同网段、是不是配错了网卡地址配置问题
ping 不通,网段正确arp -a有没有学到板子的 MACARP 没通,查收包路径
ping 通,TCP 连不上nc -vrefused 还是 timeout端口没开 vs 链路问题
TCP 连上但升级失败Wireshark握手正常吗、有没有重传、帧头对不对帧协议问题
TFTP 一直超时WiresharkRRQ 出去了吗、服务器回了吗服务器没起或端口被拦
时通时不通ping -t 长ping + 板子计数丢包有没有规律、主循环是否被堵主循环被长操作挡住

这张表与 LV050 第六节的决策树是配套的:决策树解决"按什么顺序查",这张表解决"每一步用什么工具看"。

六、 小结与参考资料 ​

1. 本篇小结 ​

  • 日志只能覆盖一个观测点;抓包才能看到"线上真实发生了什么",两者要配合用。
  • ping 看时延、TTL 与丢包;arp -a / ip neigh 看解析结果;ipconfig / ip addr 先确认网卡选对。
  • nc -v 把 TCP 与应用层解耦:握手成功 = 传输层全通;refused 是"IP 通了、端口没开"的好消息。
  • tcpdump -w 录文件、Wireshark 里按过滤表达式分析,是嵌入式现场最实用的抓包组合。
  • 看 TCP 流量重点关注重传;看 TFTP 流量注意服务器会换 TID 端口。
  • 排查顺序永远是"先物理、再地址、再 ARP、再传输层",每一步用对应的工具验证。

2. 参考资料 ​


本文档由 markdowncli 技能辅助生成