ARTICLE DETAIL

资讯详情

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

低版本安卓WiFi已连接但无法访问互联网排查与修复

低版本安卓WiFi已连接但无法访问互联网排查与修复 安卓手机连上 WiFi状态栏老老实实显示已连接但点开浏览器转圈圈下拉通知栏看到已连接但无法访问互联网——这个提示在低版本安卓上出现得尤其频繁。很多人第一反应是把 IP 设置从 DHCP 改成静态 IP结果填完发现该不通还是不通甚至原来的 WiFi 都连不上了。这个问题的坑点在于已连接但无法访问互联网并不等于你的网络坏了它只是安卓系统在做一次后台探测之后给出的结论而这个结论在低版本安卓上误报率相当高。这篇内容我会把这句话背后的机制、静态 IP 为什么救不了它、以及几套实测有效的处理手法完整拆开讲从手机侧、路由器侧两条线同时排查。适合手里压着几台老安卓设备的人、做智能硬件和安卓开发调试的人以及被这个提示反复折磨想彻底搞清楚原理的人。1. 先把已连接但无法访问互联网这句话拆开看1.1 安卓连上 WiFi 之后偷偷做了什么很多人以为 WiFi 图标变成实心、显示已连接就代表网络已经可用了。实际上安卓在完成 802.11 关联、四次握手、DHCP 拿到地址这一整套流程之后还会额外做一件事连通性探测Captive Portal Detection。这个动作在系统底层是自动跑的用户看不到但它决定了状态栏那行字的最终结论。具体流程是这样手机连上 WiFi 并拿到 IP 之后系统会向一个出厂时就烧在 ROM 里的固定探测地址发起 HTTP 或 HTTPS 请求通常期望对方返回一个204 No Content的空响应。返回 204系统就认定这条链路是通的可以上网返回 200 并带一个网页系统判定为这是一个需要门户认证的网络于是弹出登录页如果请求超时、连接被重置、DNS 解析失败系统就打出那句经典的已连接但无法访问互联网。关键在于这个探测地址是写死的从 Android 5.0 开始引入这套机制之后很多年里用户都没有办法在设置界面里改它。你能改的只有 WiFi 密码、IP 获取方式、代理这些表层参数探测地址本身藏在Settings.Global里普通设置界面根本不暴露。这就解释了为什么你改了半天 IP 设置那个提示纹丝不动——你改的和系统报错的那件事压根不是一个环节。1.2 为什么低版本安卓特别容易被这句话卡住高版本安卓大致 Android 10 之后在这方面做了不少改进探测地址可以通过开发者选项或者私有 DNS 间接绕开、有多个探测目标可以轮询、对 IPv6 和 IPv4 的处理也更成熟。但低版本安卓Android 7、8、9 这一批尤其国内定制 ROM的探测逻辑非常一根筋——只认那一个地址一次失败就下结论不做重试也不做降级。于是就会出现这些场景你家路由器能正常上网电脑手机都刷得飞起但某台老安卓就是显示无法访问互联网公司内网做了出口限制禁止访问某些境外域名老安卓探测请求被拦直接报错运营商宽带在高峰期 DNS 响应慢了几百毫秒探测请求超时老安卓立刻判定断网。这些情况里网络本身都是好的问题出在考试题目上——系统拿一道它自己出的题去考网络网络答不上来系统就说网络不行。还有一个容易被忽略的点低版本安卓对WPA3 加密、802.11axWiFi 6模式、802.11r 快速漫游这些新特性的兼容性很差。新路由器默认往往开的是WPA2/WPA3 混合模式老设备能关联上但密钥协商或者数据通路会出现异常表现出来就是连上了但数据发不出去。这跟 IP 设置完全无关改静态 IP 自然没用。1.3 三种截然不同的故障处理思路完全不一样在动手之前你必须先分清自己遇到的是哪一类否则就是在瞎试。我把这类现象归成三种故障类型典型表现根本原因处理方向真断网所有设备都上不了网宽带、光猫、路由器出口故障修网络跟手机无关误报型只有老安卓提示实际浏览器能上网探测请求被拦或超时改探测地址或关闭检测半通型手机连上了网页打不开、App 转圈DNS、IPv6、加密方式、MTU 异常从路由器参数和手机网络栈入手区分方法很简单打开手机浏览器直接输入一个纯 IP 的网址试试。能打开说明链路是通的属于误报型打不开再换一台电脑连同一个 WiFi 试电脑也不行就是真断网电脑行、手机不行就是半通型。这三类的处理路径完全不同先定性再动手能省掉大半个小时的无用功。提醒不要一上来就改 IP 设置。静态 IP 是给DHCP 分配异常这种特定场景准备的对探测失败、加密协商异常、DNS 故障统统无效改完只会引入新的变量。2. 十分钟定位你的问题到底卡在哪一层2.1 手机侧一眼判断真断还是误报网络排查最忌讳的就是凭感觉。老安卓给的信息其实不少只是藏得深。最直接的一招是借道 adb把系统当前的网络状态和探测结果拉出来看。先在电脑上装好 adb 工具安卓 SDK 里的 platform-tools 就行手机开开发者选项、打开 USB 调试数据线连上电脑然后执行adb devices adb shell dumpsys connectivitydumpsys connectivity的输出会比较长重点看里面NetworkAgentInfo相关的段落会有一行类似VALIDATION_STATUS的字段。这个字段就是系统探测的结论显示valid说明探测通过了显示not valid或者captive portal就是探测失败或者被判定成门户网络。这一步的价值在于你可以确认无法访问互联网这个提示到底是不是探测环节报出来的而不是别的模块搞的鬼。如果这台设备权限受限、dumpsys拉不出来有效信息还有个更土但更可靠的办法把 WiFi 关掉用手机流量开个热点让这台老安卓连你自己的热点。如果连热点一切正常说明手机的网络栈没问题锅在原来的那个 WiFi 上如果连热点也提示无法访问互联网那问题多半出在手机系统本身时间不对、系统组件损坏、装了某个抓包或者改网络的 App 把网络栈搞乱了。2.2 对照实验借一台设备把责任划清楚排查网络问题对照实验的价值怎么强调都不为过。我的固定套路是拿一台笔记本或者一台高版本安卓手机连同一个 WiFi做三件事。第一件访问任意一个网页确认基本连通性。第二件打开命令行敲ping 223.5.5.5看丢包和延迟。第三件敲nslookup www.baidu.com 223.5.5.5Windows 用nslookupmacOS 和 Linux 直接nslookup或dig确认 DNS 解析是否正常。这三件事的结果组合起来能把问题定得非常准ping 通、网页能开 → 网络完全正常老安卓就是误报去改探测设置。ping 通、但网页打不开、域名解析失败 → DNS 故障重点查 DNS。ping 不通、延迟极高或者大量丢包 → 链路质量问题查路由器、查信道干扰、查是不是有人在跑满带宽。连 IP 都 ping 不通 → 局域网层就断了查 DHCP、查网关、查 AP 隔离。我遇到过最典型的一次是一台会议室路由器被人开了客户端隔离AP Isolation所有设备能连上、能拿到 IP但互相之间和到网关的通信被阻断表现就是全会议室的人开会时都上不了网。这种情况在手机上怎么看都像网络故障只有做对照实验、从多个设备复现才能锁定是路由器配置问题。2.3 路由器侧的三个必查项在动手机之前先花两分钟把路由器这三项确认一遍能排掉一大半的问题。第一项DHCP 地址池是否耗尽。登录路由器管理页一般是 192.168.1.1 或者 192.168.0.1找到 DHCP 设置看地址池范围和使用数量。地址池给个 192.168.1.100 到 192.168.1.199 只有 100 个地址家里智能设备一多很容易被占满占满之后新设备虽然能关联上 WiFi但拿不到 IP自然通不了。把地址池放宽到 100 到 250 基本就够用了。第二项DNS 服务器填的是什么。很多路由器 WAN 口设置里 DNS 是自动获取运营商下发的 DNS 有时候响应质量很差。建议手动指定成公共 DNS比如主 DNS 填223.5.5.5备用填114.114.114.114。这一步对解决半通型故障帮助极大而且改了之后所有连这个 WiFi 的设备都受益。第三项无线加密方式和频段。这是老安卓的重灾区下一节会详细讲但你现在就可以去看一眼加密方式是不是选成了 WPA3 或者 WPA2/WPA3 混合2.4G 和 5G 是不是开了双频合一同一个 SSID。3. 静态IP为什么改了也没用3.1 静态IP填错的四个高发点位先把一个事实说清楚静态 IP 本身不是用来解决无法访问互联网的。它的作用是在 DHCP 分配异常、需要固定地址做端口映射、设备需要被稳定寻址这些场景下提供确定性。把它当成万能药本身就是方向错了。但既然很多人已经改到这一步了那就把静态 IP 填写的坑一次讲透。安卓上手动配置静态 IP 需要填四个字段任何一个填错都会导致连上了但没网字段常见错误正确做法IP 地址填了网关地址、填了广播地址选一个和路由器同网段且不在 DHCP 池里的地址网关照抄 IP 地址必须填路由器的 LAN 口地址通常 xxx.xxx.xxx.1子网掩码填成 24 或者 /24安卓要填点分十进制即 255.255.255.0DNS留空或者只填一个至少填两个如 223.5.5.5 和 114.114.114.114最容易翻车的是 DNS 这一栏。安卓在 DHCP 模式下会自动从路由器拿到 DNS但切到静态模式后系统不会去问路由器完全是用户填什么就是什么。很多人只填了 IP、网关、掩码DNS 空着结果就是 IP 层通、域名解析全挂表现出来就是已连接但无法访问互联网甚至会让人误以为是探测报错。另外注意子网掩码这一栏安卓的输入框要的是255.255.255.0这种点分十进制写法你填24系统是不认的会直接导致网络配置不生效。这个小细节坑过不少人。3.2 IP冲突与DHCP地址池的隐形撞车这是静态 IP 最隐蔽的一个坑你手填的 IP可能正好落在路由器的 DHCP 地址池范围内被路由器分配给了另一台设备。举个具体例子。路由器地址池是 192.168.1.100 到 192.168.1.199你给老安卓手填了 192.168.1.105。而家里那台扫地机在你配置之前就已经通过 DHCP 拿到了 192.168.1.105租期还没到。于是局域网里出现两个设备抢同一个 IP表现就是两台设备网络都时好时坏、频繁掉线、有时候能上有时候不能上。这种情况极其难查因为谁也没报错就是不稳定。规避办法很明确静态 IP 要选在 DHCP 地址池之外。比如地址池是 100 到 199那你就手工分配 50 到 99 这个段或者 200 到 250 这个段避开地址池。更稳妥的做法是在路由器的DHCP 静态分配有的叫地址保留、IP-MAC 绑定里用设备的 MAC 地址做一个固定绑定这样设备还是用 DHCP但每次拿到的都是同一个地址既避免了冲突又实现了固定寻址比在手机上手填省心得多。3.3 静态IP管不到的那些层回到最初的问题。改静态 IP 之所以解决不了已连接但无法访问互联网是因为这个提示的产生环节在 IP 层之上。我们按网络分层捋一遍静态 IP 作用在网络层第三层它管的是你的地址是什么、网关在哪。而无法访问互联网这个判断是系统在应用层第七层发出 HTTP 请求之后得出的结论。中间的传输层、会话层、表示层出任何一个问题静态 IP 都无能为力。具体来说静态 IP 完全管不到这些东西DNS 解析链路、HTTP 探测请求能否发出、TLS 握手是否成功依赖系统时间、路由器的 NAT 转发是否正常、ISP 出口是否被限速或者拦截、无线加密协商是否成功、MTU 是否匹配。这七项里任意一项出问题都会表现为已连接但无法访问互联网而你怎么改 IP 设置都是白费力气。我见过最离谱的一次是一台老平板因为系统时间被重置到了 2015 年导致所有 HTTPS 请求的证书校验全部失败——包括系统那个探测请求。表现就是连上了但无法访问互联网用户折腾了两天 IP 设置和路由器最后发现把时间改成自动同步就立刻好了。所以下一节会专门讲这个。4. 低版本安卓的实操修复方案4.1 用 adb 把探测地址换掉这是针对误报型故障最对症的一招。既然系统是拿一个固定地址去探测的那我们把这个地址换成一个在当前网络环境下能正常响应的地址探测自然就通过了。安卓系统把这几个参数存在Settings.Global表里字段名随着版本演进有过变化。先读一下当前值adb shell settings get global captive_portal_server adb shell settings get global captive_portal_http_url adb shell settings get global captive_portal_https_url adb shell settings get global captive_portal_use_https adb shell settings get global captive_portal_mode低版本大致 Android 5 到 7.0用的是单条的captive_portal_serverAndroid 7.1 之后拆成 HTTP 和 HTTPS 两条Android 9 开始多了captive_portal_use_https开关。读出原值之后建议先记下来方便回滚。改的时候把地址换成一个能返回 204 的探测点。这个地址你在内网可以自己搭一个也可以指向局域网里任意一个会返回空响应的路径。举例adb shell settings put global captive_portal_http_url http://192.168.1.10/generate_204 adb shell settings put global captive_portal_https_url https://192.168.1.10/generate_204 adb shell settings put global captive_portal_use_https 0captive_portal_use_https设成 0 的意思是让系统走 HTTP 而不是 HTTPS这样就不用过证书校验那一关能绕开时间不对导致的证书问题。改完之后把 WiFi 关掉再打开或者干脆重启手机。这一点很重要很多版本不重启不生效改完没反应会让人以为命令没起作用。还有一条命令可以直接关掉整个探测机制adb shell settings put global captive_portal_mode 0注意这个操作和下一节的关闭检测是同一个东西作用只是让系统闭嘴不会让网络真正变通。用之前请务必确认你的网络本身是好的否则只是把报警器拆了火还在烧。4.2 用 adb 把连通性检测关掉以及它的副作用captive_portal_mode这个字段控制的是系统的行为模式取值含义大致是0表示忽略检测结果1表示检测到问题就提示2表示强制跳转到登录页。把它设成0系统就不会再弹出已连接但无法访问互联网这行提示了。这一步我必须把话说重一点关掉检测只是消除提示它不会修复任何真实的网络故障。如果你的网络确实不通关掉之后状态栏会显示一切正常但你依然打不开网页而且失去了系统告诉你网络有问题这个重要信号排查起来反而更麻烦。我的建议是把这个操作当成诊断手段而不是修复手段先关掉检测然后打开浏览器试。如果网页正常打开、App 正常联网说明你的网络本来就是好的那句提示纯属误报问题解决如果关掉之后还是打不开网页说明网络是真的不通这时候应该把检测重新打开转头去查 DNS、路由器、加密方式这些真正的问题点。这样用它才有价值。4.3 时间同步一个最容易被忽略的元凶前面反复提到系统时间会连带影响 HTTPS 探测这里展开说透。HTTPS 请求建立连接时客户端要验证服务器证书的有效期。如果手机系统时间偏离真实时间太多比如差了几个月甚至几年证书校验必然失败连接直接中断系统探测请求就报错最终显示无法访问互联网。老设备时间错误的原因有很多电池完全耗尽导致 RTC 掉电重置、长期没联网导致 NTP 同步没跑过、某些定制 ROM 的 NTP 默认服务器在国外导致同步超时。所以这台手机可能连上 WiFi 了但时间还是错的而时间错又导致探测失败形成一个看起来很矛盾的闭环。处理分两步。第一步在手机设置里把自动确定日期和时间打开时区选对。第二步如果自动同步不管用可以借 adb 手动指定一个靠得住的 NTP 服务器adb shell settings put global ntp_server ntp.aliyun.com改完重启一下系统时间服务。我在实际排查里至少有三次已连接但无法访问互联网最后是靠这行命令解决的而且这三次的共同特征都是设备长时间断电放置过。所以现在我的排查顺序里时间同步已经被我提到了前面因为它检查成本极低、命中率却不低。4.4 DNS 与 IPv6 的收尾处理DNS 这部分安卓在网络设置里能改的地方有限静态 IP 模式下可以手填DHCP 模式下只能依赖路由器下发。所以更彻底的解法是在路由器上把 DNS 固定成公共 DNS前面第 2.3 节已经说了。这里补充一个容易踩的坑部分老旧安卓对 IPv6 的处理有缺陷。在双栈网络环境下系统会优先尝试 IPv6但某些老设备的 IPv6 实现不完整请求发不出去又不及时回退到 IPv4表现出来就是网页一直转圈直到超时。如果你怀疑是这个问题可以在路由器的 DHCP 设置里把 IPv6 关掉或者只下发 IPv4 地址很多时候立刻就好了。判断方法也很直接用浏览器访问一个已知的 IPv4 地址形式的网页。能打开说明 IPv4 链路正常问题大概率在 IPv6 或者 DNS 上打不开就说明底层就不通别在 DNS 上浪费时间。另外还有个小技巧换一个 DNS 权重。如果路由器同时下发了两个 DNS而其中一个有问题安卓在某些版本上不会自动切换会一直卡在坏的那个上。把路由器里的备用 DNS 删掉只留一个或者两个都换成响应快的公共 DNS能规避这个坑。5. 路由器侧的参数调整清单5.1 加密方式与频段老机型的两大杀手这是我处理老安卓联网问题时优先级最高的一项。新路由器出厂默认往往追求最安全加密方式默认选 WPA3 或者 WPA2/WPA3 混合。老安卓基本不支持 WPA3混合模式下它会退到 WPA2 尝试协商但这个协商过程在不规范的路由器固件里经常出问题——表现出来就是能连上、拿得到 IP、但数据通路异常。处理办法进路由器无线设置把加密方式改成WPA2-PSKAES不要用 TKIP也不要开混合模式。改完让手机重新连一次。这个动作我做过很多次成功率很高。另一个杀手是双频合一。开启之后 2.4G 和 5G 共用一个 SSID路由器根据信号强度把设备往某个频段上踢。老安卓的漫游逻辑不完善经常在频段切换时卡住表现出来就是网络时断时续。建议把 2.4G 和 5G 拆成两个不同的 SSID让老设备固定在 2.4G 上。2.4G 虽然慢但穿墙好、兼容性好对老设备最友好。顺带说一句信道。2.4G 只建议用 1、6、11 这三个互不重叠的信道其他信道容易和邻居互相干扰。5G 尽量避开 DFS 信道52 到 64、100 到 144 这些因为这类信道在某些地区需要雷达探测会让设备连接不稳定。5.2 DHCP、AP隔离与代理设置AP 隔离也叫客户端隔离这个功能本来是用在公共 WiFi 场景的防止接入设备互相访问。但很多人配置路由器时不明就里地打开了它结果就是所有设备能连上、能拿 IP但设备之间以及到网关的部分通信被切断。表现就是连上了但上不了网。检查位置一般在无线设置的高级选项里找AP 隔离客户端隔离网络隔离之类的开关确保是关闭状态。代理设置也要看一眼。安卓的 WiFi 高级设置里有个代理默认是无。如果之前有人为了抓包调试改成了手动并填了某个地址而这个代理服务器现在不可用了所有流量都会往那个不存在的代理上撞结果就是连上了但什么都打不开。这个坑我在调试环境里踩过排查了大半天才发现是几个月前留下的代理配置。DHCP 租期也值得调一下。默认租期有些路由器设的是 2 小时甚至更短导致设备频繁续租。如果续租过程出现问题就会出现周期性的无法访问互联网。把租期改成 24 小时或者一周能减少这类抖动。5.3 MTU 与信道的一些经验值MTU 这个问题相对小众但在某些宽带环境下确实会发生。典型场景是宽带用 PPPoE 拨号实际可用 MTU 是 1492 而不是 1500如果路由器没有正确做 MSS 钳制某些数据包会被丢弃表现出来就是小请求能通、大页面打不开——网页能加载出标题但正文一直转圈视频更是完全打不开。路由器 WAN 口设置里一般有 MTU 选项PPPoE 拨号建议设成 1492DHCP 或者静态 IP 接入用默认的 1500。如果不确定可以先设 1400 试试能通就说明是 MTU 问题再往上调到 1492 找最优值。再补充一个经验路由器固件的时间也要对。有些路由器的 DNS 转发或者认证功能依赖正确的时间固件时间错了会导致解析异常。在路由器管理页里把 NTP 同步打开指定一个可用的时间服务器这个小动作能规避不少玄学问题。6. 常见问题速查表与踩坑记录把上面这些内容整理成一张排查表遇到问题按顺序对着查比漫无目的地试要高效得多。现象最可能的原因优先验证动作只有老安卓提示电脑正常探测请求被拦或超时改探测地址或临时关闭检测改静态 IP 后完全连不上 WiFi掩码格式错误或网关填错检查掩码是否为点分十进制局域网内设备时好时坏IP 冲突静态 IP 移出 DHCP 池网页打不开但 ping IP 通DNS 故障路由器手动指定公共 DNS所有 HTTPS 都失败系统时间错误打开自动时间同步新路由器上老设备连不上网WPA3 或双频合一改 WPA2-PSK拆分 SSID网页加载一半卡住MTU 不匹配WAN 口 MTU 设 1492拿得到 IP 但什么都通不了AP 隔离被打开关闭客户端隔离再说几个我在实操里总结出来的经验。第一改动要一次只动一个变量。这听起来是常识但真到着急的时候很多人会同时改 IP、改 DNS、改加密方式、重启路由器最后好了也不知道是哪个起的作用下次再遇到还是不会。我的习惯是改一项、重启 WiFi、测一次、记录下来。第二改设置前先把原值抄下来。尤其是通过 adb 改Settings.Global这种底层参数改完不生效想回滚的时候如果没记原值会很被动。一条settings get就几秒钟的事别省。第三别迷信重启。重启确实能解决很多问题因为它会清掉临时的网络状态但如果根因是配置错误比如加密方式、DNS、IP 冲突重启只能让问题暂时消失过一段时间还会复现。真正解决问题还是要找到根因。第四备一个干净的对照环境。我一直留着一台老路由器配置极简WPA2-PSK、单频 2.4G、DHCP 地址池开得很大、DNS 手动指定公共 DNS。遇到搞不定的设备就把它接上去测一下能通说明是主路由器的问题不能通说明是设备本身的问题。这个二分法能砍掉一半以上的排查时间。第五善用日志而不是猜。安卓的adb logcat里会打网络状态变化和探测结果的日志用adb logcat | grep -i -E captive|connectivity|dns过滤一下能看到系统在什么时候做了什么判断。这比在设置界面里翻来覆去强太多尤其是排查那种过一会儿才好的间歇性问题。7. 最后几句实在话我自己的设备清单里长期躺着几台 Android 7 和 Android 8 的老机器专门用来做兼容性测试这个问题前前后后折腾过几十次。我的体会是已连接但无法访问互联网这句话八成情况下是系统在骗你。它拿一道题去考网络网络答不上来它就下了结论但网络的真实状态可能完全没问题。所以我的固定动作永远是先做对照实验、先分清是真断网还是误报然后再决定往哪个方向动手。顺序反了你就会在 IP 设置这个跟问题毫无关系的环节里绕很久。另外那台老路由器给我省的时间比我买过的任何网络测试工具都值——有这样一台设备在手很多模糊的问题能立刻变成明确的是或否。
返回列表