1. 网络调试基础:OSI七层模型与TCP/IP四层模型对比、常用网络命令实战、Wireshark抓包入门

1.1 为什么搞网络调试要先懂模型?

说实话,我刚开始做嵌入式开发那会儿,也觉得网络协议模型就是个理论课。直到有一次,我在调试一块工业控制板,ping外网死活不通,折腾了两天。后来才发现,问题出在物理层的网口变压器虚焊上。

你想想看,如果不懂分层模型,你可能会在应用层找半天bug,结果问题在物理层。这就是为什么我每次带新人,第一课就是讲清楚这两个模型。

1.2 OSI七层 vs TCP/IP四层

OSI七层模型是国际标准,但实际工程中,我们用的更多的是TCP/IP四层模型。说白了,OSI是教科书,TCP/IP是实战手册。

OSI七层模型 TCP/IP四层模型 典型协议/设备 我常用的调试手段
应用层 应用层 HTTP, FTP, MQTT 抓包看应用数据
表示层 SSL/TLS 检查加密握手
会话层 NetBIOS 看会话建立过程
传输层 传输层 TCP, UDP 看端口、序列号
网络层 网络层 IP, ICMP ping、路由追踪
数据链路层 网络接口层 以太网, MAC 看MAC地址、ARP
物理层 网线, 信号 示波器看波形
我的小习惯:调试时从底层往上层排查。先看物理层灯亮不亮,再看链路层能不能通,最后才看应用层。这样效率最高。

1.3 常用网络命令实战

1.3.1 ping —— 最基础的连通性测试

ping用的是ICMP协议,说白了就是问对方「你在吗?」。我在项目中遇到过最典型的场景:客户说设备连不上网,我远程让他ping网关,结果ping不通。再让他ping 127.0.0.1,通了。这说明问题出在网口驱动或硬件上。

# 基本用法
ping 192.168.1.1

# 连续ping,嵌入式调试常用
ping -t 192.168.1.1

# 指定包大小,测试网络稳定性
ping -l 1472 192.168.1.1
注意:ping不通不一定是网络问题。有些设备防火墙会禁ping。我曾经被这个坑过,排查了半天,结果是安全策略的问题。

1.3.2 ifconfig —— 查看网络接口配置

在嵌入式Linux开发板上,ifconfig是我用得最多的命令。没有之一。

# 查看所有网络接口
ifconfig -a

# 查看特定接口
ifconfig eth0

# 配置IP地址(临时)
ifconfig eth0 192.168.1.100 netmask 255.255.255.0

嗯,这里要注意:ifconfig配置的IP重启后会丢失。要永久生效,得改配置文件。我刚开始做嵌入式时,每次重启都要重新配IP,后来才学会改/etc/network/interfaces。

1.3.3 netstat —— 查看网络连接状态

netstat能告诉你当前系统有哪些网络连接。我个人习惯用它来排查端口占用问题。

# 查看所有监听端口
netstat -an | grep LISTEN

# 查看TCP连接状态
netstat -ant

# 查看路由表
netstat -r
实战场景:有一次设备上的Web服务器起不来,我用netstat -an | grep 80一看,发现80端口被另一个进程占了。kill掉那个进程,问题解决。

1.3.4 tcpdump —— 命令行抓包利器

tcpdump是嵌入式环境下的抓包神器。没有Wireshark的图形界面?没关系,tcpdump照样能干活。

# 抓取eth0上的所有包
tcpdump -i eth0

# 抓取特定主机的包
tcpdump -i eth0 host 192.168.1.1

# 抓取特定端口的包
tcpdump -i eth0 port 80

# 保存到文件,方便后续分析
tcpdump -i eth0 -w capture.pcap

你想想看,在嵌入式设备上,没有显示器没有鼠标,tcpdump就是你的眼睛。我曾经在野外调试太阳能控制器,就靠tcpdump抓包,然后用scp传到笔记本上用Wireshark分析。

1.4 Wireshark抓包入门

1.4.1 为什么用Wireshark?

Wireshark能让你「看见」网络数据包。说白了,就是网络世界的显微镜。我刚开始学网络协议时,对着书本看了三天TCP三次握手,不如用Wireshark抓一次包来得直观。

1.4.2 基本操作

  1. 选择网卡:启动后选择要抓包的网卡。注意,别选错了,我见过有人抓了半天发现抓的是WiFi的包,问题出在以太网上。
  2. 设置过滤条件:不设过滤的话,包多得你看不过来。
  3. 开始抓包:点击开始按钮,然后触发你的网络操作。
  4. 停止分析:抓到足够的包后停止,开始分析。

1.4.3 常用过滤表达式

# 只看特定IP
ip.addr == 192.168.1.100

# 只看特定端口
tcp.port == 80

# 只看HTTP协议
http

# 只看ARP请求
arp

# 组合过滤
ip.addr == 192.168.1.100 and tcp.port == 80
我的经验:调试MQTT协议时,我习惯用 mqtt 过滤。有一次发现设备频繁掉线,一看抓包结果,原来是心跳包间隔设置太短,服务器以为是攻击就给踢了。

1.4.4 实战:看一次TCP三次握手

打开Wireshark,过滤输入 tcp,然后ping一下百度。你会看到:

  • 第一次握手:客户端发SYN包,标志位显示 [SYN]
  • 第二次握手:服务器回SYN+ACK包,标志位显示 [SYN, ACK]
  • 第三次握手:客户端发ACK包,标志位显示 [ACK]

看到没?这就是教科书上说的三次握手。但实际抓包你会发现,有时候还会有重传、乱序等情况。这就是实战和理论的区别。

1.5 本章小结

网络调试说白了就是一层一层排查。模型帮你理清思路,命令给你工具,Wireshark给你眼睛。我建议你:

  • 先把ping和ifconfig练熟,这是基本功
  • 遇到问题用netstat看端口状态
  • 复杂问题用tcpdump或Wireshark抓包分析
  • 记住:从底层往上层查,别跳层

下一章,我会带你深入ARP协议,看看设备是怎么找到对方的MAC地址的。到时候我会分享一个我调试ARP缓存表被刷新的真实案例,很有意思。