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
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
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 基本操作
- 选择网卡:启动后选择要抓包的网卡。注意,别选错了,我见过有人抓了半天发现抓的是WiFi的包,问题出在以太网上。
- 设置过滤条件:不设过滤的话,包多得你看不过来。
- 开始抓包:点击开始按钮,然后触发你的网络操作。
- 停止分析:抓到足够的包后停止,开始分析。
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 过滤。有一次发现设备频繁掉线,一看抓包结果,原来是心跳包间隔设置太短,服务器以为是攻击就给踢了。
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缓存表被刷新的真实案例,很有意思。