V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
black11black
V2EX  ›  Linux

检查是否连接到互联网?求一个优雅的思路

  •  
  •   black11black · 342 天前 via Android · 9786 次点击
    这是一个创建于 342 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,业务需要程序自检是否能连接到互联网,如果断网需要立即做出反应,要求是反应足够快。

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

    服务器在国内
    40 条回复    2021-01-10 23:13:06 +08:00
    wwwjfy
        1
    wwwjfy   342 天前   ❤️ 1
    每次找多个大的网站就行,同时挂的机率可以忽略,除非大灾害
    imdong
        2
    imdong   342 天前 via iPhone
    那还有地区性网络故障?
    获取本地运营商 DNS,然后 ping ?
    wd
        3
    wd   342 天前 via iPhone   ❤️ 1
    你是的历史上百度挂掉是什么时候?
    ysc3839
        4
    ysc3839   342 天前 via Android   ❤️ 18
    Windows 是通过请求 http://www.msftconnecttest.com/connecttest.txt ,然后判断返回的内容来判断是否联网的。
    Android 是先请求 https://www.google.com/generate_204 如果返回的状态码不是 204,则请求 http://connectivitycheck.gstatic.com/generate_204 来检测是否需要登录。
    wwbfred
        5
    wwbfred   342 天前   ❤️ 2
    就用楼上那个微软的就很好,那个就是 windows 用的判断方法.
    不行就多找几个,谷歌微软苹果百度一起上,通一个就是通了.
    seki
        6
    seki   342 天前
    只要这个大型网站 SLA 比你的目标高若干个等级就好了,而且一年个位数假警报,应该也算可以接受吧

    比较好用的也许是 204
    iamwho
        7
    iamwho   342 天前
    NTP Server
    AoTmmy
        8
    AoTmmy   342 天前 via Android
    alphatoad
        9
    alphatoad   341 天前
    captive.apple.com
    全球都可访问(包括中国
    input2output
        10
    input2output   341 天前
    内地可以 ping 1.2.4.8
    AllenHua
        11
    AllenHua   341 天前 via iPhone
    多来几个服务器 有一个能连通就算已连接到互联网
    reus
        12
    reus   341 天前 via Android
    先连腾讯,失败再连淘宝,失败再连百度,三家都出问题的概率应该极低。重点是失败了再测试下一个,这样大部分时间的开销和只连一个是一样的,也就是一家响应就是联网了,三家都不响应才是断网。
    aguesuka
        13
    aguesuka   341 天前 via Android   ❤️ 1
    1.1.1.1
    ujued
        15
    ujued   341 天前 via iPhone
    一直 ping 8.8.8.8,一段时间内,安丢包率判断网络状态。

    运维给出的意见,仅供参考。
    Les1ie
        16
    Les1ie   341 天前
    http://detectportal.firefox.com/success.txt

    注意:
    这个网址支持 ipv6,当设备只能访问 ipv6 不能访问 ipv4 的时候,依然会返回 success
    BFDZ
        17
    BFDZ   341 天前
    pool.ntp.org
    今天活跃的服务器有 4228 台
    barrelsoil
        18
    barrelsoil   341 天前 via Android
    概率论学好,百度历史上挂过,概率多少?

    2 个类似百度的大网站呢?概率一乘又是多少
    diggerdu
        19
    diggerdu   341 天前 via iPhone
    m30102
        20
    m30102   341 天前
    访问 百度 腾讯 新浪 服务器,3 个都挂那么则不能联网
    xsen
        21
    xsen   341 天前   ❤️ 2
    竟然是业务代码,那就应该与自己业务服务器的连通性检测
    你通过别的来检测又多大意义,网络是好的,业务服务器挂了——难道也是可用?

    做法是越简单越好。连接的异常处理(比如 socket 异常,包括传输或物理连接断开),加上心跳机制
    这都是非常通用与成熟的做法
    realpg
        22
    realpg   341 天前
    百度的人委托我匿名向楼主求助 百度啥时候挂了?
    lower
        23
    lower   341 天前
    @xsen 正确的做法就是 请求自己服务器,接口返回了未知的错误,然后客户端一律提示“网络出问题” (狗头.jpg)
    skylancer
        24
    skylancer   341 天前
    很多人不知道 Cloudflare 也有 captive portal, http 和 https 都行,甚至可以直接用来替代 Android 的 captive portal detection

    cp.cloudflare.com
    580a388da131
        25
    580a388da131   341 天前
    @lower 国外不知道,国内的不少应用尤其是大厂,自家服务器连不上就提示你的网络有问题,简直烦死。
    black11black
        26
    black11black   341 天前
    @realpg
    @wd
    我自己经历过的比如有根服务器错误导致百度 DNS 出问题的时候,印象中 14 年左右?
    black11black
        27
    black11black   341 天前
    @xsen 很显然我要确保 general purpose 的连通性,业务可能向各种非自有位置发起网络连接,业务地址也可能有多个,显然维护单一业务服务器连通性是非常不好管理的做法。
    yzc27
        28
    yzc27   341 天前 via iPhone   ❤️ 1
    看能不能打开百度(手动狗头
    crella
        29
    crella   341 天前 via Android
    就算是春晚,百度搜索首页也是打得开的吧,不是说只是抢红包页面假死和百度手机助手无响应吗,同时一堆 app 应用商城打不开。
    Windelight
        30
    Windelight   341 天前
    如果是自己的服务器呢?要不尝试建立一下 WebSocket 空连接,每秒来个 Ping,反应速度几十 ms 或者 100 多 ms ?
    jiangzhuo
        31
    jiangzhuo   341 天前
    ping Google
    -- 通 互联网
    -- 不通
    -- ping 微软
    -- 通 互联网
    -- 不通
    -- ping 百度
    -- 通 局域网
    -- 不通
    -- ping 京东
    -- 通 局域网
    -- 不通 没网
    pperlee
        32
    pperlee   341 天前
    搞多几个 dns 随便 ping,也不会大规模下线。
    john6lq
        33
    john6lq   341 天前 via iPhone
    各个平台都有提供网络状态监听的 API 不用?一直 ping 不是很蠢?
    ujued
        34
    ujued   341 天前 via iPhone
    @john6lq 服务端标准库都不带这种监听的。要求实时性,还是得业务自己 ping 老弟
    wangyzj
        35
    wangyzj   341 天前
    qq 自动登陆了的声音
    ClericPy
        36
    ClericPy   341 天前
    优雅不优雅我不知道... 以前随手写了个凑合用... 反正就是找个几个 DNS 的 IP 连着玩玩, 尽量不产生流量就行了

    import socket;socket.create_connection(('114.114.114.114', 53)).close()
    black11black
        37
    black11black   340 天前
    @ClericPy 我觉得挺好的,经济实惠
    pokon548
        38
    pokon548   333 天前
    downforeveryoneorjustme
    whusnoopy
        39
    whusnoopy   136 天前
    @realpg 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 小时。
    bclerdx
        40
    bclerdx   53 天前
    @jinliming2 Google 的弄了这么多 Captive Portal 网址?
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1199 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:26 · PVG 06:26 · LAX 14:26 · JFK 17:26
    ♥ Do have faith in what you're doing.