4、网络层连接问题:DHCP获取失败、IP地址冲突、DNS解析异常、网关不可达

WiFi连上了,信号满格,但就是上不了网。这恐怕是现场最让人抓狂的场景之一。我早年跑工地时,经常被客户拽到设备前问:“你看,WiFi图标都亮了,为什么APP还是显示离线?”

说白了,WiFi连上只代表你过了“链路层”这一关。真正的通信,还得看网络层。这一层要是出问题,设备就是个“睁眼瞎”——能看到路,但不知道往哪走。

核心观点:WiFi连接成功 ≠ 网络可用。DHCP、IP、DNS、网关,这四个环节任何一个断了,设备都无法正常通信。

4.1 DHCP获取失败——设备拿不到“身份证”

设备连上WiFi后,第一件事就是发DHCP Discover广播,去找路由器要个IP地址。如果这一步卡住了,设备会一直停留在“获取IP中”的状态。

常见原因

  • DHCP地址池耗尽:家里或工地上设备太多,IP不够分。我见过一个仓库,200多个传感器挤在一个/24网段里,新设备死活拿不到地址。
  • DHCP服务未开启:有些路由器默认关闭了DHCP,或者被误操作关了。
  • STA端DHCP客户端异常:设备本身的DHCP协议栈有bug,或者被某些低功耗模式卡住了。
  • VLAN隔离:企业网络里,AP和DHCP服务器不在同一个VLAN,广播透传不过去。

排查技巧:抓包看WiFi接口。如果看到设备反复发DHCP Discover,但没有任何Offer回应,基本就是服务端的问题。如果收到了Offer但没发Request,那就是设备端的问题。

我常用的排查步骤

  1. 先看路由器后台,确认DHCP地址池还有空余。
  2. 在设备上手动配置一个静态IP,看能不能ping通网关。如果能通,基本锁定是DHCP的问题。
  3. 检查DHCP报文交互。我习惯用Wireshark抓个几十秒的包,过滤条件写 bootp 或 dhcp。
# 在Linux设备上手动触发DHCP续租
udhcpc -i wlan0 -b -x hostname:my_device

# 查看当前DHCP租约文件
cat /var/lib/dhcp/dhclient.leases

4.2 IP地址冲突——两个设备抢同一个“门牌号”

IP冲突是个老问题,但在物联网场景里特别常见。尤其是那些没有做地址检测的廉价模组,一上电就抢地址。

为什么会这样?有些设备在断线重连后,会直接使用上次保存的IP地址,而那个地址可能已经被别的设备占用了。

注意:IP冲突不会导致WiFi断开,但会导致网络时通时断。设备可能上一秒还能ping通,下一秒就超时了。这种“间歇性抽风”最难排查。

如何确认是IP冲突

  • 在PC上ping目标IP,同时用 arp -a 看MAC地址。如果MAC地址来回变,那就是冲突了。
  • 在路由器后台看DHCP租约列表,找有没有重复的IP。
  • 抓包看ARP应答。正常情况下一个IP只有一个ARP回复,如果有两个不同的MAC回复同一个IP,那就是冲突。
# 在设备端主动检测IP冲突(Linux)
arping -D -I wlan0 -c 3 192.168.1.100

# 如果返回0表示地址可用,返回1表示冲突

我记得有一次在智能家居项目里,20个灯控面板同时上电,结果有3个面板抢到了同一个IP。现场测试时怎么按都没反应,查了半天才发现是IP冲突。从那以后,我要求所有模组上电后必须先发ARP探测,确认地址没人用才敢用。

4.3 DNS解析异常——知道门牌号,但不知道门在哪

设备拿到了IP,也能ping通网关,但就是连不上服务器。这时候十有八九是DNS出了问题。

说白了,DNS就是把域名翻译成IP地址的“电话本”。电话本丢了,你就算有电话也打不出去。

典型表现

  • ping IP地址能通,但ping域名不通。
  • 设备日志里出现 DNS resolution failed 或 getaddrinfo error。
  • APP显示“正在连接”,然后超时。

常见根因

问题类型 具体表现 排查方法
DNS服务器不可达 设备配置的DNS服务器IP是错的,或者服务器挂了 用 nslookup 或 dig 测试
DNS缓存污染 路由器或设备本地缓存了错误的解析结果 清空缓存后重试
域名未注册/过期 服务器域名本身解析失败 在PC上直接解析确认
MTU导致DNS报文被丢弃 DNS over TCP时,大报文被分片后丢失 调整MTU或改用EDNS0

我的习惯:在设备固件里内置一个“DNS诊断”功能。长按某个按键,设备就会依次ping 8.8.8.8、解析 baidu.com、解析自己的服务器域名。这样现场人员不用抓包也能快速定位。

4.4 网关不可达——出了门,发现路是断的

网关是设备离开本地网络的“大门”。如果网关不可达,设备只能和局域网里的设备通信,出不去。

你想想看,设备拿到了IP,知道了DNS,但就是找不到网关。这就像你有了身份证、有了电话本,但家门口的路被挖断了。

网关不可达的几种情况

  • 网关IP配置错误:设备手动配置了错误的网关地址。
  • 网关设备宕机:路由器死机了,或者被重启了。
  • 路由表缺失:设备没有默认路由,不知道把包往哪发。
  • ARP解析失败:设备发ARP问网关的MAC地址,但没人回应。
# 查看设备的默认路由
route -n
# 或者
ip route show

# 手动添加默认路由
route add default gw 192.168.1.1

我在项目中遇到过一种情况:设备能ping通网关的IP,但就是上不了外网。后来发现是网关设备本身的路由表坏了,它自己都出不去。这种情况,你查设备端是查不出问题的,必须登录到网关上看。

避坑指南:我曾经在批量部署时,发现一批设备全都连不上服务器。排查到最后,发现是网关设备的NAT表满了。几百个设备同时发起连接,网关的NAT转换不过来,直接把新连接丢了。所以,网关的并发能力一定要提前评估。

4.5 网络层问题排查流程图

下面这张图是我自己总结的排查思路。遇到网络层问题,按这个流程走一遍,基本能定位到根因。

网络层问题排查流程图 设备无法上网 能否 ping 通网关? 否 检查IP配置 检查默认路由 是 检查DNS解析 ping域名测试 检查ARP表 检查DHCP租约 检查DNS服务器 检查域名有效性 检查网关NAT/路由表 定位到根因,修复 提示:每一步都要先确认“设备本身配置是否正确”,再排查“网络基础设施”

4.6 综合排查清单

最后,我整理了一份快速排查清单。现场遇到问题,按这个顺序查一遍,能省下不少时间。

步骤 检查项 命令/方法 预期结果
1 IP地址是否有效 ifconfig 或 ip addr 地址不是169.254.x.x(APIPA)
2 默认路由是否存在 route -n 有0.0.0.0的条目
3 网关是否可达 ping 网关IP 收到回复
4 DNS是否可用 nslookup 域名 返回正确IP
5 外网是否可达 ping 8.8.8.8 收到回复
6 服务器域名解析 ping 服务器域名 收到回复

嗯,网络层的问题说复杂也复杂,说简单也简单。你只要记住一句话:IP是地址,网关是门,DNS是电话本。哪个环节断了,就修哪个环节。别一上来就怀疑模组坏了,先看看这些基础配置对不对。