技术解析

检查是否连接到互联网?求一个优雅的思路
0
2021-06-17 16:50:05
idczone
如题,业务需要程序自检是否能连接到互联网,如果断网需要立即做出反应,要求是反应足够快。

一个简单的想法是每秒访问指定网站,来检测连通性,这样可以规避一些“假连通”的情况,但是稳定提供服务的网站很难找。比如请求百度的话,其实历史上百度也是挂过的,还不止挂过一次。。。

服务器在国内
每次找多个大的网站就行,同时挂的机率可以忽略,除非大灾害

那还有地区性网络故障?
获取本地运营商 DNS,然后 ping ?

你是的历史上百度挂掉是什么时候?

Windows 是通过请求 http://www.msftconnecttest.com/connecttest.txt ,然后判断返回的内容来判断是否联网的。
Android 是先请求 https://www.google.com/generate_204 如果返回的状态码不是 204,则请求 http://connectivitycheck.gstatic.com/generate_204 来检测是否需要登录。

就用楼上那个微软的就很好,那个就是 windows 用的判断方法.
不行就多找几个,谷歌微软苹果百度一起上,通一个就是通了.

只要这个大型网站 SLA 比你的目标高若干个等级就好了,而且一年个位数假警报,应该也算可以接受吧
比较好用的也许是 204

NTP Server

国内 https://connect.rom.miui.com/generate_204

captive.apple.com
全球都可访问(包括中国

内地可以 ping 1.2.4.8

多来几个服务器 有一个能连通就算已连接到互联网

先连腾讯,失败再连淘宝,失败再连百度,三家都出问题的概率应该极低。重点是失败了再测试下一个,这样大部分时间的开销和只连一个是一样的,也就是一家响应就是联网了,三家都不响应才是断网。

1.1.1.1

Google: http://www.gstatic.com/generate_204 / http://maps.google.com/generate_204 / http://mt0.google.com/generate_204 / http://mt1.google.com/generate_204 / http://mt2.google.com/generate_204 / http://mt3.google.com/generate_204 / http://clients3.google.com/generate_204 / ...
V2ex: https://www.v2ex.com/generate_204 (不建议使用,因为只支持 https,不支持 http,连接相对耗费资源,对于 wifi 需要跳转认证的情况支持页不好)
小米: http://connect.rom.miui.com/generate_204
华为: http://connectivitycheck.platform.hicloud.com/generate_204
Vivo: http://wifi.vivo.com.cn/generate_204

一直 ping 8.8.8.8,一段时间内,安丢包率判断网络状态。
运维给出的意见,仅供参考。

http://detectportal.firefox.com/success.txt
注意:
这个网址支持 ipv6,当设备只能访问 ipv6 不能访问 ipv4 的时候,依然会返回 success

pool.ntp.org
今天活跃的服务器有 4228 台

概率论学好,百度历史上挂过,概率多少?
2 个类似百度的大网站呢?概率一乘又是多少

gov.cn

访问 百度 腾讯 新浪 服务器,3 个都挂那么则不能联网

竟然是业务代码,那就应该与自己业务服务器的连通性检测
你通过别的来检测又多大意义,网络是好的,业务服务器挂了——难道也是可用?
做法是越简单越好。连接的异常处理(比如 socket 异常,包括传输或物理连接断开),加上心跳机制
这都是非常通用与成熟的做法

百度的人委托我匿名向楼主求助 百度啥时候挂了?

正确的做法就是 请求自己服务器,接口返回了未知的错误,然后客户端一律提示“网络出问题” (狗头.jpg)

很多人不知道 Cloudflare 也有 captive portal, http 和 https 都行,甚至可以直接用来替代 Android 的 captive portal detection
cp.cloudflare.com

国外不知道,国内的不少应用尤其是大厂,自家服务器连不上就提示你的网络有问题,简直烦死。



我自己经历过的比如有根服务器错误导致百度 DNS 出问题的时候,印象中 14 年左右?

很显然我要确保 general purpose 的连通性,业务可能向各种非自有位置发起网络连接,业务地址也可能有多个,显然维护单一业务服务器连通性是非常不好管理的做法。

看能不能打开百度(手动狗头

就算是春晚,百度搜索首页也是打得开的吧,不是说只是抢红包页面假死和百度手机助手无响应吗,同时一堆 app 应用商城打不开。

如果是自己的服务器呢?要不尝试建立一下 WebSocket 空连接,每秒来个 Ping,反应速度几十 ms 或者 100 多 ms ?

ping Google
-- 通 互联网
-- 不通
-- ping 微软
-- 通 互联网
-- 不通
-- ping 百度
-- 通 局域网
-- 不通
-- ping 京东
-- 通 局域网
-- 不通 没网

搞多几个 dns 随便 ping,也不会大规模下线。

各个平台都有提供网络状态监听的 API 不用?一直 ping 不是很蠢?

服务端标准库都不带这种监听的。要求实时性,还是得业务自己 ping 老弟

qq 自动登陆了的声音

优雅不优雅我不知道... 以前随手写了个凑合用... 反正就是找个几个 DNS 的 IP 连着玩玩, 尽量不产生流量就行了
import socket;socket.create_connection(('114.114.114.114', 53)).close()

我觉得挺好的,经济实惠

downforeveryoneorjustme

https://zh.wikipedia.org/wiki/2010%E5%B9%B4%E7%99%BE%E5%BA%A6%E5%9F%9F%E5%90%8D%E8%A2%AB%E5%8A%AB%E6%8C%81%E4%BA%8B%E4%BB%B6
2010 年百度域名被劫持事件是 2010 年 1 月 12 日针对百度的一次域名劫持事件。当天,中国大陆最大中文搜索引擎公司百度被自称是伊朗网军( Iranian Cyber Army )的黑客组织入侵,导致网民无法正常登陆百度网站达 8 小时。

Google 的弄了这么多 Captive Portal 网址?

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服