在解决问题之前,我们不妨了解一下Windows在每次连接网络之后检测internet连接的原理,大体过程就是访问一个网站下面的一个txt文件,这个txt文件是预先固定写好的,访问之后与系统预制好的内容对比,如果对比无误就显示有Internet连接,否则显示无internet。
在这个大体过程就可以看出,这并不是一个很保险的策略,微软的这个验证服务器,是在境外的,受制于大陆的网络状况,并不能保证随时可用,所以当Windows无法访问这个服务器的时候,不管你有没有网也会显示没有Internet(刷过原生安卓的应该很了解这一问题。)
微软的验证服务器的域名,是www.msftconnecttest.com,访问的文件,是在此网站下的connecttest.txt文件。
在近期的测试中,这个域名指向的IP地址有间歇性的TCP阻断。
所以要想解决这个问题,其实也很简单。
解决方法
既然微软的服务不可用了,那么我们能不能自己提供呢?答案当然是肯定的,因为上文描述的过程中涉及到的网站,txt以及txt的返回内容,在注册表里都是可修改的,我们完全可以把他改成我们自己的。
这些键值的位置,在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet
我们需要管的只有这几项:验证用的网站,txt文件和txt文件返回的内容。
这里当然也有两个小方案,我们可以完全自定义,自己搭建一个web服务,然后网站根目录下保存一个txt文件,里面写上需要验证的内容,保存就可以。然后把自己的域名填写到注册表上去,txt名称和返回值也保持跟自己刚才写的一致。
举个例子,我们完全可以改成这样,只要保证自己搭建的网站可访问并且返回值就可以。
如果不想这么麻烦,我们也可以反向代理微软的www.msftconnecttest.com网站(使用境外的服务器,但最好到国内的网络好一点,否则会出现验证延迟甚至和微软一样无法验证的情况。
然后就只需要改掉验证网站就可以了,其他东西由于还是微软的,所以注册表也要保持与默认一致。
确保可以返回值的方法?直接用浏览器访问这个网站下的这个文件,如果浏览器可以正确显示内容,就可以了。