谈谈免流

免流的由来

不知道各位是否还记得曾经被 5 元 30M 支配的恐惧吗?
在大概 10 多年前,那时候的流量非常昂贵,网页也非常简单,大部分都是一些文字信息,
随着时间的推移,互联网在飞速发展,手机上网从文字转变为了以视频和图片为主,网页内容越来越丰富,10M 流量几个图片就用完了,流量需求大幅提升,
但是运营商套餐价格并没有随着需求的提升而降低,一度都是 5 元 30M 的离谱价格,
人们为了(白嫖)推进运营商的技术发展,研究出了免流

什么是免流

“免流”通常是指在移动网络中使用特定的应用或服务而不消耗用户的数据流量,即上网不要钱。
通常由移动运营商或特定的应用提供商推出,旨在吸引更多用户使用这些应用或服务。

免流的基本原理

上述的免流通常局限于某些应用,我们所聊的免流是不限于特定应用的免流,通过特定手段欺骗运营商的计费系统达到免费的目的。
首先我们要了解运营商的计费系统是如何工作的

访问正常网站:

flowchart LR

subgraph 运营商
    direction LR
    A["计费系统

    baidu.com
    计费 1M"]-->B["代理服务器

    baidu.com"]
end

用户--baidu.com-->运营商-->百度服务器

访问免流网站:

flowchart LR

subgraph 运营商
    direction LR
    A["计费系统

    10086.cn
    不计费"]-->B["代理服务器

    10086.cn"]
end

用户--10086.cn-->运营商-->中国移动服务器

免流的核心原理就是让计费系统以为用户在访问免流网站,但实际上却访问了正常网站

flowchart LR

subgraph 运营商
    direction LR
    A["计费系统

    10086.cn
    不计费"]-->B["代理服务器

    baidu.com"]
end

用户--baidu.com-->运营商-->百度服务器

免流的几种方式

本地免流

本地免流是在用户手机上运行一个代理程序对所有数据包进行修改,从而欺骗计费系统

flowchart LR

subgraph 手机
    direction LR
    浏览器--baidu.com-->代理程序
end

subgraph 运营商
    direction LR
    A["计费系统

    10086.cn
    不计费"]-->B["代理服务器

    baidu.com"]
end

手机-->运营商-->百度服务器

代理程序的主要实现方式是对 http 数据包请求头进行修改。

请求头中有两个关键字段 Host 和 X-Online-Host
假设计费系统是通过检测 http 数据包中的 Host 字段进行计费,代理服务器通过 http 数据包中的 X-Online-Host 进行实际数据访问,则可以通过修改 http headers 中的 Host 字段即可达到欺骗计费系统的目的。

运营商也不是傻子,对检测系统进行了更新,上述手段就失效了,后来各大网友开始了和运营商的斗志斗勇

  1. 有插入两个 Host 字段的双 h 模式,让计费系统查看第一个 Host 字段,让代理服务器查看第二个 Host 字段
  2. 也有插入两个 X-Online-Host 的双 x 模式
  3. 伪首模式
  4. 伪彩模式

本地免流优点是不需要额外的资源,在用户本地手机即可实现,主要利用的是运营商计费系统和代理服务器系统的实现差异;缺点是各地运营商的系统差异不一致,在上海能免的模式在广东并不一定通用,并且可利用修改的地方有限,所有模式被封禁后就无法使用了

本地免流最大的问题是因为当时运营商账单具有滞后性,当你之前使用的免流模式被修复后,流量已经开始正常计费,你却全然不知,第二天早上起来发现收到了 10086 的巨额账单

定向免流

2015 开始,国家要求三大运营商提速降费,漫游费逐渐被取消,流量都是全国通用,费用也越来越低,但流量费用还没低到可以任意挥霍的程度。
针对有些人喜欢看抖音,有些人喜欢看腾讯视频,三大运营商纷纷推出了定向流量卡,常见的有腾讯王卡,阿里宝卡等。
定向流量卡是针对某些互联网服务在通用流量之外给予大额的定向流量,比如腾讯王卡允许腾讯系应用免费使用最多 40G 流量。

定向免流就是针对这部分流量卡,将其他网站的流量伪装成特定应用的流量使用实现定向流量,并不是完全的无限流量。
比如使用腾讯王卡时将其他应用如抖音的流量伪装成腾讯系应用的流量

flowchart LR

subgraph 手机
    direction LR
    浏览器--baidu.com-->代理程序
end

subgraph 运营商
    direction LR
    A["计费系统

    qq.com
    定向流量计费1M"]-->B["代理服务器

    baidu.com"]
end

手机-->运营商-->百度服务器

云端免流(云免)

本地免流利用了计费系统和代理服务器之间的差异,后续差异被不断补全(感谢各大网友自费做 QA),甚至后来运营商取消了代理服务器,直接使用计费系统进行互联网访问,本地免流就此绝迹。
后面常用的一般都是云端免流,这是现在的主流免流方式。

云端免流的原理需要一点网络协议的基础知识,了解 tcp/ip 的工作原理

ip

现有互联网是基于 tcp/ip 为架构组成的,计算机之间的通信并不是基于域名而是基于 ip 协议。

ip 协议可以理解为是计算机中的电话号码,比如我们想要联系张三的时候,我们可以通过输入张三的电话号码 123456 拨打电话联系到他

dns

但目前我们访问网站的时候是通过输入域名,为什么计算机之间的通信却基于 ip 协议?他们之间是如何转换的?

这就是 dns 所做的事情。
因为 ip 地址不易于记忆以及输入,所以域名被发明出来简化输入,相当于是电话号码的联系人名称,比如我们通常在电话薄里面保存张三的电话号码为 123456,张三就相当于是域名,123456 是 ip,我们想要联系张三的时候只需要在电话薄里面搜索 ‘张三’,而不是输入 123456

dns 的作用就是查询电话薄,比如我想要访问 google.com 的时候,计算机并不知道应该如何访问到 google.com,所以它需要去向电话薄查询 (dns query) google.com 的电话 (ip)

sequenceDiagram
    participant User
    participant Computer
    participant DNS Server
    participant Google

User->>Computer: User open browser and enter 'google.com'
Computer->> DNS Server: Computer send DNS query to DNS Server
DNS Server-->>Computer: DNS Server response 123456 to Computer
Computer->>Google: Computer send request to Google
Google-->>Computer: Google response to Computer
Computer-->>User: Computer display the response
http

http 协议是普通人最常见的互联网协议,是互联网的基石,我们常见的所有应用几乎都是使用 http 协议进行通信。

http 协议请求结构如下

GET / HTTP/1.1
Host: www.baidu.com

xxxxxxx此处即是http请求内容正文xxxxxxx

在本地免流中,我们采用的是修改 Host 字段绕过计费系统。
在云端免流中,采用的方式其实也类似,区别其实是在于绕过计费系统之后如何访问正确的目标网站?

思路其实很简单,既然本地免流由于运营商的代理服务器和计费系统合并而被彻底修复,那我们如果能够自己实现一个代理服务器不就和之前的方式类似了吗?

flowchart LR

subgraph 运营商
    direction LR
    A["计费系统

    10086.cn
    不计费"]
end

subgraph 云端服务器
    direction LR
    B["baidu.com"]
end

用户--baidu.com-->运营商-->云端服务器-->百度服务器
云免原理

具体是将原始请求封装到 http body 中并发送给代理服务器,代理服务器解析 http body 之后还原原始请求并进行实际请求

upgit_20230808_1691510056.png

sequenceDiagram
    participant User
    participant 运营商
    participant 云端服务器 as 云端服务器(10.10.10.10)
    participant 百度服务器 as 百度服务器(3.3.3.3)

User-->>运营商: 发送一个数据包到 10.10.10.10 并在 http header 中标注这是发给 10086.cn 的数据包
运营商-->>云端服务器: 计为免费并将数据包发送给 10.10.10.10
云端服务器-->>百度服务器: 解开数据包并发送给实际请求地址 3.3.3.3
百度服务器->>云端服务器: 返回内容
云端服务器->>运营商: 返回内容
运营商->>User: 返回内容

直连免流

定向免流还有一种免流方式,不需要云端服务器。
有些定向卡是允许免去某个应用的所有流量而不是某个特定域名的流量,比如腾讯王卡可以免去 qq 浏览器的所有流量,原理是在该应用中内置一个代理服务器,代理服务器产生的流量被运营商计入定向流量。

直连免流就是通过抓包获取应用内置的代理服务器并将其用于所有应用访问。

不过因为现在代理服务器都增加了动态验证,基本都失效了。

停机免流

电信会在用户停机之后给用户开通一个花费充值的绿色通道,这样即使你停机之后仍然能够通过访问网络缴存话费。所以和定向免流类似,停机免流的实现原理也是通过将 Host 改为绿通的网址就能实现免流了。

对于停机用户来说,每个月只需要缴纳停机保号费用(通常5元)即可实现无限流量。不过电信随即采取了相应的策略,大部分地区对停机用户的上网速度施加了限制,毕竟你充个话费要那么快干嘛。

免流的局限性

因为运营商的计费系统如何工作其实是一个黑盒,外界很难得知什么时候工作机制就发生了变化,比如除了检查 host 字段,计费系统也可以检查端口。互联网的流量通常使用的都是 80/443,所以云端服务器的端口通常必须使用 80/443。

另一个缺点是为了实现免流必须使用全局代理,也就是不管国内还是国外流量均需通过云端服务器进行代理,如果云端服务器在国外,那么访问国内的服务会变得很慢,并且有些服务只能是国内 ip 才能使用;如果云端服务器在国内,那还需要一台额外的国外节点进行翻墙代理,以及国内服务器商宽其实非常昂贵,一年花销可能需要好几千,买服务器的钱可能比你免的流量贵的多得多。