1. Current Location: Home >  Router Encyclopedia >  WiFi连上了却提示无法上网?手机靠偷偷访问一个网址来判断,我把苹果小米华为的探针挨个试了

WiFi连上了却提示无法上网?手机靠偷偷访问一个网址来判断,我把苹果小米华为的探针挨个试了

手机网络探针机制:204、302、超时三种回话判定WiFi有没有网,各家探针地址实测表

在商场连WiFi,输密码之前登录页自己就弹出来了,谁通知手机的?反过来,我妈家路由器好好的,她手机偏在WiFi图标上挂个叹号。这两件看着不相干的事,背后是同一套机制:手机判断有没有网,靠的是偷偷访问一个网址。

手机判断有没有网,不是ping,是访问一个网址

手机连上WiFi后,系统在后台干的头几件事里就有这一件:访问一个固定的探测网址,行话叫网络连通性检测。之后隔三差五还会再探。全程不用你点任何东西,通知栏那句「已连接,无法上网」、自动弹出来的登录页,全是探针的结论。

为什么不用我之前写过的ping?ping走的是ICMP,不少网关和防火墙压根不回这个协议的包,而且ping通了也不代表网页打得开。探针直接走HTTP,能不能真拉到一个回应,才是「有网」的真人标准。

还有个细节:手机对每个网络是分开记账的,WiFi一个结论、蜂窝一个结论,互不覆盖。系统就是靠这两本账决定数据走哪条路的——WiFi那本写着「无法上网」,它就敢把流量悄悄挪去4G,这就是有些人明明连着WiFi、话费流量却照跑的原因之一。你在设置里看到的「WLAN无法访问互联网」开关,管的就是这个行为。

更讲究的是探针期望的回话。安卓那套期望拿到一个204,意思是「服务器收到了,没内容给你」——回话是空的,才说明这条路上没人动手脚。204这个状态码我在状态码那篇里写过,它在这里是主角。只要回话跟预期对不上,手机立刻明白:这网不对劲。

各家的探针地址,我挨个访问了一遍

每个阵营的探测地址都不一样。我拿curl一个个敲过去,回话全部对上号:

阵营探测地址我实测的回话
苹果captive.apple.com/hotspot-detect.html200,正文就一个Success
谷歌原生安卓connectivitycheck.gstatic.com/generate_204204,零字节
小米/红米connect.rom.miui.com/generate_204204,零字节
华为/荣耀connectivitycheck.platform.hicloud.com/generate_204204,零字节
vivowifi.vivo.com.cn/generate_204204,零字节
Windowswww.msftconnecttest.com/connecttest.txt200,正文Microsoft Connect Test

苹果要的不是204,是200加正文里那个Success,它还备了个地址兜底,我这边也实测能通。Windows最啰嗦,除了拉那个txt,还要解析一个专用域名dns.msftncsi.com,我查出来是131.107.255.255,能解析到这个地址,DNS这关才算过。

为什么国行厂商都要换成自家地址?谷歌那个探测地址在国内部分网络时通时不通,原生安卓连上WiFi就常年挂叹号,可网明明是好的。小米、华为干脆把探针换成自家服务器,一劳永逸。反过来,水货机或者刷了谷歌服务的机器,在国内最容易中这个招。

顺带说一个反直觉的点:这些探测地址全是http开头的明文,不是https。不是厂商偷懒,是故意的。门户网关要拦的就是这个请求,好把302塞给你;探测请求要是加了密,网关拦不动、塞不进跳转,手机反而探测不出「需要登录」这件事。换句话说,探针天生就得走那条能被人动手脚的路,动手脚本身也是信号。这些地址在系统里普通用户改不了,也不值得改。

204、302、超时,三种回话三种命运

光看地址不过瘾,我在电脑上用python起了个假网关,十几行代码的事,然后拿curl当手机,把三种回话各模拟了一遍。

场景A,探针回204:手机判定有网,安静,什么都不提示。场景B,探针回302,Location指向一个登录页:手机判定「这家WiFi需要认证」,自动弹出迷你浏览器跳到那个地址——商场WiFi的登录页自己蹦出来,就是这么来的。第三种,探针发出去石沉大海:手机判定无法上网,图标挂叹号,安卓还可能悄悄把流量切回蜂窝。

假网关的回话我原样抄在这,你感受一下手机看到的东西:

场景A:HTTP/1.0 204 No Content(回话到此为止,一个字节正文都没有)

场景B:HTTP/1.0 302 Found Location: http://192.168.10.1/login?redirect=1

场景A那行就是「网是干净的」;场景B那行里的Location,就是登录页自动弹出来的落点。手机不需要看懂网页内容,光看这两行回话的开头,结论就下了。这套「关起来等认证」的门户机制,英文行话叫captive portal, captive是「被俘虏」的意思——你连是连上了,但还没放你出去。

整条判定链全是明文HTTP在跑,这也是后面自救招数能成立的根子。

三种误报,每一种我都碰到过

误报一,探针够不着,网是好的。谷歌探针被卡住,手机挂叹号,可微信刷得飞起。这跟「ping不通却不耽误上网」是同款道理:探针只代表探针那一条路,不代表整个网络。我见过最典型的一台水货平板,连家里WiFi常年叹号,用了半年主人才发现不是网的事——除了那个图标,一切正常。

误报二,探针被劫持,反复弹「需要登录」。DNS被抢答,或者门户网关把探针的请求302到自家广告页,手机一看有跳转,认定你要认证,登录页关了又弹。解析这条路被动手脚,通常得从DNS查起,我写过电信侧被抢答的排查,思路通用。

误报三,手机开着流量,认证页死活不弹。大学宿舍那篇里写过这坑:蜂窝优先,探针从4G出去百分百成功,系统觉得网好好的,就不给你弹WiFi的登录页。连商场、酒店WiFi前,先把流量关了。

家里也有对应版本:光猫欠费停网,或者宽带整条断了,路由器再正常,手机照样叹号——锅在上游,跟WiFi这半毛钱关系没有。

路由器后台那个「外网已连接」,也是同一招

有意思的是,路由器判断自己WAN口通不通,逻辑跟手机探针一模一样:往外发探测,通了才在后台显示「已连接,可上网」。所以手机挂叹号但路由器说外网正常,问题出在路由器到手机这一段;两边都报断,直接查上游。

配合状态页WAN口IP的三层判读一起用,两分钟能把故障段锁死,不用瞎重启。

遇到误报,三招自救

认证页不弹的:浏览器手动敲一个http开头的网址,随便哪个老网站都行。别敲https的,网关劫持不了加密流量,那把锁一上它拦不住你,登录页自然弹不出来。被拦下时会自动跳到认证页;嫌挑网址麻烦,直接敲captive.apple.com也行。

挂叹号但感觉网是好的:先开个网页试试,真能用就别理那个叹号,它只代表探针那一条路。反复弹「需要登录」的:查DNS是不是被改被抢答,值得上的就换加密DNS,抢答那套对加密流量使不上劲。

手机提示真实含义先做什么
无法上网(叹号)探针没拿到204先开个网页,能用就无视;不能用查上游
需要登录/认证探针被302了关流量,浏览器敲http网址触发登录页
反复弹登录页探针一直被劫持查DNS被改被抢答,考虑加密DNS

收尾给个顺序:看到叹号先开网页验证,再手动触发认证页,末了才轮到查DNS和上游。手机那句「无法上网」,从今天起你可以当成探针的转述来听——它说的不一定是实话,但三种回话对应三种病,按表抓药就行。顺带把这事讲给家里老人听也有用:挂叹号不等于欠费,更不等于路由器坏了,先拿浏览器开个网页,十秒钟省一趟爬弱电箱。

Read More


Copyright Notice Scan to read on mobile
All Rights Reserved: 《SHUNOT》 => 《WiFi连上了却提示无法上网?手机靠偷偷访问一个网址来判断,我把苹果小米华为的探针挨个试了》
Article URL: https://www.shunot.com/en/lybk/1215.html
Unless otherwise stated, all articles are original by 《SHUNOT》. Reposting is welcome! Please indicate the original URL when reposting, thank you.

Contact Us

Online Consultation: Click here to send me a message

WeChat ID: master_135

Scan to follow