Windows 10 不会将 Wi-Fi 检测为按流量计费的连接

fil*_*nic 5 wireless-networking 802.11 wifi-configuration windows-10

我希望 Windows Wi-Fi 客户端将无线连接检测为按流量计费的连接。\n我发现 802.11 协议支持供应商特定的信息元素 (IE)。这些 IE 被注入到信标和探测响应无线帧中。

\n

我发现 Microsoft 定义了自己的特定于供应商的 IE,以通知客户端有关通过 Wi-Fi 计量的连接(网络成本元素),并且我的接入点的hostapd支持特定于供应商的功能。

\n

根据(Network Cost Element)的文档,我将供应商特定字段添加到hostapd )的文档,我在我的 OpenWRT 路由器上

\n
0xDD (Vendor-specific record)\n0x08 (Record length : 8 bytes)\n0x00 0x50 0xF2 (Vendor: Microsoft)\n0x11 (OUI Type: Network Cost)\n0x00 0x00 0x00 0x02 (Portable Hotspot Default: Metered network; limit unknown or not yet reached; matches Windows default for mobile broadband connections.)\n
Run Code Online (Sandbox Code Playgroud)\n

hostapd 关于 openwrt 命令:

\n
ubus call hostapd.wlan24 set_vendor_elements \'{"vendor_elements": "dd080050f21100000002"}\'\nubus call hostapd.wlan24 update_beacon \n
Run Code Online (Sandbox Code Playgroud)\n

使用CommView捕获无线流量,并在探测响应信标帧中看到我向 hostapd 提供的数据(最后 10 个字节)。

\n
0x0000   80 00 00 00 FF FF FF FF-FF FF XX XX XX XX XX XX   \xe2\x82\xac...\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbfXXXXXX\n0x0010   EC 41 18 50 A7 35 00 8E-99 81 50 23 98 00 00 00   \xc3\xacA.P\xc2\xa75.\xc5\xbd\xe2\x84\xa2.P#\xcb\x9c...\n0x0020   64 00 31 04 00 1B YY YY-YY YY YY YY YY YY YY YY   d.1...YYYYYYYYYY\n0x0030   YY YY YY YY YY YY YY YY-YY YY YY YY YY YY YY YY   YYYYYYYYYYYYYYYY\n0x0040   XX 01 08 82 84 8B 96 0C-12 18 24 03 01 0B 05 04   Y..\xe2\x80\x9a\xe2\x80\x9e\xe2\x80\xb9\xe2\x80\x93...$.....\n0x0050   00 02 00 00 2A 01 00 32-04 30 48 60 6C 30 14 01   ....*..2.0H`l0..\n0x0060   00 00 0F AC 04 01 00 00-0F AC 04 01 00 00 0F AC   ...\xc2\xac.....\xc2\xac.....\xc2\xac\n0x0070   02 0C 00 0B 05 04 00 08-00 00 3B 02 51 00 2D 1A   ..........;.Q.-.\n0x0080   EC 01 17 FF FF 00 00 00-00 00 00 00 00 00 00 01   \xc3\xac..\xc3\xbf\xc3\xbf...........\n0x0090   00 00 00 00 00 00 00 00-00 00 3D 16 0B 00 04 00   ..........=.....\n0x00A0   00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................\n0x00B0   00 00 7F 08 04 00 00 00-00 00 01 40 DD 18 00 50   ...........@\xc3\x9d..P\n0x00C0   F2 02 01 01 01 00 03 A4-00 00 27 A4 00 00 42 43   \xc3\xb2......\xc2\xa4..\'\xc2\xa4..BC\n0x00D0   5E 00 62 32 2F 00 DD 08-00 50 F2 11 00 00 00 02   ^.b2/.\xc3\x9d..P\xc3\xb2.....\n
Run Code Online (Sandbox Code Playgroud)\n

我连接到此 AP,并检查在 Windows PC 上使用 MS Powershell 是否对连接进行计量:

\n
[void][Windows.Networking.Connectivity.NetworkInformation, Windows, ContentType = WindowsRuntime]\n[Windows.Networking.Connectivity.NetworkInformation]::GetInternetConnectionProfile().GetConnectionCost()\n
Run Code Online (Sandbox Code Playgroud)\n

并得到回应

\n
ApproachingDataLimit          : False\nNetworkCostType               : Unrestricted\nOverDataLimit                 : False\nRoaming                       : False\nBackgroundDataUsageRestricted : False\n
Run Code Online (Sandbox Code Playgroud)\n

哪里NetworkCostTypeUnrestrictedorUnknown而不是预期的Fixed

\n

当我在 Windows PC 上手动设置此连接按计量时,powershell 说NetworkCostType : Fixed

\n
\n

一段时间后,我发现另一个 AP(不是我的,隐藏的)正在广播信标。\n在这些信标中,我发现相同的供应商特定扩展的长度0x11Microsoft16 字节,并且是

\n
DD 10 00 50 F2 11 | 01 10 02 28 2C 30 00 00 00 01 00 00\nor\nDD 10 00 50 F2 11 | 01 10 02 28 2C 30 00 00 00 00 00 00 (deffers 3rd byte from the end)\n\n0x0000   80 00 00 00 FF FF FF FF-FF FF 62 45 BD 07 36 9A   \xe2\x82\xac...\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbfbE\xc2\xbd.6\xc5\xa1\n0x0010   62 45 BD 07 36 9A 80 71-87 80 70 00 00 00 00 00   bE\xc2\xbd.6\xc5\xa1\xe2\x82\xacq\xe2\x80\xa1\xe2\x82\xacp.....\n0x0020   64 00 31 C6 00 00 DD 10-00 50 F2 11 01 10 02 28   d.1\xc3\x86..\xc3\x9d..P\xc3\xb2....(\n0x0030   2C 30 00 00 00 01 00 00-                          ,0......\n---\n0x0000   80 00 00 00 FF FF FF FF-FF FF 62 45 BD 07 36 9A   \xe2\x82\xac...\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbf\xc3\xbfbE\xc2\xbd.6\xc5\xa1\n0x0010   62 45 BD 07 36 9A D0 B4-16 FE 38 03 00 00 00 00   bE\xc2\xbd.6\xc5\xa1\xc3\x90\xc2\xb4.\xc3\xbe8.....\n0x0020   64 00 31 C6 00 00 DD 10-00 50 F2 11 01 10 02 28   d.1\xc3\x86..\xc3\x9d..P\xc3\xb2....(\n0x0030   2C 30 00 00 00 00 00 00-                          ,0......\n
Run Code Online (Sandbox Code Playgroud)\n

我发现OUI 0x11Vendor 0x00 0x50 0xF2是相同的 - 也许 MS Docs 是错误的?\n我在我的接入点上尝试了相同的操作,结果相同 - 数据位于无线帧中,但 Windows 10 不会将连接设置为按流量计费。

\n

有帮助吗?\n也许我在某个地方犯了错误?\n也许它依赖于无线驱动程序?\n也许微软有文档,但没有在桌面系统中实现它?

\n
\n

手动设置Metered connection不是我想要解决这个问题的方式。

\n

fil*_*nic 3

  1. MS Docs中有一个错误:正确的数据包是 哪里是,是DD080050F211??00**00??Cost Level**Cost Flags

成本水平:

  • 00 Unknown - 连接成本未知。
  • 01 Unrestricted- 连接不受限制,并且具有不受限制的使用限制。
  • 02 Fixed - 使用量计入用户已付费(或同意付费)的固定数据分配。
  • 04 Variable - 连接成本以每个字节为基础。

成本标志:

  • 00 Unknown - 用途未知或不受限制。
  • 01 Over Data Limit - 使用量超出了计费网络的数据限制;可能适用不同的网络成本或条件。
  • 02 Congested - 网络运营商正在经历或预期出现重负载。
  • 04 Roaming - 共享连接在提供商的本地网络或附属网络之外漫游。
  • 08 Approaching Data Limit- 使用量接近计量网络的数据限制;一旦达到限制,可能会应用不同的网络成本或条件。

正确的 MS 文档 MS-NCT


  1. 似乎当您手动触发开关时Metered connection,Windows 会忽略 802.11 IE,直到您忘记网络(或者可能没有)。

对于 OpenWRT 接入点,我的史诗问题导致了 4 个命令

uci add_list wireless.radio0.hostapd_options='vendor_elements=DD080050F21102000200'
uci add_list wireless.radio1.hostapd_options='vendor_elements=DD080050F21102000200'
uci commit
reboot
Run Code Online (Sandbox Code Playgroud)

我添加了Fixed带有标志的成本级别Congested。不知道拥堵有没有影响。

hostapd_options是 /etc/config/wireless (或 )中未记录的参数uci radio?.hostapd_options但自 2017 年以来就存在