分类 网络 下的文章

访问一个网站时,我们通常只关注 HTTPS 是否安全,却很容易忽略另一个问题:

在建立 HTTPS 连接之前,DNS 查询本身可能还是明文的。

例如访问:

https://www.example.com

浏览器首先需要知道 www.example.com 对应的 IP 地址,因此会发起 DNS 查询。

传统 DNS 通常使用 UDP 53 端口:

电脑
  │
  │ DNS Query
  │ www.example.com
  │ UDP/53
  ▼
DNS Server

这个查询默认没有加密。

这意味着本地网络、路由器、运营商以及网络路径中的相关设备,都有机会直接看到:

www.example.com
github.com
google.com
api.example.com

加密 DNS 的目的,就是解决这个问题。


1. DNS 是什么

DNS,全称:

Domain Name System

主要负责将域名转换成 IP 地址。

例如:

www.example.com
        │
        ▼
DNS 查询
        │
        ▼
93.184.216.34

浏览器拿到 IP 以后,才能继续建立 TCP、QUIC、TLS 等连接。

完整过程大致为:

输入网址
   │
   ▼
DNS 查询域名
   │
   ▼
获取服务器 IP
   │
   ▼
建立 TCP / QUIC 连接
   │
   ▼
TLS 握手
   │
   ▼
HTTPS 请求
   │
   ▼
服务器返回页面

所以即使最终使用的是 HTTPS:

https://www.example.com

在 HTTPS 连接建立之前,DNS 查询就已经发生了。


2. 为什么传统 DNS 会暴露域名

传统 DNS 一般使用:

UDP 53

部分情况下也会使用:

TCP 53

例如:

192.168.1.100
      │
      │ UDP 53
      │ A www.example.com
      ▼
1.1.1.1

问题在于:

传统 DNS 协议本身没有提供传输层加密。

因此抓取网络数据包,可以直接看到 DNS 请求内容。

例如 Wireshark 中可能看到:

Standard query A www.example.com

甚至可以直接看到:

Domain Name System (query)

Queries
    www.example.com
        Type: A
        Class: IN

也就是说:

电脑
   │
   │ 明文 DNS
   ▼
路由器
   │
   ▼
运营商
   │
   ▼
网络中间设备
   │
   ▼
DNS Server

在这条路径上,有能力观察网络流量的设备都有可能知道:

你正在查询什么域名

3. HTTPS 为什么不能保护 DNS

一个常见误区是:

网站已经使用 HTTPS,为什么 DNS 还是明文?

因为 DNS 通常发生在 HTTPS 之前。

例如:

① DNS 查询
www.example.com -> 93.184.216.34

② TCP / QUIC 建立连接

③ TLS 握手

④ HTTPS 请求
GET /

HTTPS 加密的是:

HTTP 请求内容
Cookie
Header
POST 数据
网页内容

但传统 DNS 查询:

www.example.com

在 TLS 建立之前就已经发出。

因此:

HTTPS

并不能自动保护传统 DNS。


4. 中间网络设备能够看到什么

假设使用传统 DNS:

客户端
   │
   │ UDP/53
   │ www.example.com
   ▼
DNS Server

网络中间设备可以直接读取:

查询域名:www.example.com
查询类型:A
DNS Server 地址
客户端 IP

例如运营商侧观察到:

10:00:01 -> DNS 查询 github.com
10:00:10 -> DNS 查询 youtube.com
10:02:32 -> DNS 查询 example.com

虽然这并不等同于看到了 HTTPS 中传输的具体内容,但域名本身已经能够暴露不少访问行为。


5. 如何验证 DNS 是不是明文的

可以直接使用 Wireshark 抓包。

选择网卡

选择当前真正联网的网卡,例如:

Wi-Fi
Ethernet
en0
en7

macOS 可以执行:

route get default

查看:

interface: en0

Wireshark 过滤 DNS

使用:

dns

或者:

udp.port == 53

如果同时希望检查 TCP DNS:

udp.port == 53 || tcp.port == 53

然后访问网站,例如:

https://www.wikipedia.org

如果看到:

Standard query A www.wikipedia.org

说明这个 DNS 查询是明文的。


6. 使用 dig 主动生成 DNS 请求

为了避免浏览器缓存、系统缓存等影响,可以直接使用 dig

例如:

dig @1.1.1.1 www.example.com

此时 Wireshark 可以看到:

你的电脑
    │
    │ UDP 53
    ▼
1.1.1.1

对应请求:

Standard query A www.example.com

响应:

Standard query response
A www.example.com
A 93.184.216.34

这是一种非常直观的传统 DNS 明文测试方法。


7. 什么是加密 DNS

加密 DNS 的目标是:

对客户端到 DNS Server 之间的 DNS 查询进行加密。

目前比较常见的协议有:

协议全称常用端口底层协议
DNSDomain Name System53UDP / TCP
DoTDNS over TLS853TLS
DoHDNS over HTTPS443HTTPS
DoQDNS over QUIC853QUIC

传统 DNS:

客户端
   │
   │ UDP 53
   │ www.example.com
   ▼
DNS Server

加密 DNS:

客户端
   │
   │ TLS / HTTPS / QUIC
   │ 加密数据
   ▼
DNS Server

这样网络中间设备只能看到:

客户端正在连接某个 DNS Server

无法直接读取其中的:

www.example.com

8. DoH:DNS over HTTPS

DoH 是目前非常常见的加密 DNS 方案。

它将 DNS 查询放进 HTTPS 请求中:

DNS Query
   │
   ▼
HTTPS
   │
   ▼
TLS
   │
   ▼
TCP 443

网络结构:

客户端
   │
   │ HTTPS :443
   ▼
DoH Server

例如常见 DoH 地址:

https://cloudflare-dns.com/dns-query
https://dns.google/dns-query
https://dns.alidns.com/dns-query

在 Wireshark 中通常只能看到:

TLS Application Data

无法直接看到:

www.example.com

9. DoT:DNS over TLS

DoT 使用 TLS 加密 DNS:

DNS
 │
 ▼
TLS
 │
 ▼
TCP 853

结构:

客户端
   │
   │ TCP 853
   │ TLS
   ▼
DoT Server

传统 DNS 和 DoT 很容易通过端口区分:

53  -> 传统 DNS
853 -> DoT

10. DoQ:DNS over QUIC

DoQ 使用 QUIC 传输 DNS:

DNS
 │
 ▼
QUIC
 │
 ▼
UDP

网络中通常表现为:

UDP 853
QUIC

其中 DNS 内容同样经过加密。


11. DoH、DoT、DoQ 怎么选

日常网络环境可以简单这样选择:

协议兼容性特点
DoH很高使用 HTTPS 443,兼容性最好
DoT独立 TCP 853,协议清晰
DoQ较高使用 QUIC
普通 DNS极高明文

一般情况下推荐:

DoH

原因很简单:

HTTPS
TCP 443
网络兼容性好

如果软件和网络环境支持,也可以考虑:

DoQ

12. 如何配置加密 DNS

具体方式取决于操作系统和软件。

通常需要配置一个 DoH Server,例如:

https://dns.alidns.com/dns-query

或者:

https://cloudflare-dns.com/dns-query

核心结构应该变成:

应用
   │
   ▼
系统 DNS Resolver
   │
   ▼
DoH
   │
   │ HTTPS 443
   ▼
DNS Server

而不是:

应用
   │
   ▼
系统 Resolver
   │
   │ UDP 53
   ▼
DNS Server

13. 如何验证加密 DNS 是否生效

配置完成以后,重新使用 Wireshark 抓包。

首先过滤传统 DNS:

udp.port == 53 || tcp.port == 53

然后访问几个新的域名,例如:

www.wikipedia.org
www.cloudflare.com
github.com

如果加密 DNS 工作正常,不应该在传统 DNS 包中看到这些域名。

例如不应该看到:

Standard query A github.com

而应该看到类似:

客户端 -> DNS Server

TCP 443
TLS
Application Data

如果使用 DoQ,则可能看到:

UDP 853
QUIC

但无法直接读取:

github.com

14. 如何验证得更准确

测试时建议避免 DNS 缓存影响。

可以选择之前没有访问过的域名,或者使用随机子域名,例如:

test-123456.example.com

因为如果域名已经存在系统 DNS Cache:

应用
   │
   ▼
系统缓存
   │
   ▼
直接返回 IP

此时根本不会产生 DNS 网络请求。

所以:

抓不到 DNS

并不一定代表使用了加密 DNS,也可能只是:

DNS 缓存命中

15. 加密 DNS 能保护什么

使用 DoH、DoT、DoQ 后,主要保护的是:

DNS Query
DNS Response

例如:

www.example.com

不会再以明文形式出现在:

客户端
    ↓
路由器
    ↓
运营商
    ↓
DNS Server

这条路径中。

因此中间网络设备无法直接通过 DNS 数据包知道:

你正在解析哪个域名

16. 加密 DNS 不能保护什么

需要特别注意:

加密 DNS 不等于匿名上网,也不等于隐藏所有访问行为。

即使 DNS 已经加密,中间网络设备仍然可以看到:

你的 IP 地址
目标服务器 IP
连接端口
数据包大小
连接时间
流量特征

例如:

192.168.1.100
      │
      │ HTTPS
      ▼
142.x.x.x:443

虽然无法通过 DNS 包直接看到:

www.example.com

但目标服务器 IP 仍然是可见的。


17. TLS SNI 也可能暴露域名

DNS 加密之后,还有另外一个可能暴露域名的位置:

TLS SNI

传统 TLS 握手中,客户端可能发送:

Server Name: www.example.com

因此会出现:

DNS
 │
 │ DoH
 │ 已加密
 ▼

TLS ClientHello
 │
 │ SNI: www.example.com
 ▼
服务器

目前 TLS 中还有:

ECH
Encrypted Client Hello

用于进一步保护这部分信息。

因此真正完整的访问隐私问题,需要分别考虑:

DNS
TLS SNI
目标 IP
流量特征

加密 DNS 只解决其中:

DNS 查询隐私

这一部分。


18. DNS Server 本身仍然能看到查询

使用 DoH:

客户端
   │
   │ 加密
   ▼
DNS Server

加密发生在:

客户端 <-> DNS Server

之间。

DNS Server 收到请求后仍然需要知道:

www.example.com

才能完成解析。

因此:

局域网设备
路由器
运营商
中间网络设备

通常无法直接读取 DNS 查询内容。

但:

DNS Server

本身依然能够知道你查询了什么域名。

所以选择可信的 DNS 服务商仍然很重要。


19. 明文 DNS、加密 DNS 和匿名访问的区别

明文 DNS

客户端
   │
   │ www.example.com
   ▼
DNS Server

中间设备可以读取域名。

加密 DNS

客户端
   │
   │ ************
   ▼
DNS Server

中间设备无法直接读取 DNS 内容。

DNS Server 能看到查询内容。

VPN / 代理

如果目标是隐藏更多网络路径信息,则需要考虑:

VPN
Proxy
Encrypted Tunnel

例如:

客户端
   │
   │ 加密隧道
   ▼
VPN Server
   │
   ▼
互联网

此时本地 ISP 看到的主要是:

客户端 <-> VPN Server

而不是所有最终目标服务器连接。

因此:

加密 DNS ≠ VPN

它们解决的是不同问题。


20. 最终网络结构对比

普通 DNS

                        可以读取 DNS
                             ↓
客户端 ─── 路由器 ─── ISP ─── 网络 ─── DNS Server
   │
   └── UDP 53
       www.example.com

加密 DNS

客户端 ─── 路由器 ─── ISP ─── 网络 ─── DNS Server
   │                                      │
   │       TLS / HTTPS / QUIC             │
   └──────── 加密 DNS ────────────────────┘

中间设备:
只能看到加密连接

DNS Server:
可以看到 www.example.com

21. 推荐的验证流程

第一步:抓传统 DNS

Wireshark:

udp.port == 53 || tcp.port == 53

访问几个新的域名。

如果能看到:

Standard query A www.example.com

说明存在明文 DNS。

第二步:开启 DoH / DoT / DoQ

配置加密 DNS。

例如:

DoH
https://dns.alidns.com/dns-query

第三步:重新抓包

再次访问新的域名。

如果传统 DNS 包中不再出现:

www.example.com

而只看到:

TLS
HTTPS
QUIC

说明 DNS 查询已经被加密。

第四步:检查目标 DNS Server

还需要确认:

这些加密 DNS 请求最终连接的是不是自己配置的 DNS Server

避免虽然使用了加密 DNS,但实际连接的 DNS 服务商与预期不一致。


总结

传统 DNS 最大的问题是:

DNS 查询默认可以明文传输

例如:

www.example.com

可能直接出现在 UDP 53 数据包中。

因此:

局域网
路由器
运营商
其他网络中间设备

都有可能看到这些域名查询。

使用:

DoH
DoT
DoQ

以后,可以将:

客户端 <-> DNS Server

之间的 DNS 查询进行加密。

网络模型由:

客户端
   │
   │ UDP 53
   │ www.example.com
   ▼
DNS Server

变成:

客户端
   │
   │ TLS / HTTPS / QUIC
   │ ***************
   ▼
DNS Server

此时中间网络设备无法直接读取 DNS 查询内容。

但需要明确:

加密 DNS 保护的是 DNS 查询本身的隐私,并不能隐藏完整的网络访问行为。

即使开启了加密 DNS:

目标 IP
连接时间
流量大小
部分 TLS 元数据

仍然可能暴露。

因此从网络隐私角度,可以把几个问题分开理解:

DNS 查询隐私
    ↓
DoH / DoT / DoQ

TLS 域名隐私
    ↓
ECH

网络路径隐私
    ↓
VPN / Proxy / Tunnel

而加密 DNS 解决的,就是其中最基础的一环:

防止 DNS 查询域名以明文形式暴露在网络传输路径中。

iperf3 是常用的网络性能测试工具,可以测试:

  • TCP 带宽
  • UDP 带宽
  • 丢包率
  • 抖动
  • 多连接并发
  • 双向网络性能

典型使用场景:

客户端  <======== 网络 ========>  服务端
             iperf3

1. 安装 iperf3

Ubuntu / Debian

apt update
apt install -y iperf3

CentOS / Rocky Linux

dnf install -y iperf3

macOS

brew install iperf3

检查版本:

iperf3 --version

2. 启动服务端

在服务端执行:

iperf3 -s

默认监听:

TCP 5201

指定端口:

iperf3 -s -p 5202

后台运行:

iperf3 -s -D

如果有防火墙,需要开放端口:

ufw allow 5201/tcp

UDP 测试同样需要开放:

ufw allow 5201/udp

3. TCP 基础测试

客户端执行:

iperf3 -c 192.168.1.100

默认测试:

客户端 -> 服务端

持续 10 秒。

指定测试时间:

iperf3 -c 192.168.1.100 -t 30

每秒输出一次:

iperf3 -c 192.168.1.100 -i 1

4. 测试反向带宽

默认方向:

Client -> Server

增加:

-R

测试:

Server -> Client

例如:

iperf3 -c 192.168.1.100 -R

测试公网服务器时,建议正向和反向都跑一次:

iperf3 -c 1.2.3.4
iperf3 -c 1.2.3.4 -R

这样可以分别观察上传和下载能力。


5. 多线程测试

单连接可能无法跑满高带宽链路。

例如使用 4 个并发连接:

iperf3 -c 192.168.1.100 -P 4

8 个连接:

iperf3 -c 192.168.1.100 -P 8

常见测试方式:

iperf3 -c 192.168.1.100 -P 4 -t 30

适合测试:

  • 千兆网络
  • 跨公网链路
  • 高延迟网络
  • 单 TCP 流无法跑满的场景

6. UDP 测试

使用:

-u

开启 UDP 测试。

例如测试 100 Mbps:

iperf3 -c 192.168.1.100 \
  -u \
  -b 100M

测试 500 Mbps:

iperf3 -c 192.168.1.100 \
  -u \
  -b 500M \
  -t 30

UDP 重点关注:

Bitrate
Jitter
Lost/Total Datagrams

例如:

0.00-10.00 sec  119 MBytes  100 Mbits/sec
0.120 ms
15/85000 (0.018%)

主要指标:

指标含义
Bitrate实际吞吐
Jitter网络抖动
LostUDP 丢包
Lost %丢包率

实时音视频业务尤其需要关注:

丢包率 + Jitter

7. 测试不同 UDP 带宽

可以逐步增加:

iperf3 -c 192.168.1.100 -u -b 10M
iperf3 -c 192.168.1.100 -u -b 50M
iperf3 -c 192.168.1.100 -u -b 100M
iperf3 -c 192.168.1.100 -u -b 500M
iperf3 -c 192.168.1.100 -u -b 1G

观察什么时候开始明显出现:

丢包
Jitter 增加
实际吞吐下降

可以大致判断链路的稳定承载能力。


8. 指定客户端网卡/IP

服务器有多块网卡时,可以指定源 IP:

iperf3 -c 192.168.1.100 \
  -B 192.168.2.10

适合测试:

eth0
eth1
内网
公网
专线
VPN

分别对应的网络性能。


9. 指定端口

服务端:

iperf3 -s -p 6000

客户端:

iperf3 -c 192.168.1.100 -p 6000

10. JSON 输出

方便脚本采集:

iperf3 -c 192.168.1.100 -J

保存到文件:

iperf3 -c 192.168.1.100 -J > iperf.json

适合:

  • 自动化监控
  • 网络巡检
  • Prometheus 数据采集
  • CI 网络性能测试

11. 常用测试组合

TCP 单连接

iperf3 -c 192.168.1.100 -t 30

TCP 反向

iperf3 -c 192.168.1.100 -R -t 30

TCP 4 并发

iperf3 -c 192.168.1.100 -P 4 -t 30

TCP 8 并发

iperf3 -c 192.168.1.100 -P 8 -t 30

UDP 100M

iperf3 -c 192.168.1.100 -u -b 100M -t 30

UDP 500M

iperf3 -c 192.168.1.100 -u -b 500M -t 30

12. 推荐测试流程

测试一条网络链路时,可以依次执行:

# TCP 上传
iperf3 -c 192.168.1.100 -P 4 -t 30

# TCP 下载
iperf3 -c 192.168.1.100 -P 4 -R -t 30

# UDP 100M
iperf3 -c 192.168.1.100 -u -b 100M -t 30

# UDP 500M
iperf3 -c 192.168.1.100 -u -b 500M -t 30

重点观察:

TCP:
- Bandwidth
- Retr
- 上传/下载差异

UDP:
- Bitrate
- Jitter
- Packet Loss

13. TCP Retr 是什么

TCP 测试中经常看到:

Retr

表示:

TCP Retransmissions
TCP 重传次数

例如:

[SUM] 0.00-10.00 sec 1.08 GBytes 928 Mbits/sec 82 sender

其中:

82

表示发生了 82 次重传。

如果重传很多,可能存在:

  • 网络丢包
  • 链路拥塞
  • 网卡错误
  • MTU 问题
  • Wi-Fi 干扰
  • 中间设备性能不足

正常情况下:

Retr 越少越好

14. 注意事项

iperf3 测的是网络,不是磁盘

iperf3 数据主要在内存中生成:

Memory -> Network -> Memory

因此结果基本不受磁盘性能影响。

单线程跑不满不代表网络有问题

例如万兆网络:

iperf3 -c server

可能只能跑:

3~5 Gbps

但:

iperf3 -c server -P 8

可能可以达到:

9+ Gbps

需要结合:

RTT
TCP Window
CPU
单流性能

综合判断。

公网测试结果不等于运营商标称带宽

公网链路中还存在:

ISP
路由路径
跨网
跨省
跨境
拥塞
QoS

所以 iperf3 测到的是:

两台机器之间当前路径的实际性能

15. 常用参数速查

参数作用
-s服务端模式
-c客户端模式
-p指定端口
-t测试时间
-i输出间隔
-P并发连接数
-R反向测试
-uUDP 模式
-bUDP 发送带宽
-B指定源 IP
-JJSON 输出
-D服务端后台运行

总结

日常测试网络性能,最常用的几个命令基本就是:

# TCP 上传
iperf3 -c SERVER -P 4

# TCP 下载
iperf3 -c SERVER -P 4 -R

# UDP
iperf3 -c SERVER -u -b 100M

# 长时间测试
iperf3 -c SERVER -P 4 -t 60

如果主要排查直播、音视频、VPN、跨公网链路,除了带宽,还要重点关注:

TCP Retr
UDP Packet Loss
UDP Jitter
上传与下载差异

适用场景

适用于:

  • Shadowsocks / Trojan 等 TCP 代理
  • 跨境网络
  • 高 RTT 链路
  • 长距离 TCP
  • 高带宽、大文件传输
  • 多 TCP Flow 代理服务器

推荐组合:

net.ipv4.tcp_fastopen = 3
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

三者作用不同:

TCP Fast Open
→ 减少 TCP 建连和首包延迟

BBR
→ 优化 TCP 拥塞控制,提高高 RTT 链路利用率

fq
→ Flow Queueing + Packet Pacing

TCP Fast Open

原理

普通 TCP:

SYN
↓
SYN/ACK
↓
ACK
↓
DATA

TFO 在满足条件时允许:

SYN + DATA
↓
SYN/ACK
↓
ACK

主要优化:

  • 建连延迟
  • 首包延迟
  • 大量短连接

对长时间稳定传输的最终吞吐影响通常较小。

适用场景

收益较明显:

高 RTT
大量短连接
频繁建立 TCP
HTTP / API
代理请求

收益较低:

低 RTT
长连接
大文件已经进入稳态传输

含义

net.ipv4.tcp_fastopen = 3

含义:

1 = Client
2 = Server
3 = Client + Server

代理服务器通常同时存在入站和出站 TCP,所以使用 3

BBR

原理

BBR 是 Linux TCP 拥塞控制算法,主要根据:

Bottleneck Bandwidth
+
RTT
+
Delivery Rate

估计链路容量,并控制:

cwnd
pacing_rate
发送节奏

相比主要依赖丢包反馈的传统算法,BBR 更适合:

  • 高 RTT
  • 高带宽
  • 长距离 TCP
  • 存在轻微随机丢包的网络

为什么高 RTT 更有价值

例如:

带宽 = 1 Gbps
RTT = 50 ms

BDP:

1 Gbps × 0.05s
≈ 6.25 MB

意味着链路上必须维持足够多的 In-flight Data 才能跑满。

高 RTT 环境下,如果拥塞窗口增长不足或丢包后下降过多,就容易出现:

线路 1 Gbps
实际单 TCP 只有 200 ~ 500 Mbps

BBR 的价值主要就在这里。


BBR 对代理服务器的作用

Shadowsocks / Trojan TCP 可以简化为:

Client
  ↓
TCP Connection 1
  ↓
Proxy Server
  ↓
TCP Connection 2
  ↓
Target

这其实是两段独立 TCP。

服务器上的 BBR:

只控制服务器自己发送出去的 TCP

因此通常对:

Server → Client

也就是下载方向,更容易观察到改善。

BBR 不优化 UDP

Linux:

net.ipv4.tcp_congestion_control = bbr

只作用于:

TCP

不会直接优化:

UDP
QUIC
HTTP/3
Shadowsocks UDP Relay

如果 UDP / QUIC 性能差,应重点检查:

丢包
RTT
抖动
MTU
Socket Buffer
线路 QoS
应用层拥塞控制

fq

推荐:

net.core.default_qdisc = fq

主要提供:

Flow Queueing
Packet Pacing
多 Flow 调度

对代理服务器大量 TCP Flow 比较适合。

常用组合:

fq + BBR

TCP 优化配置

检查系统是否支持 BBR

查看当前可用的 TCP 拥塞控制算法:

sysctl net.ipv4.tcp_available_congestion_control

正常情况下应包含:

bbr

例如:

net.ipv4.tcp_available_congestion_control = reno cubic bbr

如果没有 bbr,尝试加载模块:

sudo modprobe tcp_bbr

再次检查:

sysctl net.ipv4.tcp_available_congestion_control

如果仍然没有 bbr,说明当前内核没有提供可用的 BBR,不建议继续配置:

net.ipv4.tcp_congestion_control = bbr

配置 TCP Fast Open + fq + BBR

创建配置文件:

sudo nano /etc/sysctl.d/99-network-tuning.conf

写入:

# TCP Fast Open
net.ipv4.tcp_fastopen = 3

# Queue Discipline
net.core.default_qdisc = fq

# TCP Congestion Control
net.ipv4.tcp_congestion_control = bbr

应用配置:

sudo sysctl --system

验证配置

检查:

sysctl net.ipv4.tcp_fastopen
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
sysctl net.ipv4.tcp_available_congestion_control

期望:

net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq

并且:

net.ipv4.tcp_available_congestion_control

中包含:

bbr

进一步检查真实 TCP Connection:

ss -tin

重点关注:

bbr
rtt
cwnd
retrans
delivery_rate
pacing_rate

其中:

rtt
→ 当前往返延迟

cwnd
→ 拥塞窗口

retrans
→ TCP 重传

delivery_rate
→ 实际交付速率

pacing_rate
→ 当前发送节奏

场景建议

国内低 RTT

例如:

RTT < 10 ms
低丢包
低抖动

建议:

TFO:可以开
BBR:可以开,但收益通常有限

更应该关注:

CPU
NIC
MTU
代理程序
线路带宽

跨境 / 高 RTT

例如:

RTT 30 ~ 150 ms
200 Mbps ~ 1 Gbps+
存在随机丢包或抖动

推荐:

net.ipv4.tcp_fastopen = 3
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

这类场景最值得测试 BBR。

常见问题

Q1:开启 BBR 后一定会更快吗?

不一定。

BBR 无法解决:

运营商限速
线路物理瓶颈
CPU 满载
NIC 上限
目标服务器限速
严重物理丢包

如果 CUBIC 已经接近跑满线路,切换 BBR 可能几乎没有变化。

Q2:TFO 能提高大文件下载速度吗?

通常不会明显提高稳态吞吐。

TFO主要优化:

建连
首包
短连接

大文件稳定传输阶段主要取决于:

BBR / CUBIC
RTT
丢包
TCP Window
线路带宽

Q3:为什么开启 BBR 后 iperf3 没变化?

常见原因:

RTT 很低
线路本来已经跑满
原来的 CUBIC 已经足够
CPU 或带宽已经成为瓶颈

结合:

iperf3
ss -tin

一起判断。

Q4:BBR 对 QUIC 有作用吗?

没有直接作用。

因为:

QUIC
↓
UDP

QUIC 的拥塞控制通常由应用自己实现。

Q5:设置 tcp_fastopen=3 就一定使用 TFO 吗?

不一定。

它只代表:

Linux 内核允许使用 TFO

实际是否生效还取决于:

客户端
服务端应用
TFO Cookie
NAT
防火墙
中间网络

Q6:需要升级到 BBRv3 吗?

一般不需要。

生产环境优先使用:

发行版稳定内核自带 BBR

如果评估 BBRv3,应做完整 A/B 测试,至少比较:

吞吐
平均 RTT
P95 / P99 RTT
重传率
丢包
CPU
SoftIRQ

确认稳定收益后再考虑使用。

最终建议

普通跨境代理服务器可以直接使用:

net.ipv4.tcp_fastopen = 3
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

记住:

TFO
→ 优化建连和首包

BBR
→ 优化 TCP 拥塞控制

fq
→ Flow Queueing + Packet Pacing

iperf3 + ss -tin
→ 验证是否真的有收益