网络接入检测

什么是网络接入?

网络接入是指网络在允许您连接到互联网之前需要您进行操作的网络。此操作可能是使用用户名和密码登录,或者只是接受网络的条款和条件。

网络接入网络可能尝试将您引导到网络接入页面的方式有很多。

  • 始终解析到网络接入服务器 IP 的 DNS 解析器

  • 拦截所有 HTTP 请求并响应 302/307 重定向到网络接入页面的网关

  • 重写所有/特定 HTTP 响应的网关

    • 将其内容更改为网络接入页面的内容

    • 在页面中注入 javascript 或其他内容(某些 ISP 在用户未支付互联网账单时会这样做)

  • 网络接入对 HTTPS 请求的处理方式不同

    • 它们可能会超时。

    • 它们可能会提供错误的证书以重定向到网络接入。

    • 它们可能根本不会被拦截。

实现

CaptivePortalService 控制何时执行检查。使用者可以检查 nsICaptivePortalService 上的状态以确定网络接入的状态。

  • UNKNOWN

    • 尚未执行检查或已超时。

  • NOT_CAPTIVE

    • 未检测到网络接入干扰。

  • UNLOCKED_PORTAL

    • 之前检测到网络接入,但已被用户解锁。此状态可能会导致浏览器增加网络接入检查的频率。

  • LOCKED_PORTAL

    • 检测到网络接入,并且当前无法连接到互联网。

    • 可能会向用户显示 网络接入通知栏

网络接入服务使用 CaptiveDetect.sys.mjs 执行检查,后者又使用 XMLHttpRequest。此请求需要免于 HTTPS 升级、DNS over HTTPS 和许多新的浏览器功能,才能按预期工作。

注意

CaptiveDetect.sys.mjs 可以从使用 rust 或 C++ 重写中获益。这是因为 XMLHttpRequest 的 API 难以区分不同类型的网络错误,例如重定向循环与证书错误。

此外,我们目前不允许进行任何重定向,即使重定向的资源充当透明代理(不修改响应)。这有时会导致使用此类透明代理的用户的网络出现问题。

偏好设置

pref("network.captive-portal-service.enabled", false); // controls if the checking is performed
pref("network.captive-portal-service.minInterval", 60000); // 60 seconds
pref("network.captive-portal-service.maxInterval", 1500000); // 25 minutes
// Every 10 checks, the delay is increased by a factor of 5
pref("network.captive-portal-service.backoffFactor", "5.0");

// The URL used to perform the captive portal checks
pref("captivedetect.canonicalURL", "http://detectportal.firefox.com/canonical.html");
// The response we expect to receive back for the canonical URL
// It contains valid HTML that when loaded in a browser redirects the user
// to a support page explaining captive portals.
pref("captivedetect.canonicalContent", "<meta http-equiv=\"refresh\" content=\"0;url=https://support.mozilla.org/kb/captive-portal\"/>");

// The timeout for each request.
pref("captivedetect.maxWaitingTime", 5000);
// time to retrigger a new request
pref("captivedetect.pollingTime", 3000);
// Number of times to retry the captive portal check if there is an error or timeout.
pref("captivedetect.maxRetryCount", 5);

连接检查

连接检查器可能会使用一些网络接入 URL。请参考 页面以获取更多详细信息。