关于 B 站观看直播使用 P2P 进行传输的研究
最近更新日期:2026 年 5 月 20 日,01:00。
必须注意
此文章可能有时效性,一段时间后可能不会起作用。此文章后续可能还有改动。另外根据自己的网络实际情况,实行相关措施。
如果操作不当,会影响其他正常需要 NAT 打洞的程序或游戏,例如 GTA 在线模式、绝地潜兵,以及 Minecraft 26.x 版本新更新的 P2P 好友联机等,按需设置!
1. 前言
之前我在浏览器或手机端看 B 站直播的时候,我发现网速有点不对劲,上下行近乎对等,甚至出现上传比下载还高的情况,遂使用 Wireshark 进行抓包,发现全是 UDP DTLS 的网络流量,对方 IP 都是家宽类型的,然后怀疑是不是直播用了 P2P 技术。
由于我是想到啥就写啥,所以可能看着有点乱,先凑合看吧。
2. 先分析
简单分析了下,然后,简单来说,你在看 B 站直播的时候,服务器会给你发送直播的画面。
与此同时,你的设备还会被当成服务器,给同样在直播间里的其他用户发送直播视频画面。而且,如果你网络环境好的话,上传给其他用户的概率也就越大。
它是怎么传出去给其他人的?当然是利用了 STUN 和 NAT 打洞。
3. 利与弊
好处就是,对于服务商来说,降低了服务器本身和网络资源占用,还能让服务商减少支出相关的费用。毕竟每年给运营商付的费用也不是个小数目。
坏处是,对用户来说,占用你设备大量的网络资源,和设备本身资源,只要在相同的直播间,都有可能参与 P2P 网络传输,而且直播间里的各个观众网络环境条件也是不一样的,非常容易出现直播缓冲的情况。
再者,鉴于目前三大运营商的跨省流量结算和跨运营商 QoS 的策略,如果上传流量太大(具体多大取决于运营商,完全说不准)很容易被运营商以 PCDN 为由,对你的网络进行限速处理。
4. 屏蔽措施
4.1 域名屏蔽法或 WEBRTC 屏蔽法
4.1.1 电脑
如果你用电脑看,其实很简单,只需要把 STUN 服务器地址屏蔽,就可以了,去 hosts 文件把 B 站的 STUN 服务器的域名,全解析到 0.0.0.0 就行。还有一种方法,是直接关闭 WEBRTC,你可以去浏览器的应用商店搜索 AdGuard,里面提供了关闭 WEBRTC 的选项,但是直接关闭 WEBRTC 过于一刀切了,会影响其他需要 P2P 的用途,除非…你不用。
不太建议使用 PC 版客户端,客户端更容易绕过屏蔽,如果你一定要用客户端,那可以试试用反病毒软件自带的网络监控功能,给客户端限制上传速度,请注意,上传速率设置太低会影响正常使用,限速大概在 30-50 KB 每秒就差不多行了。
4.1.2 手机
手机的话,屏蔽就有点难了,可能需要借助其他网络设备来屏蔽。
但你可以尝试下边的方法,如果你愿意,且有相关技术能力的话..
4.2 基于 Linux 的路由器的 IP 伪装端口随机化
必须注意
此方法可能影响其他正常需要 P2P 网络连接的程序,按需设置
这里只提供 IPTABLES 版命令行,如果你用 NFTABLES 的话,直接写 NFTABLES 版本语法就可以,如果不会,iptables-translate 命令会帮你的忙。
人话:劣化 NAT 等级到对称 NAT,俗称 NAT 4
另外,对于 Natter,作者本人已经在网关设备实测过,在网关设备执行 MASQUERADE RAMDOM 转换时,不会影响运行在网关的 Natter 的端口转发方式为 IPTABLES 的行为,放心使用。
4.2.1 OpenWRT 端口随机化整个局域网
首先命令行,使用 SSH 方式登录,然后使用文本编辑器,nano 或 vim 都可,编辑 /usr/share/firewall4/templates/zone-masq.uc 文件,在最后一行,找到 masquerade comment,在两个单词中间,添加 random,保存即可。
如果使用的是 ImmortalWRT 或者是其他第三方编译的版本,自行找到相关选项,并取消勾选。有的叫 Fullcone NAT,有的叫全锥型 NAT。
回到 OpenWRT 的网页 Luci 设置界面,找到【网络】选项中的【防火墙】,重新点击一下“保存并应用”,现在再使用 NAT Type Tester 再看看,测试结果为 Symmetric,且过滤行为和映射行为都应该显示为 AddressAndPortDependent。
4.2.2 OpenWRT 端口随机化其中一台或多台设备
首先,我建议你给要做劣化 NAT 类型的设备,分配一个静态的 IP 地址,然后,去【开机启动脚本】选项里,输入这个命令
1 | |
4.2.3 Padavan 路由器端口随机化
提前使用 ifconfig 命令或其他方法查明出口网卡名称。比如你路由器的出口网卡是 ppp0,那么就..
单个设备或多个设备的话..
1 | |
如果你想应用到整个局域网,比如你的路由器 IP 是 10.0.0.1,子网是 255.255.255.0,那么就这样写:
1 | |
4.2.4 Root 过的安卓手机
但是,一般用手机开热点,而且用的是手机蜂窝网络流量上网,基本上是 NAT 4,但有个别网络不是,所以我仍然提供设置方法。
对于 Android 10 以及之前版本的机器,使用下面的命令行,此命令行包含了 USB 共享网络、无线热点、蓝牙共享网络 PAN 的网段。
1 | |
如果想单独给 USB 网络共享的作用域设置,使用下面的命令行
1 | |
如果想单独给无线热点的作用域设置,使用下面的命令行
1 | |
如果想单独给蓝牙网络共享 PAN 的作用域设置,使用下面的命令行
1 | |
如果是 Android 11 或更高版本的手机,直接使用这条命令行就行
1 | |
4.3 屏蔽 STUN 服务器法
只需要把 stun.chat.bilibili.com 和 stun6.chat.bilibili.com 屏蔽就行。
如果仍然无效可以试试通配符法,比如 stun*chat.bilibili.com 这种。
5. 其他可供参考的资料
https://www.bilibili.com/opus/960552827377156133
https://www.bilibili.com/opus/625913491082488344
https://www.bilibili.com/opus/858956728907071497
6. 结论
因为没有完美的办法,毕竟道高一尺魔高一丈。
文章开头也说明过,可能具有时效性,随着 APP 厂商的更新,会发生变动,所以并不是一直都是有效的。就像抵抗校园网的路由器共享检测(v4 NAT)一样,各种 TTL、DPI、UA、时间戳检测法。
所以,请根据自己当前的网络实际情况,实行相关的措施。
就先这样吧,后续有新想法我再修改修改。如果文章有错误,或者是需要改进的地方,欢迎提出意见!
…你说你的网络本来就是 NAT 4?好吧好吧,直接关掉这个页面就行。