blob: 44f711641ab0003a76290d7cf901fafed7ef7919 [file] [log] [blame]
<html devsite><head>
<title>概览</title>
<meta name="project_path" value="/_project.yaml"/>
<meta name="book_path" value="/_book.yaml"/>
</head>
<body>
<!--
Copyright 2017 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<p>基于应用/委托的流量使用情况监控和跟踪功能依赖于 Android 3.0 的 Linux 内核 (<code>kernel/net/netfilter/xt_qtaguid</code>) 中的 xt_qtaguid 模块来实现。框架 (<code>system/core/libcutils/qtaguid.c</code>) 中的套接字标记功能的实现主要依赖于从内核模块 <code>xt_qtaguid</code> 中导出到 <code>/proc/net/xt_qtaguid/ctrl</code> 的接口的存在。</p>
<aside class="note"><b>注意</b>:我们将从 Android 9 版本开始分阶段取消对 <code>xt_qtaguid</code> 的支持。有关详情,请参阅 <a href="ebpf-traffic-monitor">eBPF 流量监控</a></aside>
<p><code>quota2</code> netfilter 模块(最初是属于 <code>xtables-addons</code>)为设置具有指定名称的配额限制提供了功能支持;此外,经过扩展后,该模块还可支持在达到特定配额限制时通知用户空间。一旦达到配额限制,<code>quota2</code> 模块将丢弃所有的后续网络流量。框架还可以指定额外的规则来限制应用的后台数据流量(请参阅 <code>com.android.server.NetworkManagementSocketTagger.setKernelCounterSet</code><code>android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND</code>)。</p>
<h1 id="how-does-it-work">工作原理</h1>
<p><code>qtaguid</code> netfilter 模块使用应用的专属 UID,按套接字对每个应用的网络流量进行跟踪。系统中有两个标记组件与套接字相关联。第一个是 UID,用来明确标识进行数据传输的应用(Linux 允许将每个网络套接字的所有权与调用应用的 UID 相关联)。第二个标记组件用于支持附加于流量上的开发者指定的类别描述。应用可使用这些应用级标记,将流量归类到若干子类别。</p>
<p>当应用以服务(如下载管理器、媒体流式传输服务等)的方式传输网络数据时,可通过调用 <code>TrafficStats.setThreadStatsUid()</code> 函数将传输作业的所有权与发出请求的应用的 UID 相关联。调用程序必须具备“<code>android.permission.MODIFY_NETWORK_ACCOUNTING</code>”权限才能重新分配网络流量的所有权。</p>
</body></html>