本文完整阅读约需 11 分钟,如时间较长请考虑收藏后慢慢阅读~

相信有使用过Windows Vista及以上版本系统的读者,一定遇到过连接网络后Windows任务栏上的网络图标出现黄色感叹号的情况,这通常代表尽管已经连接上了局域网,却并没有获得互联网的访问权限,那么微软是通过什么方法来判断我们是否已经连接上网络了呢?

0x01

细心的读者可能会发现,如果连接需要进行网页登录授权的公共WLAN热点,浏览器会自动跳转到http://www.msftconnecttest.com/,然后才显示该热点的登录页面。

当我们手动打开这个网址后,会发现里面有两个文件:connecttest.txtncsi.txt。而这两个文件,就是Windows之所以能够判断我们是否连接网络的关键所在。

0x02

百闻不如一见,我们这就来使用大名鼎鼎的Wireshark对该过程进行抓包!

我们首先关掉所有网络,这个时候Wireshark没有采集到任何数据。

0x03

然后我们尝试连接一个没有互联网访问权限的网络,会发现当连接上这个网络之后,Windows会尝试向http://www.msftconnecttest.com/ 发送一个DNS查询请求,如图所示。

如果所在网络的DNS出现故障,所查询到的A记录结果一定与预期(13.107.4.52)不相同,这个时候Windows就可以知道当前网络的DNS有问题,无法访问到互联网,也就能显示出一个黄色感叹号。

0x04

当DNS查询完毕,确定网络畅通后(一般的WLAN校验网关不会过滤DNS请求),Windows会向以上域名中的connecttest.txt发起一个HTTP GET请求,如图所示。

如果返回的数据与该地址中的文本Microsoft Connect Test完全一致,则确定网络通畅,右下角感叹号消失。

0x05

可是类似于校园网、商店的公共WLAN等需要在浏览器中完成登录流程的网络来说,如何在这一过程中实现唤起浏览器呢?

下图可以很好地解释这一过程。如果这个时候,WLAN网关拦截了HTTP请求,并采用『中间人攻击』(尽管如此形容并不恰当)的方式将页面重定向到其他用于校验的网站,这个时候Windows会很知趣地将返回回来302请求所在的Location在默认浏览器中打开(这也能解释为什么有的PC在连接这一类网络的时候会提示没有能打开www.msftconnecttest.net的方式,因为没有配置默认浏览器)。

弹出浏览器要求进行校验(又称Captive Portal)的方法在Windows、MacOS、Linux、Android、iOS等设备中均有独立实现,方法类似,而近几年也出现了一些新的校验方式,例如返回HTTP状态码511 Network Authentication Required(见RFC6585)、DHCP过程中插入校验流程(见RFC7710)等等。

以下是各客户端进行网络连通性测试与Captive Portal校验的地址(可能不完整):
Android:
– https://www.google.com/generate_204
– http://connectivitycheck.gstatic.com/generate_204
– http://www.google.com/gen_204
– http://play.googleapis.com/generate_204
– https://www.google.com/generate_204
– http://connectivitycheck.gstatic.com/generate_204
– http://www.google.com/gen_204
– http://connectivitycheck.gstatic.com
– http://clients3.google.com
Windows:
– http://www.msftncsi.com/
– http://www.msftncsi.com/ncsi.txt
– http://www.msftconnecttest.com/
– http://www.msftconnecttest.com/connecttest.txt
ChromeOS:
– https://www.chromium.org/chromium-os/chromiumos-design-docs/network-portal-detection
iOS:
– http://captive.apple.com/hotspot-detect.html
MacOS:
– http://www.apple.com/library/test/success.html
– http://captive.apple.com/hotspot-detect.html
Linux(Partly):
– http://start.ubuntu.com/connectivity-check.html
– http://nmcheck.gnome.org/check_network_status.txt

0x06

参考链接:
https://support.microsoft.com/zh-hk/help/4494446/an-internet-explorer-or-edge-window-opens-when-your-computer-connects
https://docs.microsoft.com/en-us/windows-hardware/drivers/mobilebroadband/captive-portals#touchfr