你是否遇到过连上WiFi可以上网,但右下角的图标仍然显示无网络,这使我们十分困扰……

Windows 默认 NCSI 探测机制

在Windows系统中,在有网络连接的情况下,系统会主动连接一个网络文件并校验他的返回值,以此来判断系统是否有网络连接。

👉 http://www.msftconnecttest.com/connecttest.txt

访问该网址,会返回一个22字节的字符串“Microsoft Connect Test”

由此可得,这个NCSI探测机制只是一个普通的http请求,我们在网络良好的情况下是完全可以请求成功的,但在某些环境下,例如公用的Wifi,公司的网络,网络不良的场景,这个请求可能会被防火墙拦截或无法连接,从而导致图标显示“无internet”

解决方法

使用代理

既然我们是可以正常连接网络的,那么只需要处理这个图标问题就很轻松,我们只需要开启tun模式的代理,即虚拟网卡代理。ncsi机制虽然是靠http协议连接,但他默认是直连不走代理,所以我们必须靠tun模式

自建检测端(推荐)

我们不可能无时无刻都开着全局tun模式代理,所以,当我们有一个服务器+域名的时候,我们就能自建国内服务端,代替微软的检测。

首先我们要了解ncsi机制是怎么连接到服务器的。

在注册表中记录着这一切

计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet

这三项就是一开始我提到的网址和校验值,所以我们只需要在自己的服务器中,使用nginx或apache的配置,在网站主页中新建connecttest.txt,内容是Microsoft Connect Test(22字节,不能有多余换行),随后用域名解析到自己的服务器,这个dns解析不可以使用https,因为ncsi不支持。随后我们将自己的域名替换掉注册表中的ActiveWebProbeContent和ActiveWebProbeContentV6。然后重启网卡,ncsi就会自动连接到我们自己的服务器并且校验网络是否连接,在此大功告成。

最喜欢神里绫华啦!